1705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek/* 2361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * Copyright (C) 2017 The Android Open Source Project 3705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * 4361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * except in compliance with the License. You may obtain a copy of the License at 6705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * 7705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * http://www.apache.org/licenses/LICENSE-2.0 8705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * 9361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 10361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * KIND, either express or implied. See the License for the specific language governing 12361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * permissions and limitations under the License. 13705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 14705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 15361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monkpackage com.android.internal.util; 16705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 17705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.content.Context; 18705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.content.Intent; 19705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.net.Uri; 20705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.os.Build; 210294f9e39b3d226dd1f5fc8bedb4692bbc9ef188Selim Cinekimport android.os.UserHandle; 22705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.provider.Settings; 23705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 24705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek/** 25705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * A class that manages emergency affordances and enables immediate calling to emergency services 26705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 27705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekpublic class EmergencyAffordanceManager { 28705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 29705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek public static final boolean ENABLED = true; 30705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 31705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek /** 32705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * Global setting override with the number to call with the emergency affordance. 33705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * @hide 34705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 35705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private static final String EMERGENCY_CALL_NUMBER_SETTING = "emergency_affordance_number"; 36705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 37705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek /** 38705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * Global setting, whether the emergency affordance should be shown regardless of device state. 39705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * The value is a boolean (1 or 0). 40705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * @hide 41705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 42705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private static final String FORCE_EMERGENCY_AFFORDANCE_SETTING = "force_emergency_affordance"; 43705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 44705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private final Context mContext; 45705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 46705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek public EmergencyAffordanceManager(Context context) { 47705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek mContext = context; 48705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 49705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 50705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek /** 51705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * perform an emergency call. 52705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 53705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek public final void performEmergencyCall() { 54705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek performEmergencyCall(mContext); 55705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 56705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 57705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private static Uri getPhoneUri(Context context) { 58705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek String number = context.getResources().getString( 59705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek com.android.internal.R.string.config_emergency_call_number); 60705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek if (Build.IS_DEBUGGABLE) { 61705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek String override = Settings.Global.getString( 62705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek context.getContentResolver(), EMERGENCY_CALL_NUMBER_SETTING); 63705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek if (override != null) { 64705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek number = override; 65705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 66705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 67705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return Uri.fromParts("tel", number, null); 68705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 69705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 70705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private static void performEmergencyCall(Context context) { 71705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY); 72705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek intent.setData(getPhoneUri(context)); 73705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 740294f9e39b3d226dd1f5fc8bedb4692bbc9ef188Selim Cinek context.startActivityAsUser(intent, UserHandle.CURRENT); 75705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 76705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 77705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek /** 78705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek * @return whether emergency affordance should be active. 79705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek */ 80705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek public boolean needsEmergencyAffordance() { 81705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek if (!ENABLED) { 82705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return false; 83705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 84705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek if (forceShowing()) { 85705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return true; 86705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 87705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return isEmergencyAffordanceNeeded(); 88705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 89705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 90705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private boolean isEmergencyAffordanceNeeded() { 91705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return Settings.Global.getInt(mContext.getContentResolver(), 92705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, 0) != 0; 93705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 94705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 95705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek 96705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek private boolean forceShowing() { 97705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek return Settings.Global.getInt(mContext.getContentResolver(), 98705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek FORCE_EMERGENCY_AFFORDANCE_SETTING, 0) != 0; 99705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek } 100705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek} 101