1 /*
2  * Copyright (C) 2014 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.phone.settings;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.os.PersistableBundle;
22 import android.os.UserHandle;
23 import android.preference.ListPreference;
24 import android.preference.Preference;
25 import android.provider.Settings;
26 import android.provider.Settings.Secure;
27 import android.telecom.TelecomManager;
28 import android.telephony.CarrierConfigManager;
29 import android.telephony.SubscriptionManager;
30 import android.util.AttributeSet;
31 import android.util.Log;
32 
33 import com.android.phone.PhoneGlobals;
34 import com.android.phone.R;
35 
36 import java.util.Arrays;
37 
38 public class TtyModeListPreference extends ListPreference
39         implements Preference.OnPreferenceChangeListener {
40     private static final String LOG_TAG = TtyModeListPreference.class.getSimpleName();
41     private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
42 
TtyModeListPreference(Context context, AttributeSet attrs)43     public TtyModeListPreference(Context context, AttributeSet attrs) {
44         super(context, attrs);
45     }
46 
init()47     public void init() {
48         setOnPreferenceChangeListener(this);
49 
50         int settingsTtyMode = Settings.Secure.getInt(getContext().getContentResolver(),
51                 Settings.Secure.PREFERRED_TTY_MODE,
52                 TelecomManager.TTY_MODE_OFF);
53         if (shouldHideHcoAndVco()) {
54             setEntries(Arrays.copyOfRange(
55                     getContext().getResources().getTextArray(R.array.tty_mode_entries), 0, 2));
56             setEntryValues(Arrays.copyOfRange(
57                     getContext().getResources().getTextArray(R.array.tty_mode_values), 0, 2));
58             if (settingsTtyMode == TelecomManager.TTY_MODE_HCO
59                     || settingsTtyMode == TelecomManager.TTY_MODE_VCO) {
60                 // If the persisted setting is HCO or VCO, set it to full here
61                 settingsTtyMode = TelecomManager.TTY_MODE_FULL;
62                 Settings.Secure.putInt(getContext().getContentResolver(), Secure.PREFERRED_TTY_MODE,
63                         settingsTtyMode);
64             }
65         }
66         setValue(Integer.toString(settingsTtyMode));
67         updatePreferredTtyModeSummary(settingsTtyMode);
68     }
69 
70     @Override
onPreferenceChange(Preference preference, Object objValue)71     public boolean onPreferenceChange(Preference preference, Object objValue) {
72         if (preference == this) {
73             int buttonTtyMode = Integer.parseInt((String) objValue);
74             int settingsTtyMode = android.provider.Settings.Secure.getInt(
75                     getContext().getContentResolver(),
76                     Settings.Secure.PREFERRED_TTY_MODE,
77                     TelecomManager.TTY_MODE_OFF);
78             if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
79                     Integer.toString(buttonTtyMode));
80 
81             if (buttonTtyMode != settingsTtyMode) {
82                 switch(buttonTtyMode) {
83                     case TelecomManager.TTY_MODE_OFF:
84                     case TelecomManager.TTY_MODE_FULL:
85                     case TelecomManager.TTY_MODE_HCO:
86                     case TelecomManager.TTY_MODE_VCO:
87                         Settings.Secure.putInt(
88                                 getContext().getContentResolver(),
89                                 Settings.Secure.PREFERRED_TTY_MODE,
90                                 buttonTtyMode);
91                         break;
92                     default:
93                         buttonTtyMode = TelecomManager.TTY_MODE_OFF;
94                 }
95 
96                 setValue(Integer.toString(buttonTtyMode));
97                 updatePreferredTtyModeSummary(buttonTtyMode);
98                 Intent ttyModeChanged =
99                         new Intent(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
100                 ttyModeChanged.putExtra(TelecomManager.EXTRA_TTY_PREFERRED_MODE, buttonTtyMode);
101                 getContext().sendBroadcastAsUser(ttyModeChanged, UserHandle.ALL);
102             }
103         }
104         return true;
105     }
106 
updatePreferredTtyModeSummary(int TtyMode)107     private void updatePreferredTtyModeSummary(int TtyMode) {
108         String [] txts = getContext().getResources().getStringArray(R.array.tty_mode_entries);
109         switch(TtyMode) {
110             case TelecomManager.TTY_MODE_OFF:
111             case TelecomManager.TTY_MODE_HCO:
112             case TelecomManager.TTY_MODE_VCO:
113             case TelecomManager.TTY_MODE_FULL:
114                 setSummary(txts[TtyMode]);
115                 break;
116             default:
117                 setEnabled(false);
118                 setSummary(txts[TelecomManager.TTY_MODE_OFF]);
119                 break;
120         }
121     }
122 
shouldHideHcoAndVco()123     private boolean shouldHideHcoAndVco() {
124         CarrierConfigManager carrierConfigManager =
125                 getContext().getSystemService(CarrierConfigManager.class);
126         PersistableBundle config = carrierConfigManager.getConfigForSubId(
127                 SubscriptionManager.getDefaultVoiceSubscriptionId());
128         boolean carrierShouldHideHcoVco = config != null && config.getBoolean(
129                 CarrierConfigManager.KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL, false);
130         boolean isRttSupported = PhoneGlobals.getInstance().phoneMgr.isRttSupported(
131                 SubscriptionManager.getDefaultVoiceSubscriptionId());
132         return carrierShouldHideHcoVco && isRttSupported;
133     }
134 
log(String msg)135     private static void log(String msg) {
136         Log.d(LOG_TAG, msg);
137     }
138 }
139