Merge "Disable some settings if TTY over VoLTE not supported" into lmp-mr1-dev
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index fbaddbd..a97f5d0 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -41,6 +41,7 @@
 import android.provider.Settings;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
+import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
@@ -278,6 +279,13 @@
     public void onPause() {
         super.onPause();
         mForeground = false;
+
+        if (ImsManager.isVolteEnabledByPlatform(this) &&
+                !mPhone.getContext().getResources().getBoolean(
+                        com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        }
     }
 
     /**
@@ -298,6 +306,23 @@
      */
     private boolean mSetupVoicemail = false;
 
+    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+        /**
+         * Enable/disable the TTY setting when in/out of a call (and if carrier doesn't
+         * support VoLTE with TTY).
+         * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
+         * java.lang.String)
+         */
+        @Override
+        public void onCallStateChanged(int state, String incomingNumber) {
+            if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
+            Preference pref = getPreferenceScreen().findPreference(BUTTON_TTY_KEY);
+            if (pref != null) {
+                pref.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+            }
+        }
+    };
+
     /*
      * Click Listeners, handle click based on objects attached to UI.
      */
@@ -1300,6 +1325,13 @@
         } else {
             prefSet.removePreference(mEnableVideoCalling);
         }
+
+        if (ImsManager.isVolteEnabledByPlatform(this) &&
+                !mPhone.getContext().getResources().getBoolean(
+                        com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        }
     }
 
     @Override
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 58aa511..48865ff 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -50,6 +50,7 @@
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.preference.SwitchPreference;
+import android.telecom.TelecomManager;
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -136,7 +137,8 @@
 
     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
         /*
-         * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call.
+         * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call
+         * and depending on TTY mode and TTY support over VoLTE.
          * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
          * java.lang.String)
          */
@@ -145,7 +147,8 @@
             if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
             Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
             if (pref != null) {
-                pref.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+                pref.setEnabled((state == TelephonyManager.CALL_STATE_IDLE) &&
+                        ImsManager.isNonTtyOrTtyOnVolteEnabled(getApplicationContext()));
             }
         }
     };
@@ -253,13 +256,6 @@
         }
     }
 
-    private void setIMS(boolean turnOn) {
-        int value = (turnOn) ? 1:0;
-        android.provider.Settings.Global.putInt(
-                  mPhone.getContext().getContentResolver(),
-                  android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
-    }
-
     private OnTabChangeListener mTabListener = new OnTabChangeListener() {
         @Override
         public void onTabChanged(String tabId) {
@@ -319,7 +315,6 @@
         mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
 
         mButton4glte.setOnPreferenceChangeListener(this);
-        mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this));
 
         try {
             Context con = createPackageContext("com.android.systemui", 0);
@@ -398,6 +393,10 @@
             TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
         }
+
+        mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this)
+                && ImsManager.isNonTtyOrTtyOnVolteEnabled(this));
+        // NOTE: The button will be enabled/disabled in mPhoneStateListener
     }
 
     private void updateBody() {
@@ -679,18 +678,7 @@
         } else if (preference == mButton4glte) {
             SwitchPreference ltePref = (SwitchPreference)preference;
             ltePref.setChecked(!ltePref.isChecked());
-            setIMS(ltePref.isChecked());
-
-            ImsManager imsMan = ImsManager.getInstance(getBaseContext(),
-                    SubscriptionManager.getDefaultVoicePhoneId());
-            if (imsMan != null) {
-
-                try {
-                    imsMan.setAdvanced4GMode(ltePref.isChecked());
-                } catch (ImsException ie) {
-                    // do nothing
-                }
-            }
+            ImsManager.setEnhanced4gLteModeSetting(this, ltePref.isChecked());
         } else if (preference == mButtonDataRoam) {
             if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");