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