1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 
15 package com.android.internal.util;
16 
17 import android.content.Context;
18 import android.content.Intent;
19 import android.net.Uri;
20 import android.os.Build;
21 import android.os.UserHandle;
22 import android.provider.Settings;
23 
24 /**
25  * A class that manages emergency affordances and enables immediate calling to emergency services
26  */
27 public class EmergencyAffordanceManager {
28 
29     public static final boolean ENABLED = true;
30 
31     /**
32      * Global setting override with the number to call with the emergency affordance.
33      * @hide
34      */
35     private static final String EMERGENCY_CALL_NUMBER_SETTING = "emergency_affordance_number";
36 
37     /**
38      * Global setting, whether the emergency affordance should be shown regardless of device state.
39      * The value is a boolean (1 or 0).
40      * @hide
41      */
42     private static final String FORCE_EMERGENCY_AFFORDANCE_SETTING = "force_emergency_affordance";
43 
44     private final Context mContext;
45 
EmergencyAffordanceManager(Context context)46     public EmergencyAffordanceManager(Context context) {
47         mContext = context;
48     }
49 
50     /**
51      * perform an emergency call.
52      */
performEmergencyCall()53     public final void performEmergencyCall() {
54         performEmergencyCall(mContext);
55     }
56 
getPhoneUri(Context context)57     private static Uri getPhoneUri(Context context) {
58         String number = context.getResources().getString(
59                 com.android.internal.R.string.config_emergency_call_number);
60         if (Build.IS_DEBUGGABLE) {
61             String override = Settings.Global.getString(
62                     context.getContentResolver(), EMERGENCY_CALL_NUMBER_SETTING);
63             if (override != null) {
64                 number = override;
65             }
66         }
67         return Uri.fromParts("tel", number, null);
68     }
69 
performEmergencyCall(Context context)70     private static void performEmergencyCall(Context context) {
71         Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY);
72         intent.setData(getPhoneUri(context));
73         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
74         context.startActivityAsUser(intent, UserHandle.CURRENT);
75     }
76 
77     /**
78      * @return whether emergency affordance should be active.
79      */
needsEmergencyAffordance()80     public boolean needsEmergencyAffordance() {
81         if (!ENABLED) {
82             return false;
83         }
84         if (forceShowing()) {
85             return true;
86         }
87         return isEmergencyAffordanceNeeded();
88     }
89 
isEmergencyAffordanceNeeded()90     private boolean isEmergencyAffordanceNeeded() {
91         return Settings.Global.getInt(mContext.getContentResolver(),
92                 Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, 0) != 0;
93     }
94 
95 
forceShowing()96     private boolean forceShowing() {
97         return Settings.Global.getInt(mContext.getContentResolver(),
98                 FORCE_EMERGENCY_AFFORDANCE_SETTING, 0) != 0;
99     }
100 }
101