Loading res/xml/mobile_network_settings.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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"> <Preference Loading src/com/android/settings/network/SubscriptionsPreferenceController.java +7 −3 Original line number Diff line number Diff line Loading @@ -20,10 +20,13 @@ import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import android.content.Context; import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import com.android.settings.R; import com.android.settings.network.telephony.MobileNetworkActivity; import com.android.settingslib.core.AbstractPreferenceController; import java.util.Map; Loading Loading @@ -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; }); Loading src/com/android/settings/network/telephony/MobileNetworkActivity.java +32 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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); } Loading Loading @@ -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 Loading tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +67 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -83,6 +90,11 @@ public class SubscriptionsPreferenceControllerTest { KEY, 5); } @After public void tearDown() { SubscriptionUtil.setAvailableSubscriptionsForTesting(null); } @Test public void isAvailable_oneSubscription_availableFalse() { SubscriptionUtil.setAvailableSubscriptionsForTesting( Loading Loading @@ -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<SubscriptionInfo> 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<Preference> prefCaptor = ArgumentCaptor.forClass(Preference.class); verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture()); final List<Preference> prefs = prefCaptor.getAllValues(); final Preference pref = prefs.get(selectedPrefIndex); pref.getOnPreferenceClickListener().onPreferenceClick(pref); final ArgumentCaptor<Intent> 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); } } tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
res/xml/mobile_network_settings.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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"> <Preference Loading
src/com/android/settings/network/SubscriptionsPreferenceController.java +7 −3 Original line number Diff line number Diff line Loading @@ -20,10 +20,13 @@ import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import android.content.Context; import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import com.android.settings.R; import com.android.settings.network.telephony.MobileNetworkActivity; import com.android.settingslib.core.AbstractPreferenceController; import java.util.Map; Loading Loading @@ -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; }); Loading
src/com/android/settings/network/telephony/MobileNetworkActivity.java +32 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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); } Loading Loading @@ -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 Loading
tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +67 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -83,6 +90,11 @@ public class SubscriptionsPreferenceControllerTest { KEY, 5); } @After public void tearDown() { SubscriptionUtil.setAvailableSubscriptionsForTesting(null); } @Test public void isAvailable_oneSubscription_availableFalse() { SubscriptionUtil.setAvailableSubscriptionsForTesting( Loading Loading @@ -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<SubscriptionInfo> 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<Preference> prefCaptor = ArgumentCaptor.forClass(Preference.class); verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture()); final List<Preference> prefs = prefCaptor.getAllValues(); final Preference pref = prefs.get(selectedPrefIndex); pref.getOnPreferenceClickListener().onPreferenceClick(pref); final ArgumentCaptor<Intent> 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); } }
tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); Loading