Add enable/disable DSDS setting switch

This add a switch settings in the Phone Information screen to allow the
user enable/disable the DSDS mode.

Bug: 123088078
Test: build & manual test
Change-Id: Ia3722fb26ce8825820ee96550a1d523da35c7a71
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 251bfbc..db6bd9b 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -23,6 +23,7 @@
 import android.app.QueuedWork;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -40,6 +41,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.provider.Settings;
+import android.provider.Telephony;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CellIdentityCdma;
 import android.telephony.CellIdentityGsm;
@@ -81,11 +83,13 @@
 import android.widget.TextView;
 
 import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AlertDialog.Builder;
 
 import com.android.ims.ImsConfig;
 import com.android.ims.ImsException;
 import com.android.ims.ImsManager;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConfigurationManager;
 import com.android.internal.telephony.PhoneFactory;
 
 import java.io.IOException;
@@ -93,6 +97,7 @@
 import java.net.URL;
 import java.util.List;
 
+// TODO(b/123598192) consider to move this activity to telephony package.
 public class RadioInfo extends Activity {
     private static final String TAG = "RadioInfo";
 
@@ -214,6 +219,7 @@
     private Switch imsWfcProvisionedSwitch;
     private Switch eabProvisionedSwitch;
     private Switch cbrsDataSwitch;
+    private Switch dsdsSwitch;
     private Spinner preferredNetworkType;
     private Spinner cellInfoRefreshRateSpinner;
 
@@ -454,6 +460,23 @@
         cbrsDataSwitch = (Switch) findViewById(R.id.cbrs_data_switch);
         cbrsDataSwitch.setVisibility(isCbrsSupported() ? View.VISIBLE : View.GONE);
 
+        dsdsSwitch = findViewById(R.id.dsds_switch);
+        if (isDsdsSupported()) {
+            dsdsSwitch.setVisibility(View.VISIBLE);
+            dsdsSwitch.setOnClickListener(v -> {
+                if (mTelephonyManager.isRebootRequiredForModemConfigChange()) {
+                    // Undo the click action until user clicks the confirm dialog.
+                    dsdsSwitch.toggle();
+                    showDsdsChangeDialog();
+                } else {
+                    performDsdsSwitch();
+                }
+            });
+            dsdsSwitch.setChecked(isDsdsEnabled());
+        } else {
+            dsdsSwitch.setVisibility(View.GONE);
+        }
+
         radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
 
         mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
@@ -1525,5 +1548,38 @@
         }
     };
 
+    private void showDsdsChangeDialog() {
+        final AlertDialog confirmDialog = new Builder(RadioInfo.this)
+                .setTitle(R.string.dsds_dialog_title)
+                .setMessage(R.string.dsds_dialog_message)
+                .setPositiveButton(R.string.dsds_dialog_confirm, mOnDsdsDialogConfirmedListener)
+                .setNegativeButton(R.string.dsds_dialog_cancel, mOnDsdsDialogConfirmedListener)
+                .create();
+        confirmDialog.show();
+    }
 
+    private static boolean isDsdsSupported() {
+        return PhoneConfigurationManager.getInstance().getStaticPhoneCapability()
+                .logicalModemList.size() >= 2
+                && !TelephonyManager.getDefault().isMultisimCarrierRestricted();
+    }
+
+    private static boolean isDsdsEnabled() {
+        return TelephonyManager.getDefault().getPhoneCount() > 1;
+    }
+
+    private void performDsdsSwitch() {
+        mTelephonyManager.switchMultiSimConfig(dsdsSwitch.isChecked() ? 2 : 1);
+    }
+
+    DialogInterface.OnClickListener mOnDsdsDialogConfirmedListener =
+            new DialogInterface.OnClickListener() {
+        @Override
+        public void onClick(DialogInterface dialog, int which) {
+            if (which == DialogInterface.BUTTON_POSITIVE) {
+                dsdsSwitch.toggle();
+                performDsdsSwitch();
+            }
+        }
+    };
 }