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