[Large Screen] Launch MobileNetworkActivity as a fragment for split mode

Receive intent in MobileNetworkActivity and launch a activity which extend SettingsActivity

Test: atest
Bug: 197609014
Bug: 209606859
Change-Id: Ic07b18b3ea11744f240b25a0986474df763a199b
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index afd0d15..4e919d6 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -304,6 +304,8 @@
     public static class WifiCallingDisclaimerActivity extends SettingsActivity { /* empty */ }
     public static class MobileNetworkListActivity extends SettingsActivity {}
     public static class PowerMenuSettingsActivity extends SettingsActivity {}
+    public static class SubscriptionSettingsActivity extends SettingsActivity {  /* empty */  }
+
     /**
      * Activity for BugReportHandlerPicker.
      */
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 87e176e..e94fafc 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -123,6 +123,7 @@
 import com.android.settings.network.NetworkProviderSettings;
 import com.android.settings.network.apn.ApnEditor;
 import com.android.settings.network.apn.ApnSettings;
+import com.android.settings.network.telephony.MobileNetworkSettings;
 import com.android.settings.network.telephony.NetworkSelectSettings;
 import com.android.settings.nfc.AndroidBeam;
 import com.android.settings.nfc.PaymentSettings;
@@ -329,7 +330,8 @@
             AlarmsAndRemindersDetails.class.getName(),
             MediaManagementAppsDetails.class.getName(),
             AutoBrightnessSettings.class.getName(),
-            OneHandedSettings.class.getName()
+            OneHandedSettings.class.getName(),
+            MobileNetworkSettings.class.getName()
     };
 
     public static final String[] SETTINGS_FOR_RESTRICTED = {
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index d7e5876..1ba0502 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.os.ParcelUuid;
+import android.provider.Settings;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -37,6 +38,8 @@
 
 import com.android.internal.telephony.MccTable;
 import com.android.settings.R;
+import com.android.settings.network.helper.SelectableSubscriptions;
+import com.android.settings.network.helper.SubscriptionAnnotation;
 import com.android.settings.network.telephony.DeleteEuiccSubscriptionDialogActivity;
 import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity;
 import com.android.settingslib.DeviceInfoUtils;
@@ -48,6 +51,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -643,4 +647,49 @@
     private static int getDefaultDataSubscriptionId() {
         return SubscriptionManager.getDefaultDataSubscriptionId();
     }
+
+
+    /**
+     * Select one of the subscription as the default subscription.
+     * @param subAnnoList a list of {@link SubscriptionAnnotation}
+     * @return ideally the {@link SubscriptionAnnotation} as expected
+     */
+    private static SubscriptionAnnotation getDefaultSubscriptionSelection(
+            List<SubscriptionAnnotation> subAnnoList) {
+        return (subAnnoList == null) ? null :
+                subAnnoList.stream()
+                        .filter(SubscriptionAnnotation::isDisplayAllowed)
+                        .filter(SubscriptionAnnotation::isActive)
+                        .findFirst().orElse(null);
+    }
+
+    public static SubscriptionInfo getSubscriptionOrDefault(Context context, int subscriptionId) {
+        return getSubscription(context, subscriptionId,
+                (subscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) ? null : (
+                        subAnnoList -> getDefaultSubscriptionSelection(subAnnoList)
+                ));
+    }
+
+    /**
+     * Get the current subscription to display. First check whether intent has {@link
+     * Settings#EXTRA_SUB_ID} and if so find the subscription with that id.
+     * If not, select default one based on {@link Function} provided.
+     *
+     * @param preferredSubscriptionId preferred subscription id
+     * @param selectionOfDefault when true current subscription is absent
+     */
+    private static SubscriptionInfo getSubscription(Context context, int preferredSubscriptionId,
+            Function<List<SubscriptionAnnotation>, SubscriptionAnnotation> selectionOfDefault) {
+        List<SubscriptionAnnotation> subList =
+                (new SelectableSubscriptions(context, true)).call();
+        Log.d(TAG, "get subId=" + preferredSubscriptionId + " from " + subList);
+        SubscriptionAnnotation currentSubInfo = subList.stream()
+                .filter(SubscriptionAnnotation::isDisplayAllowed)
+                .filter(subAnno -> (subAnno.getSubscriptionId() == preferredSubscriptionId))
+                .findFirst().orElse(null);
+        if ((currentSubInfo == null) && (selectionOfDefault != null)) {
+            currentSubInfo = selectionOfDefault.apply(subList);
+        }
+        return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo();
+    }
 }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
index bbff57d..d3ff546 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
@@ -18,8 +18,8 @@
 
 import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
 
-import android.app.ActionBar;
-import android.content.Context;
+import android.app.Activity;
+import android.app.settings.SettingsEnums;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserManager;
@@ -29,84 +29,27 @@
 import android.telephony.ims.ImsRcsManager;
 import android.text.TextUtils;
 import android.util.Log;
-import android.view.View;
-import android.widget.Toolbar;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.lifecycle.Lifecycle;
 
-import com.android.settings.R;
-import com.android.settings.core.SettingsBaseActivity;
-import com.android.settings.network.ProxySubscriptionManager;
+import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.helper.SelectableSubscriptions;
-import com.android.settings.network.helper.SubscriptionAnnotation;
-
-import java.util.List;
-import java.util.function.Function;
 
 /**
- * Activity for displaying MobileNetworkSettings
+ * Activity for displaying MobileNetworkSettings.
+ *
+ * @Deprecated The MobileNetworkActivity should be removed in Android U. Instead of using the
+ * singleTask activity which will cause an additional window transition when users launch the SIMs
+ * page, using the {@link com.android.settings.Settings.SubscriptionSettingsActivity} which can be
+ * managed by {@link SettingsActivity} and be migrated into the Settings architecture.
  */
-public class MobileNetworkActivity extends SettingsBaseActivity
-        implements ProxySubscriptionManager.OnActiveSubscriptionChangedListener {
+@Deprecated
+public class MobileNetworkActivity extends Activity {
 
     private static final String TAG = "MobileNetworkActivity";
-    @VisibleForTesting
-    static final String MOBILE_SETTINGS_TAG = "mobile_settings:";
-    @VisibleForTesting
-    static final int SUB_ID_NULL = Integer.MIN_VALUE;
-
-    @VisibleForTesting
-    ProxySubscriptionManager mProxySubscriptionMgr;
-
-    private int mCurSubscriptionId = SUB_ID_NULL;
-
-    // This flag forces subscription information fragment to be re-created.
-    // Otherwise, fragment will be kept when subscription id has not been changed.
-    //
-    // Set initial value to true allows subscription information fragment to be re-created when
-    // Activity re-create occur.
-    private boolean mPendingSubscriptionChange = true;
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        validate(intent);
-        setIntent(intent);
-
-        int updateSubscriptionIndex = mCurSubscriptionId;
-        if (intent != null) {
-            updateSubscriptionIndex = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
-        }
-        SubscriptionInfo info = getSubscriptionOrDefault(updateSubscriptionIndex);
-        if (info == null) {
-            Log.d(TAG, "Invalid subId request " + mCurSubscriptionId
-                    + " -> " + updateSubscriptionIndex);
-            return;
-        }
-
-        int oldSubId = mCurSubscriptionId;
-        updateSubscriptions(info, null);
-
-        // If the subscription has changed or the new intent doesnt contain the opt in action,
-        // remove the old discovery dialog. If the activity is being recreated, we will see
-        // onCreate -> onNewIntent, so the dialog will first be recreated for the old subscription
-        // and then removed.
-        if (mCurSubscriptionId != oldSubId || !doesIntentContainOptInAction(intent)) {
-            removeContactDiscoveryDialog(oldSubId);
-        }
-        // evaluate showing the new discovery dialog if this intent contains an action to show the
-        // opt-in.
-        if (doesIntentContainOptInAction(intent)) {
-            maybeShowContactDiscoveryDialog(info);
-        }
-    }
-
+    public static final String SHOW_CAPABILITY_DISCOVERY_OPT_IN =
+            "show_capability_discovery_opt_in";
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -116,318 +59,63 @@
             return;
         }
 
-        final Toolbar toolbar = findViewById(R.id.action_bar);
-        toolbar.setVisibility(View.VISIBLE);
-        setActionBar(toolbar);
-
-        final ActionBar actionBar = getActionBar();
-        if (actionBar != null) {
-            actionBar.setDisplayHomeAsUpEnabled(true);
-            actionBar.setDisplayShowTitleEnabled(true);
-        }
-
-        getProxySubscriptionManager().setLifecycle(getLifecycle());
-
-        final Intent startIntent = getIntent();
-        validate(startIntent);
-        mCurSubscriptionId = savedInstanceState != null
-                ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
-                : ((startIntent != null)
-                ? startIntent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
-                : SUB_ID_NULL);
-        // perform registration after mCurSubscriptionId been configured.
-        registerActiveSubscriptionsListener();
-
-        SubscriptionInfo subscription = getSubscriptionOrDefault(mCurSubscriptionId);
-        if (subscription == null) {
-            Log.d(TAG, "Invalid subId request " + mCurSubscriptionId);
-            tryToFinishActivity();
+        // TODO: Move these intent's extra into SubscriptionSettingsActivity if the
+        //  MobileNetworkActivity is removed in Android U.
+        Intent intent = getIntent();
+        if (intent == null) {
+            Log.d(TAG, "onCreate(), intent = null");
+            this.finish();
             return;
         }
 
-        maybeShowContactDiscoveryDialog(subscription);
-
-        updateSubscriptions(subscription, null);
-    }
-
-    @VisibleForTesting
-    ProxySubscriptionManager getProxySubscriptionManager() {
-        if (mProxySubscriptionMgr == null) {
-            mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(this);
-        }
-        return mProxySubscriptionMgr;
-    }
-
-    @VisibleForTesting
-    void registerActiveSubscriptionsListener() {
-        getProxySubscriptionManager().addActiveSubscriptionsListener(this);
-    }
-
-    /**
-     * Implementation of ProxySubscriptionManager.OnActiveSubscriptionChangedListener
-     */
-    public void onChanged() {
-        mPendingSubscriptionChange = false;
-
-        if (mCurSubscriptionId == SUB_ID_NULL) {
-            return;
+        Intent trampolineIntent;
+        final Intent subscriptionSettingsIntent = new Intent(this,
+                com.android.settings.Settings.SubscriptionSettingsActivity.class);
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) || !isTaskRoot()) {
+            trampolineIntent = subscriptionSettingsIntent;
+        } else {
+            trampolineIntent = new Intent(Settings.ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY)
+                    .setPackage(Utils.SETTINGS_PACKAGE_NAME);
+            trampolineIntent.putExtra(
+                    android.provider.Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI,
+                    subscriptionSettingsIntent.toUri(Intent.URI_INTENT_SCHEME));
         }
 
-        if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
-            mPendingSubscriptionChange = true;
-            return;
+        int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        SubscriptionInfo subInfo = SubscriptionUtil.getSubscriptionOrDefault(this, subId);
+        CharSequence title = SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, this);
+        trampolineIntent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
+        trampolineIntent.putExtra(Settings.EXTRA_SUB_ID, subId);
+        if (Settings.ACTION_MMS_MESSAGE_SETTING.equals(intent.getAction())) {
+            // highlight "mms_message" preference.
+            trampolineIntent.putExtra(EXTRA_FRAGMENT_ARG_KEY, "mms_message");
         }
 
-        SubscriptionInfo subInfo = getSubscription(mCurSubscriptionId, null);
-        if (subInfo != null) {
-            if (mCurSubscriptionId != subInfo.getSubscriptionId()) {
-                // update based on subscription status change
-                removeContactDiscoveryDialog(mCurSubscriptionId);
-                updateSubscriptions(subInfo, null);
-            }
-            return;
+        if (doesIntentContainOptInAction(intent)) {
+            trampolineIntent.putExtra(SHOW_CAPABILITY_DISCOVERY_OPT_IN,
+                    maybeShowContactDiscoveryDialog(subId));
         }
 
-        Log.w(TAG, "subId missing: " + mCurSubscriptionId);
-
-        // When UI is not the active one, avoid from destroy it immediately
-        // but wait until onResume() to see if subscription back online again.
-        // This is to avoid from glitch behavior of subscription which changes
-        // the UI when UI is considered as in the background or only partly
-        // visible.
-        if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
-            mPendingSubscriptionChange = true;
-            return;
-        }
-
-        // Subscription could be missing
-        tryToFinishActivity();
-    }
-
-    protected void runSubscriptionUpdate(Runnable onUpdateRemaining) {
-        SubscriptionInfo subInfo = getSubscription(mCurSubscriptionId, null);
-        if (subInfo == null) {
-            onUpdateRemaining.run();
-            tryToFinishActivity();
-            return;
-        }
-        if (mCurSubscriptionId != subInfo.getSubscriptionId()) {
-            removeContactDiscoveryDialog(mCurSubscriptionId);
-            updateSubscriptions(subInfo, null);
-        }
-        onUpdateRemaining.run();
-    }
-
-    protected void tryToFinishActivity() {
-        if ((!isFinishing()) && (!isDestroyed())) {
+        startActivity(trampolineIntent);
+        if (isTaskRoot()) {
+            finishAndRemoveTask();
+        } else {
             finish();
         }
     }
 
-    @Override
-    protected void onStart() {
-        getProxySubscriptionManager().setLifecycle(getLifecycle());
-        if (mPendingSubscriptionChange) {
-            mPendingSubscriptionChange = false;
-            runSubscriptionUpdate(() -> super.onStart());
-            return;
-        }
-        super.onStart();
-    }
-
-    @Override
-    protected void onResume() {
-        if (mPendingSubscriptionChange) {
-            mPendingSubscriptionChange = false;
-            runSubscriptionUpdate(() -> super.onResume());
-            return;
-        }
-        super.onResume();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (mProxySubscriptionMgr == null) {
-            return;
-        }
-        mProxySubscriptionMgr.removeActiveSubscriptionsListener(this);
-    }
-
-    @Override
-    protected void onSaveInstanceState(@NonNull Bundle outState) {
-        super.onSaveInstanceState(outState);
-        saveInstanceState(outState);
-    }
-
-    @VisibleForTesting
-    void saveInstanceState(@NonNull Bundle outState) {
-        outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId);
-    }
-
-    private void updateTitleAndNavigation(SubscriptionInfo subscription) {
-        // Set the title to the name of the subscription. If we don't have subscription info, the
-        // title will just default to the label for this activity that's already specified in
-        // AndroidManifest.xml.
-        if (subscription != null) {
-            setTitle(SubscriptionUtil.getUniqueSubscriptionDisplayName(subscription, this));
-        }
-    }
-
-    @VisibleForTesting
-    void updateSubscriptions(SubscriptionInfo subscription, Bundle savedInstanceState) {
-        if (subscription == null) {
-            return;
-        }
-        final int subscriptionIndex = subscription.getSubscriptionId();
-
-        updateTitleAndNavigation(subscription);
-        if (savedInstanceState == null) {
-            switchFragment(subscription);
-        }
-
-        mCurSubscriptionId = subscriptionIndex;
-    }
-
-    /**
-     * Select one of the subscription as the default subscription.
-     * @param subAnnoList a list of {@link SubscriptionAnnotation}
-     * @return ideally the {@link SubscriptionAnnotation} as expected
-     */
-    protected SubscriptionAnnotation defaultSubscriptionSelection(
-            List<SubscriptionAnnotation> subAnnoList) {
-        return (subAnnoList == null) ? null :
-                subAnnoList.stream()
-                .filter(SubscriptionAnnotation::isDisplayAllowed)
-                .filter(SubscriptionAnnotation::isActive)
-                .findFirst().orElse(null);
-    }
-
-    protected SubscriptionInfo getSubscriptionOrDefault(int subscriptionId) {
-        return getSubscription(subscriptionId,
-                (subscriptionId != SUB_ID_NULL) ? null : (
-                    subAnnoList -> defaultSubscriptionSelection(subAnnoList)
-                ));
-    }
-
-    /**
-     * Get the current subscription to display. First check whether intent has {@link
-     * Settings#EXTRA_SUB_ID} and if so find the subscription with that id.
-     * If not, select default one based on {@link Function} provided.
-     *
-     * @param preferredSubscriptionId preferred subscription id
-     * @param selectionOfDefault when true current subscription is absent
-     */
-    @VisibleForTesting
-    protected SubscriptionInfo getSubscription(int preferredSubscriptionId,
-            Function<List<SubscriptionAnnotation>, SubscriptionAnnotation> selectionOfDefault) {
-        List<SubscriptionAnnotation> subList =
-                (new SelectableSubscriptions(this, true)).call();
-        Log.d(TAG, "get subId=" + preferredSubscriptionId + " from " + subList);
-        SubscriptionAnnotation currentSubInfo = subList.stream()
-                .filter(SubscriptionAnnotation::isDisplayAllowed)
-                .filter(subAnno -> (subAnno.getSubscriptionId() == preferredSubscriptionId))
-                .findFirst().orElse(null);
-        if ((currentSubInfo == null) && (selectionOfDefault != null)) {
-            currentSubInfo = selectionOfDefault.apply(subList);
-        }
-        return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo();
-    }
-
-    @VisibleForTesting
-    SubscriptionInfo getSubscriptionForSubId(int subId) {
-        return SubscriptionUtil.getAvailableSubscription(this,
-                getProxySubscriptionManager(), subId);
-    }
-
-    @VisibleForTesting
-    void switchFragment(SubscriptionInfo subInfo) {
-        final FragmentManager fragmentManager = getSupportFragmentManager();
-        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
-        final int subId = subInfo.getSubscriptionId();
-        final Intent intent = getIntent();
-        final Bundle bundle = new Bundle();
-        bundle.putInt(Settings.EXTRA_SUB_ID, subId);
-        if (intent != null && Settings.ACTION_MMS_MESSAGE_SETTING.equals(intent.getAction())) {
-            // highlight "mms_message" preference.
-            bundle.putString(EXTRA_FRAGMENT_ARG_KEY, "mms_message");
-        }
-
-        final String fragmentTag = buildFragmentTag(subId);
-        if (fragmentManager.findFragmentByTag(fragmentTag) != null) {
-            Log.d(TAG, "Construct fragment: " + fragmentTag);
-        }
-
-        final Fragment fragment = new MobileNetworkSettings();
-        fragment.setArguments(bundle);
-        fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag);
-        fragmentTransaction.commitAllowingStateLoss();
-    }
-
-    private void removeContactDiscoveryDialog(int subId) {
-        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
-        if (fragment != null) {
-            fragment.dismiss();
-        }
-    }
-
-    private ContactDiscoveryDialogFragment getContactDiscoveryFragment(int subId) {
-        // In the case that we are rebuilding this activity after it has been destroyed and
-        // recreated, look up the dialog in the fragment manager.
-        return (ContactDiscoveryDialogFragment) getSupportFragmentManager()
-                .findFragmentByTag(ContactDiscoveryDialogFragment.getFragmentTag(subId));
-    }
-
-    private void maybeShowContactDiscoveryDialog(SubscriptionInfo info) {
-        int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-        CharSequence carrierName = "";
-        if (info != null) {
-            subId = info.getSubscriptionId();
-            carrierName = SubscriptionUtil.getUniqueSubscriptionDisplayName(info, this);
-        }
+    private boolean maybeShowContactDiscoveryDialog(int subId) {
         // If this activity was launched using ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN, show the
         // associated dialog only if the opt-in has not been granted yet.
-        boolean showOptInDialog = doesIntentContainOptInAction(getIntent())
-                // has the carrier config enabled capability discovery?
-                && MobileNetworkUtils.isContactDiscoveryVisible(this, subId)
+        return MobileNetworkUtils.isContactDiscoveryVisible(this, subId)
                 // has the user already enabled this configuration?
                 && !MobileNetworkUtils.isContactDiscoveryEnabled(this, subId);
-        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
-        if (showOptInDialog) {
-            if (fragment == null) {
-                fragment = ContactDiscoveryDialogFragment.newInstance(subId, carrierName);
-            }
-            // Only try to show the dialog if it has not already been added, otherwise we may
-            // accidentally add it multiple times, causing multiple dialogs.
-            if (!fragment.isAdded()) {
-                fragment.show(getSupportFragmentManager(),
-                        ContactDiscoveryDialogFragment.getFragmentTag(subId));
-            }
-        }
     }
 
-    private boolean doesIntentContainOptInAction(Intent intent) {
+    public static boolean doesIntentContainOptInAction(Intent intent) {
         String intentAction = (intent != null ? intent.getAction() : null);
         return TextUtils.equals(intentAction,
                 ImsRcsManager.ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN);
     }
-
-    private void validate(Intent intent) {
-        // Do not allow ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN without a subscription id specified,
-        // since we do not want the user to accidentally turn on capability polling for the wrong
-        // subscription.
-        if (doesIntentContainOptInAction(intent)) {
-            if (SUB_ID_NULL == intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL)) {
-                throw new IllegalArgumentException("Intent with action "
-                        + "SHOW_CAPABILITY_DISCOVERY_OPT_IN must also include the extra "
-                        + "Settings#EXTRA_SUB_ID");
-            }
-        }
-    }
-
-    @VisibleForTesting
-    String buildFragmentTag(int subscriptionId) {
-        return MOBILE_SETTINGS_TAG + subscriptionId;
-    }
 }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index ba80a8c..cf0f889 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -23,8 +23,10 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsRcsManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
@@ -39,6 +41,7 @@
 import com.android.settings.datausage.DataUsageSummaryPreferenceController;
 import com.android.settings.network.ActiveSubscriptionsListener;
 import com.android.settings.network.CarrierWifiTogglePreferenceController;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController;
 import com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController;
 import com.android.settings.network.telephony.gsm.AutoSelectPreferenceController;
@@ -115,9 +118,16 @@
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
-                MobileNetworkUtils.getSearchableSubscriptionId(context));
-        Log.i(LOG_TAG, "display subId: " + mSubId);
+        Intent intent = getIntent();
+        if (intent != null) {
+            mSubId = intent.getIntExtra(Settings.EXTRA_SUB_ID,
+                    MobileNetworkUtils.getSearchableSubscriptionId(context));
+            Log.i(LOG_TAG, "display subId from intent: " + mSubId);
+        } else {
+            mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
+                    MobileNetworkUtils.getSearchableSubscriptionId(context));
+            Log.i(LOG_TAG, "display subId from getArguments(): " + mSubId);
+        }
 
         if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
             return Arrays.asList();
@@ -131,6 +141,30 @@
     public void onAttach(Context context) {
         super.onAttach(context);
 
+        Intent intent = getIntent();
+        SubscriptionInfo info = SubscriptionUtil.getSubscriptionOrDefault(context, mSubId);
+        if (info == null) {
+            Log.d(LOG_TAG, "Invalid subId request " + mSubId);
+            return;
+        }
+
+        int oldSubId = mSubId;
+        updateSubscriptions(info);
+        // If the subscription has changed or the new intent does not contain the opt in action,
+        // remove the old discovery dialog. If the activity is being recreated, we will see
+        // onCreate -> onNewIntent, so the dialog will first be recreated for the old subscription
+        // and then removed.
+        if (!MobileNetworkActivity.doesIntentContainOptInAction(intent)) {
+            removeContactDiscoveryDialog(oldSubId);
+        }
+
+        // evaluate showing the new discovery dialog if this intent contains an action to show the
+        // opt-in.
+        if (MobileNetworkActivity.doesIntentContainOptInAction(intent)) {
+            showContactDiscoveryDialog(
+                    SubscriptionUtil.getSubscriptionOrDefault(context, mSubId));
+        }
+
         final DataUsageSummaryPreferenceController dataUsageSummaryPreferenceController =
                 use(DataUsageSummaryPreferenceController.class);
         if (dataUsageSummaryPreferenceController != null) {
@@ -339,4 +373,49 @@
                     return context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
+
+    private ContactDiscoveryDialogFragment getContactDiscoveryFragment(int subId) {
+        // In the case that we are rebuilding this activity after it has been destroyed and
+        // recreated, look up the dialog in the fragment manager.
+        return (ContactDiscoveryDialogFragment) getChildFragmentManager()
+                .findFragmentByTag(ContactDiscoveryDialogFragment.getFragmentTag(subId));
+    }
+
+
+    private void removeContactDiscoveryDialog(int subId) {
+        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
+        if (fragment != null) {
+            fragment.dismiss();
+        }
+    }
+
+    private void showContactDiscoveryDialog(SubscriptionInfo info) {
+        if (info == null) {
+            Log.d(LOG_TAG, "Invalid subId request " + mSubId);
+            onDestroy();
+            return;
+        }
+
+        CharSequence carrierName = SubscriptionUtil.getUniqueSubscriptionDisplayName(info,
+                getContext());
+        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(mSubId);
+        if (fragment == null) {
+            fragment = ContactDiscoveryDialogFragment.newInstance(mSubId, carrierName);
+        }
+        // Only try to show the dialog if it has not already been added, otherwise we may
+        // accidentally add it multiple times, causing multiple dialogs.
+        if (!fragment.isAdded()) {
+            fragment.show(getChildFragmentManager(),
+                    ContactDiscoveryDialogFragment.getFragmentTag(mSubId));
+        }
+    }
+
+    private void updateSubscriptions(SubscriptionInfo subscription) {
+        if (subscription == null) {
+            return;
+        }
+        final int subscriptionIndex = subscription.getSubscriptionId();
+
+        mSubId = subscriptionIndex;
+    }
 }