Disable VoLTE if TTY is on and TTY is not supported over VoLTE
Etan Cohen [Mon, 15 Dec 2014 18:10:14 +0000 (10:10 -0800)]
- VoLTE is disabled if TTY is turned on and it is not supported
  over VoLTE.
- Add API indicating whether VoLTE is enabled due to TTY restrictions.
  Uses configuration of VoLTE on TTY supported and current TTY mode.
- Move code changing Settings.Global.ENHANCED_4G_MODE_ENABLED
  from MobileNetworkSettings activity.

Bug: 18593974
Change-Id: Ib2706cf5f30412a735cc6f24228accc7f1216804

src/java/com/android/ims/ImsManager.java

index 805d0e9..77af48b 100644 (file)
@@ -20,13 +20,14 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
 import android.os.Message;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telecom.TelecomManager;
 import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
 import com.android.ims.internal.IImsCallSession;
@@ -174,6 +175,43 @@ public class ImsManager {
     }
 
     /**
+     * Change persistent Enhanced 4G LTE Mode setting
+     */
+    public static void setEnhanced4gLteModeSetting(Context context, boolean enabled) {
+        int value = enabled ? 1 : 0;
+        android.provider.Settings.Global.putInt(
+                context.getContentResolver(),
+                android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
+
+        if (isNonTtyOrTtyOnVolteEnabled(context)) {
+            ImsManager imsManager = ImsManager.getInstance(context,
+                    SubscriptionManager.getDefaultVoicePhoneId());
+            if (imsManager != null) {
+                try {
+                    imsManager.setAdvanced4GMode(enabled);
+                } catch (ImsException ie) {
+                    // do nothing
+                }
+            }
+        }
+    }
+
+    /**
+     * Indicates whether the call is non-TTY or if TTY - whether TTY on VoLTE is
+     * supported.
+     */
+    public static boolean isNonTtyOrTtyOnVolteEnabled(Context context) {
+        if (context.getResources().getBoolean(
+                com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            return true;
+        }
+
+        return Settings.Secure.getInt(context.getContentResolver(),
+                Settings.Secure.PREFERRED_TTY_MODE, TelecomManager.TTY_MODE_OFF)
+                == TelecomManager.TTY_MODE_OFF;
+    }
+
+    /**
      * Returns a platform configuration for VoLTE which may override the user setting.
      */
     public static boolean isVolteEnabledByPlatform(Context context) {
@@ -523,17 +561,23 @@ public class ImsManager {
         return mConfig;
     }
 
-    public void setUiTTYMode(int serviceId, int uiTtyMode, Message onComplete)
+    public void setUiTTYMode(Context context, int serviceId, int uiTtyMode, Message onComplete)
             throws ImsException {
 
-       checkAndThrowExceptionIfServiceUnavailable();
+        checkAndThrowExceptionIfServiceUnavailable();
 
-       try {
-           mImsService.setUiTTYMode(serviceId, uiTtyMode, onComplete);
-       } catch (RemoteException e) {
-           throw new ImsException("setTTYMode()", e,
-                   ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
-       }
+        try {
+            mImsService.setUiTTYMode(serviceId, uiTtyMode, onComplete);
+        } catch (RemoteException e) {
+            throw new ImsException("setTTYMode()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+
+        if (!context.getResources().getBoolean(
+                com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            setAdvanced4GMode((uiTtyMode == TelecomManager.TTY_MODE_OFF) &&
+                    isEnhanced4gLteModeSettingEnabledByUser(context));
+        }
     }
 
     /**
@@ -647,7 +691,7 @@ public class ImsManager {
     /**
      * Used for turning on IMS.if its off already
      */
-    public void turnOnIms() throws ImsException {
+    private void turnOnIms() throws ImsException {
         checkAndThrowExceptionIfServiceUnavailable();
 
         try {
@@ -657,7 +701,7 @@ public class ImsManager {
         }
     }
 
-    public void setAdvanced4GMode(boolean turnOn) throws ImsException {
+    private void setAdvanced4GMode(boolean turnOn) throws ImsException {
         checkAndThrowExceptionIfServiceUnavailable();
 
         ImsConfig config = getConfigInterface();
@@ -685,7 +729,7 @@ public class ImsManager {
      * Used for turning off IMS completely in order to make the device CSFB'ed.
      * Once turned off, all calls will be over CS.
      */
-    public void turnOffIms() throws ImsException {
+    private void turnOffIms() throws ImsException {
         checkAndThrowExceptionIfServiceUnavailable();
 
         try {