1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.emergency;
18 
19 import static com.android.settingslib.emergencynumber.EmergencyNumberUtils.EMERGENCY_NUMBER_OVERRIDE_AUTHORITY;
20 
21 import android.content.Context;
22 import android.database.ContentObserver;
23 import android.os.Handler;
24 import android.os.Looper;
25 import android.telephony.PhoneNumberUtils;
26 import android.text.Spannable;
27 
28 import androidx.annotation.VisibleForTesting;
29 import androidx.preference.Preference;
30 import androidx.preference.PreferenceScreen;
31 
32 import com.android.settings.R;
33 import com.android.settings.core.BasePreferenceController;
34 import com.android.settingslib.core.lifecycle.LifecycleObserver;
35 import com.android.settingslib.core.lifecycle.events.OnStart;
36 import com.android.settingslib.core.lifecycle.events.OnStop;
37 import com.android.settingslib.emergencynumber.EmergencyNumberUtils;
38 
39 /**
40  * Preference controller for emergency gesture number override.
41  */
42 public class EmergencyGestureNumberOverridePreferenceController extends BasePreferenceController
43         implements LifecycleObserver, OnStart, OnStop {
44 
45     @VisibleForTesting
46     EmergencyNumberUtils mEmergencyNumberUtils;
47     private final Handler mHandler;
48     private final ContentObserver mSettingsObserver;
49     private Preference mPreference;
50 
EmergencyGestureNumberOverridePreferenceController(Context context, String preferenceKey)51     public EmergencyGestureNumberOverridePreferenceController(Context context,
52             String preferenceKey) {
53         super(context, preferenceKey);
54         mEmergencyNumberUtils = new EmergencyNumberUtils(context);
55         mHandler = new Handler(Looper.getMainLooper());
56         mSettingsObserver = new EmergencyGestureNumberOverrideSettingsObserver(mHandler);
57     }
58 
59     @Override
getAvailabilityStatus()60     public int getAvailabilityStatus() {
61         return mContext.getResources()
62                 .getBoolean(R.bool.config_show_emergency_gesture_settings) ? AVAILABLE
63                 : UNSUPPORTED_ON_DEVICE;
64     }
65 
66     @Override
displayPreference(PreferenceScreen screen)67     public void displayPreference(PreferenceScreen screen) {
68         super.displayPreference(screen);
69 
70         mPreference = screen.findPreference(getPreferenceKey());
71     }
72 
73     @Override
getSummary()74     public CharSequence getSummary() {
75         String number = mEmergencyNumberUtils.getPoliceNumber();
76         String summary = mContext.getString(R.string.emergency_gesture_call_for_help_summary,
77                 number);
78         int numberStartIndex = summary.indexOf(number);
79         if (numberStartIndex < 0) {
80             return summary;
81         }
82         Spannable summarySpan = Spannable.Factory.getInstance().newSpannable(summary);
83         PhoneNumberUtils.addTtsSpan(summarySpan, numberStartIndex,
84                 numberStartIndex + number.length());
85         return summarySpan;
86     }
87 
88     @Override
onStart()89     public void onStart() {
90         mContext.getContentResolver().registerContentObserver(EMERGENCY_NUMBER_OVERRIDE_AUTHORITY,
91                 false, mSettingsObserver);
92     }
93 
94     @Override
onStop()95     public void onStop() {
96         mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
97     }
98 
99     private class EmergencyGestureNumberOverrideSettingsObserver extends ContentObserver {
EmergencyGestureNumberOverrideSettingsObserver(Handler h)100         EmergencyGestureNumberOverrideSettingsObserver(Handler h) {
101             super(h);
102         }
103 
104         @Override
onChange(boolean selfChange)105         public void onChange(boolean selfChange) {
106             if (mPreference != null) {
107                 updateState(mPreference);
108             }
109         }
110     }
111 }
112