1/*
2 * Copyright (C) 2015 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
17package com.android.phone.settings;
18
19import android.content.Context;
20import android.media.AudioManager;
21import android.os.Bundle;
22import android.preference.CheckBoxPreference;
23import android.preference.Preference;
24import android.preference.PreferenceFragment;
25import android.preference.PreferenceScreen;
26import android.provider.Settings;
27import android.telephony.CarrierConfigManager;
28import android.telephony.PhoneStateListener;
29import android.telephony.TelephonyManager;
30import android.util.Log;
31
32import com.android.ims.ImsManager;
33import com.android.internal.telephony.Phone;
34import com.android.internal.telephony.PhoneFactory;
35import com.android.phone.PhoneGlobals;
36import com.android.phone.R;
37
38public class AccessibilitySettingsFragment extends PreferenceFragment {
39    private static final String LOG_TAG = AccessibilitySettingsFragment.class.getSimpleName();
40    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
41
42    private static final String BUTTON_TTY_KEY = "button_tty_mode_key";
43    private static final String BUTTON_HAC_KEY = "button_hac_key";
44
45    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
46        /**
47         * Disable the TTY setting when in/out of a call (and if carrier doesn't
48         * support VoLTE with TTY).
49         * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
50         * java.lang.String)
51         */
52        @Override
53        public void onCallStateChanged(int state, String incomingNumber) {
54            if (DBG) Log.d(LOG_TAG, "PhoneStateListener.onCallStateChanged: state=" + state);
55            Preference pref = getPreferenceScreen().findPreference(BUTTON_TTY_KEY);
56            if (pref != null) {
57                final boolean isVolteTtySupported = ImsManager.isVolteEnabledByPlatform(mContext)
58                        && getVolteTtySupported();
59                pref.setEnabled((isVolteTtySupported && !isVideoCallOrConferenceInProgress()) ||
60                        (state == TelephonyManager.CALL_STATE_IDLE));
61            }
62        }
63    };
64
65    private Context mContext;
66    private AudioManager mAudioManager;
67
68    private TtyModeListPreference mButtonTty;
69    private CheckBoxPreference mButtonHac;
70
71    @Override
72    public void onCreate(Bundle savedInstanceState) {
73        super.onCreate(savedInstanceState);
74
75        mContext = getActivity().getApplicationContext();
76        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
77
78        addPreferencesFromResource(R.xml.accessibility_settings);
79
80        mButtonTty = (TtyModeListPreference) findPreference(
81                getResources().getString(R.string.tty_mode_key));
82        mButtonHac = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
83
84        if (PhoneGlobals.getInstance().phoneMgr.isTtyModeSupported()) {
85            mButtonTty.init();
86        } else {
87            getPreferenceScreen().removePreference(mButtonTty);
88            mButtonTty = null;
89        }
90
91        if (PhoneGlobals.getInstance().phoneMgr.isHearingAidCompatibilitySupported()) {
92            int hac = Settings.System.getInt(mContext.getContentResolver(),
93                    Settings.System.HEARING_AID, SettingsConstants.HAC_DISABLED);
94            mButtonHac.setChecked(hac == SettingsConstants.HAC_ENABLED);
95        } else {
96            getPreferenceScreen().removePreference(mButtonHac);
97            mButtonHac = null;
98        }
99    }
100
101    @Override
102    public void onResume() {
103        super.onResume();
104        TelephonyManager tm =
105                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
106        tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
107    }
108
109    @Override
110    public void onPause() {
111        super.onPause();
112        TelephonyManager tm =
113                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
114        tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
115    }
116
117    @Override
118    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
119        if (preference == mButtonTty) {
120            return true;
121        } else if (preference == mButtonHac) {
122            int hac = mButtonHac.isChecked()
123                    ? SettingsConstants.HAC_ENABLED : SettingsConstants.HAC_DISABLED;
124            // Update HAC value in Settings database.
125            Settings.System.putInt(mContext.getContentResolver(), Settings.System.HEARING_AID, hac);
126
127            // Update HAC Value in AudioManager.
128            mAudioManager.setParameter(SettingsConstants.HAC_KEY,
129                    hac == SettingsConstants.HAC_ENABLED
130                            ? SettingsConstants.HAC_VAL_ON : SettingsConstants.HAC_VAL_OFF);
131            return true;
132        }
133        return false;
134    }
135
136    private boolean getVolteTtySupported() {
137        CarrierConfigManager configManager =
138                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
139        return configManager.getConfig().getBoolean(
140                CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL);
141    }
142
143    private boolean isVideoCallOrConferenceInProgress() {
144        final Phone[] phones = PhoneFactory.getPhones();
145        if (phones == null) {
146            if (DBG) Log.d(LOG_TAG, "isVideoCallOrConferenceInProgress: No phones found.");
147            return false;
148        }
149
150        for (Phone phone : phones) {
151            if (phone.isImsVideoCallOrConferencePresent()) {
152                return true;
153            }
154        }
155        return false;
156    }
157}
158