From 8e57fedc95f1ba29c32005115286b6fbb5a37111 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Mon, 17 Dec 2018 15:23:44 -0800 Subject: [PATCH] Make taps on subscriptions in multi-network header go to mobile page This CL does 2 things: -Makes the MobileNetworkActivity class capable of showing details for "available" in addition to just "active" networks. This is useful for dual-standby devices where one subscription is active and another is registered but not currently active. It also changes the title of this screen to be the network display name (defaults to the carrier name but can be customized by the user) instead of the generic "Mobile network". -Wires up the subscription entries in the multi-network header (which only appears when a device has multiple subscriptions) so that taps on a subscription preference bring you to the MobileNetworkActivity screen to show details for that network. Bug: 116349402 Test: make RunSettingsRoboTests Change-Id: I0e985652c1d8ec3c597b6b6e4426d222e2ad5352 --- res/xml/mobile_network_settings.xml | 1 - .../SubscriptionsPreferenceController.java | 10 ++- .../telephony/MobileNetworkActivity.java | 44 ++++++++---- ...SubscriptionsPreferenceControllerTest.java | 69 ++++++++++++++++++- .../telephony/MobileNetworkActivityTest.java | 3 + 5 files changed, 109 insertions(+), 18 deletions(-) diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml index cc914adcc0f..c6eb3e76711 100644 --- a/res/xml/mobile_network_settings.xml +++ b/res/xml/mobile_network_settings.xml @@ -17,7 +17,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="mobile_network_pref_screen" - android:title="@string/network_settings_title" settings:initialExpandedChildrenCount="4"> (); int order = mStartOrder; - for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mManager) ) { + for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mManager)) { final int subId = info.getSubscriptionId(); Preference pref = existingPrefs.remove(subId); if (pref == null) { @@ -139,8 +142,9 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl // TODO(asargent) - set summary here to indicate default for calls/sms and data pref.setOnPreferenceClickListener(clickedPref -> { - // TODO(asargent) - make this start MobileNetworkActivity once we've - // added support for it to take a subscription id + final Intent intent = new Intent(mContext, MobileNetworkActivity.class); + intent.putExtra(Settings.EXTRA_SUB_ID, subId); + mContext.startActivity(intent); return true; }); diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index 9f3dfb28f2a..c101db4b095 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -25,7 +25,6 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.util.Log; import android.view.Menu; import android.view.View; @@ -43,14 +42,12 @@ import com.android.settings.core.SettingsBaseActivity; import com.google.android.material.bottomnavigation.BottomNavigationView; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Objects; public class MobileNetworkActivity extends SettingsBaseActivity { - private static final String TAG = "MobileSettingsActivity"; + private static final String TAG = "MobileNetworkActivity"; @VisibleForTesting static final String MOBILE_SETTINGS_TAG = "mobile_settings:"; @VisibleForTesting @@ -94,6 +91,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity { actionBar.setDisplayHomeAsUpEnabled(true); } + // 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. + final SubscriptionInfo subscription = getSubscription(); + if (subscription != null) { + setTitle(subscription.getDisplayName()); + } updateSubscriptions(savedInstanceState); } @@ -136,25 +140,41 @@ public class MobileNetworkActivity extends SettingsBaseActivity { } /** - * Get the current subId to display. First check whether intent has {@link - * Settings#EXTRA_SUB_ID}. If not, just display first one in list - * since it is already sorted by sim slot. + * 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, just return the + * first one in the mSubscriptionInfos list since it is already sorted by sim slot. */ @VisibleForTesting - int getSubscriptionId() { + SubscriptionInfo getSubscription() { final Intent intent = getIntent(); if (intent != null) { final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); - if (subId != SUB_ID_NULL && mSubscriptionManager.isActiveSubscriptionId(subId)) { - return subId; + if (subId != SUB_ID_NULL) { + for (SubscriptionInfo subscription : + mSubscriptionManager.getAvailableSubscriptionInfoList()) { + if (subscription.getSubscriptionId() == subId) { + return subscription; + } + } } } if (CollectionUtils.isEmpty(mSubscriptionInfos)) { - return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + return null; } + return mSubscriptionInfos.get(0); + } - return mSubscriptionInfos.get(0).getSubscriptionId(); + /** + * Get the current subId to display. + */ + @VisibleForTesting + int getSubscriptionId() { + final SubscriptionInfo subscription = getSubscription(); + if (subscription != null) { + return subscription.getSubscriptionId(); + } + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; } @VisibleForTesting diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java index 016a885d517..70536997493 100644 --- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -16,33 +16,40 @@ package com.android.settings.network; +import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import com.android.settingslib.core.lifecycle.Lifecycle; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; @@ -70,7 +77,7 @@ public class SubscriptionsPreferenceControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); + mContext = spy(Robolectric.setupActivity(Activity.class)); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); @@ -83,6 +90,11 @@ public class SubscriptionsPreferenceControllerTest { KEY, 5); } + @After + public void tearDown() { + SubscriptionUtil.setAvailableSubscriptionsForTesting(null); + } + @Test public void isAvailable_oneSubscription_availableFalse() { SubscriptionUtil.setAvailableSubscriptionsForTesting( @@ -215,4 +227,57 @@ public class SubscriptionsPreferenceControllerTest { verify(mPreferenceCategory, times(3)).addPreference(captor.capture()); assertThat(captor.getValue().getTitle()).isEqualTo("sub3"); } + + + /** + * Helper to create a specified number of subscriptions, display them, and then click on one and + * verify that the intent fires and has the right subscription id extra. + * + * @param subscriptionCount the number of subscriptions + * @param selectedPrefIndex index of the subscription to click on + */ + private void runPreferenceClickTest(int subscriptionCount, int selectedPrefIndex) { + final ArrayList subscriptions = new ArrayList<>(); + for (int i = 0; i < subscriptionCount; i++) { + final SubscriptionInfo sub = mock(SubscriptionInfo.class); + doReturn(i + 1).when(sub).getSubscriptionId(); + subscriptions.add(sub); + } + SubscriptionUtil.setAvailableSubscriptionsForTesting(subscriptions); + mController.displayPreference(mScreen); + final ArgumentCaptor prefCaptor = ArgumentCaptor.forClass(Preference.class); + verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture()); + final List prefs = prefCaptor.getAllValues(); + final Preference pref = prefs.get(selectedPrefIndex); + pref.getOnPreferenceClickListener().onPreferenceClick(pref); + final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mContext).startActivity(intentCaptor.capture()); + final Intent intent = intentCaptor.getValue(); + assertThat(intent).isNotNull(); + assertThat(intent.hasExtra(Settings.EXTRA_SUB_ID)).isTrue(); + final int subIdFromIntent = intent.getIntExtra(Settings.EXTRA_SUB_ID, + INVALID_SUBSCRIPTION_ID); + assertThat(subIdFromIntent).isEqualTo( + subscriptions.get(selectedPrefIndex).getSubscriptionId()); + } + + @Test + public void twoPreferences_firstPreferenceClicked_correctIntentFires() { + runPreferenceClickTest(2, 0); + } + + @Test + public void twoPreferences_secondPreferenceClicked_correctIntentFires() { + runPreferenceClickTest(2, 1); + } + + @Test + public void threePreferences_secondPreferenceClicked_correctIntentFires() { + runPreferenceClickTest(3, 1); + } + + @Test + public void threePreferences_thirdPreferenceClicked_correctIntentFires() { + runPreferenceClickTest(3, 2); + } } 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 f13746c13f2..29472f54b85 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java @@ -143,6 +143,9 @@ public class MobileNetworkActivityTest { final Intent intent = new Intent(); intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID); doReturn(intent).when(mMobileNetworkActivity).getIntent(); + mSubscriptionInfos.add(mSubscriptionInfo); + mSubscriptionInfos.add(mSubscriptionInfo2); + doReturn(mSubscriptionInfos).when(mSubscriptionManager).getAvailableSubscriptionInfoList(); doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID); assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID);