[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/AndroidManifest.xml b/AndroidManifest.xml
index c4c682f..c49ee73 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -240,6 +240,7 @@
<activity android:name=".network.telephony.MobileNetworkActivity"
android:label="@string/network_settings_title"
android:exported="true"
+ android:taskAffinity="com.android.settings.root"
android:launchMode="singleTask"
android:configChanges="orientation|screenSize|keyboardHidden">
<!-- Note: Since the framework does not support the multiple requests of network scan
@@ -257,6 +258,14 @@
</intent-filter>
</activity>
+ <activity
+ android:name=".Settings$SubscriptionSettingsActivity"
+ android:label="@string/network_settings_title"
+ android:exported="false">
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.network.telephony.MobileNetworkSettings"/>
+ </activity>
+
<activity android:name=".Settings$MobileNetworkListActivity"
android:exported="true"
android:label="@string/network_settings_title">
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;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
index 459d77e..5729208 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
@@ -16,13 +16,10 @@
package com.android.settings.network.telephony;
-import static androidx.lifecycle.Lifecycle.State;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
@@ -30,21 +27,17 @@
import android.os.Bundle;
import android.os.UserManager;
import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
import androidx.test.core.app.ActivityScenario;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.settings.network.ProxySubscriptionManager;
+import com.android.settings.SettingsActivity;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,22 +51,16 @@
@RunWith(AndroidJUnit4.class)
public class MobileNetworkActivityTest {
- private static final int CURRENT_SUB_ID = 3;
- private static final int PREV_SUB_ID = 1;
+ private static final int SUB_ID = 1;
+ private static final String DISPLAY_NAME = "SUB_ID";
private Context mContext;
private ShadowContextImpl mShadowContextImpl;
private Intent mTestIntent;
-
@Mock
private UserManager mUserManager;
- @Mock
- private TelephonyManager mTelephonyManager;
-
private ShadowSubscriptionManager mSubscriptionManager;
- private SubscriptionInfo mSubscriptionInfo1;
- private SubscriptionInfo mSubscriptionInfo2;
-
+ private SubscriptionInfo mSubscriptionInfo;
private ActivityScenario<MobileNetworkActivity> mMobileNetworkActivity;
@Before
@@ -82,20 +69,16 @@
mContext = ApplicationProvider.getApplicationContext();
mShadowContextImpl = Shadow.extract(RuntimeEnvironment.application.getBaseContext());
-
+ mSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
mShadowContextImpl.setSystemService(Context.USER_SERVICE, mUserManager);
doReturn(true).when(mUserManager).isAdminUser();
- mShadowContextImpl.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt());
-
- mTestIntent = new Intent(mContext, MockMobileNetworkActivity.class);
-
- mSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
- mSubscriptionInfo1 = SubscriptionInfoBuilder.newBuilder()
- .setId(PREV_SUB_ID).buildSubscriptionInfo();
- mSubscriptionInfo2 = SubscriptionInfoBuilder.newBuilder()
- .setId(CURRENT_SUB_ID).buildSubscriptionInfo();
+ mTestIntent = new Intent(mContext, MobileNetworkActivity.class);
+ mSubscriptionInfo = SubscriptionInfoBuilder.newBuilder()
+ .setId(SUB_ID).setDisplayName(DISPLAY_NAME).buildSubscriptionInfo();
+ mTestIntent.putExtra(Settings.EXTRA_SUB_ID, SUB_ID);
+ mTestIntent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE,
+ mSubscriptionInfo.getDisplayName());
}
@After
@@ -105,116 +88,21 @@
}
}
- private static class MockMobileNetworkActivity extends MobileNetworkActivity {
- private MockMobileNetworkActivity() {
- super();
- }
-
- private SubscriptionInfo mSubscriptionInFragment;
-
- @Override
- ProxySubscriptionManager getProxySubscriptionManager() {
- if (mProxySubscriptionMgr == null) {
- mProxySubscriptionMgr = mock(ProxySubscriptionManager.class);
- }
- return mProxySubscriptionMgr;
- }
-
- @Override
- void registerActiveSubscriptionsListener() {
- onChanged();
- }
-
- @Override
- void switchFragment(SubscriptionInfo subInfo) {
- mSubscriptionInFragment = subInfo;
- }
- }
-
private ActivityScenario<MobileNetworkActivity> createTargetActivity(Intent activityIntent) {
return ActivityScenario.launch(activityIntent);
}
@Test
- @Ignore
- public void updateBottomNavigationView_oneSubscription_shouldNotCrash() {
- mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1);
-
+ public void onCreate_getExtraFromIntent() {
+ mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo);
mMobileNetworkActivity = createTargetActivity(mTestIntent);
- mMobileNetworkActivity.moveToState(State.STARTED);
- }
-
- @Test
- @Ignore
- public void updateBottomNavigationView_twoSubscription_shouldNotCrash() {
- mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
-
- mMobileNetworkActivity = createTargetActivity(mTestIntent);
-
- mMobileNetworkActivity.moveToState(State.STARTED);
- }
-
- @Test
- @Ignore
- public void switchFragment_switchBetweenTwoSubscriptions() {
- mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
-
- mTestIntent.putExtra(Settings.EXTRA_SUB_ID, PREV_SUB_ID);
- mMobileNetworkActivity = createTargetActivity(mTestIntent);
-
- mMobileNetworkActivity.moveToState(State.STARTED);
-
- mMobileNetworkActivity.onActivity(activity -> {
- final MockMobileNetworkActivity mockActivity = (MockMobileNetworkActivity) activity;
- mockActivity.switchFragment(mSubscriptionInfo1);
- assertThat(mockActivity.mSubscriptionInFragment).isEqualTo(mSubscriptionInfo1);
- });
- }
-
- @Test
- @Ignore
- public void switchFragment_subscriptionsUpdate_notifyByIntent() {
- mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
-
- mTestIntent.putExtra(Settings.EXTRA_SUB_ID, PREV_SUB_ID);
- mMobileNetworkActivity = createTargetActivity(mTestIntent);
-
- mMobileNetworkActivity.moveToState(State.STARTED);
-
- mMobileNetworkActivity.onActivity(activity -> {
- final MockMobileNetworkActivity mockActivity = (MockMobileNetworkActivity) activity;
- mockActivity.switchFragment(mSubscriptionInfo1);
- assertThat(mockActivity.mSubscriptionInFragment).isEqualTo(mSubscriptionInfo1);
-
- mContext.sendBroadcast(new Intent(
- CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null);
-
- mockActivity.switchFragment(mSubscriptionInfo2);
- assertThat(mockActivity.mSubscriptionInFragment).isEqualTo(mSubscriptionInfo2);
-
- mContext.sendBroadcast(new Intent(
- TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED), null);
-
- mockActivity.switchFragment(mSubscriptionInfo1);
- assertThat(mockActivity.mSubscriptionInFragment).isEqualTo(mSubscriptionInfo1);
- });
- }
-
- @Test
- @Ignore
- public void onSaveInstanceState_saveCurrentSubId() {
- mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
-
- mTestIntent.putExtra(Settings.EXTRA_SUB_ID, PREV_SUB_ID);
- mMobileNetworkActivity = createTargetActivity(mTestIntent);
-
- mMobileNetworkActivity.moveToState(State.STARTED);
-
mMobileNetworkActivity.onActivity(activity -> {
final Bundle bundle = new Bundle();
- activity.saveInstanceState(bundle);
- assertThat(bundle.getInt(Settings.EXTRA_SUB_ID)).isEqualTo(PREV_SUB_ID);
+ activity.onCreate(bundle);
+ assertThat(bundle.getInt(Settings.EXTRA_SUB_ID)).isEqualTo(SUB_ID);
+ assertThat(bundle.getString(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE)).isEqualTo(
+ DISPLAY_NAME);
});
}
}