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