Merge "Make taps on subscriptions in multi-network header go to mobile page"

This commit is contained in:
TreeHugger Robot
2018-12-20 18:59:54 +00:00
committed by Android (Google) Code Review
5 changed files with 109 additions and 18 deletions

View File

@@ -17,7 +17,6 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto" xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="mobile_network_pref_screen" android:key="mobile_network_pref_screen"
android:title="@string/network_settings_title"
settings:initialExpandedChildrenCount="4"> settings:initialExpandedChildrenCount="4">
<Preference <Preference

View File

@@ -20,10 +20,13 @@ import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import java.util.Map; import java.util.Map;
@@ -125,7 +128,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
mSubscriptionPreferences = new ArrayMap<>(); mSubscriptionPreferences = new ArrayMap<>();
int order = mStartOrder; int order = mStartOrder;
for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mManager) ) { for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mManager)) {
final int subId = info.getSubscriptionId(); final int subId = info.getSubscriptionId();
Preference pref = existingPrefs.remove(subId); Preference pref = existingPrefs.remove(subId);
if (pref == null) { 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 // TODO(asargent) - set summary here to indicate default for calls/sms and data
pref.setOnPreferenceClickListener(clickedPref -> { pref.setOnPreferenceClickListener(clickedPref -> {
// TODO(asargent) - make this start MobileNetworkActivity once we've final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
// added support for it to take a subscription id intent.putExtra(Settings.EXTRA_SUB_ID, subId);
mContext.startActivity(intent);
return true; return true;
}); });

View File

@@ -25,7 +25,6 @@ import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.View; import android.view.View;
@@ -43,14 +42,12 @@ import com.android.settings.core.SettingsBaseActivity;
import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
public class MobileNetworkActivity extends SettingsBaseActivity { public class MobileNetworkActivity extends SettingsBaseActivity {
private static final String TAG = "MobileSettingsActivity"; private static final String TAG = "MobileNetworkActivity";
@VisibleForTesting @VisibleForTesting
static final String MOBILE_SETTINGS_TAG = "mobile_settings:"; static final String MOBILE_SETTINGS_TAG = "mobile_settings:";
@VisibleForTesting @VisibleForTesting
@@ -94,6 +91,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
actionBar.setDisplayHomeAsUpEnabled(true); 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); updateSubscriptions(savedInstanceState);
} }
@@ -136,25 +140,41 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
} }
/** /**
* Get the current subId to display. First check whether intent has {@link * Get the current subscription to display. First check whether intent has {@link
* Settings#EXTRA_SUB_ID}. If not, just display first one in list * Settings#EXTRA_SUB_ID} and if so find the subscription with that id. If not, just return the
* since it is already sorted by sim slot. * first one in the mSubscriptionInfos list since it is already sorted by sim slot.
*/ */
@VisibleForTesting @VisibleForTesting
int getSubscriptionId() { SubscriptionInfo getSubscription() {
final Intent intent = getIntent(); final Intent intent = getIntent();
if (intent != null) { if (intent != null) {
final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
if (subId != SUB_ID_NULL && mSubscriptionManager.isActiveSubscriptionId(subId)) { if (subId != SUB_ID_NULL) {
return subId; for (SubscriptionInfo subscription :
mSubscriptionManager.getAvailableSubscriptionInfoList()) {
if (subscription.getSubscriptionId() == subId) {
return subscription;
}
}
} }
} }
if (CollectionUtils.isEmpty(mSubscriptionInfos)) { 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 @VisibleForTesting

View File

@@ -16,33 +16,40 @@
package com.android.settings.network; package com.android.settings.network;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -70,7 +77,7 @@ public class SubscriptionsPreferenceControllerTest {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(Robolectric.setupActivity(Activity.class));
mLifecycleOwner = () -> mLifecycle; mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner); mLifecycle = new Lifecycle(mLifecycleOwner);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
@@ -83,6 +90,11 @@ public class SubscriptionsPreferenceControllerTest {
KEY, 5); KEY, 5);
} }
@After
public void tearDown() {
SubscriptionUtil.setAvailableSubscriptionsForTesting(null);
}
@Test @Test
public void isAvailable_oneSubscription_availableFalse() { public void isAvailable_oneSubscription_availableFalse() {
SubscriptionUtil.setAvailableSubscriptionsForTesting( SubscriptionUtil.setAvailableSubscriptionsForTesting(
@@ -215,4 +227,57 @@ public class SubscriptionsPreferenceControllerTest {
verify(mPreferenceCategory, times(3)).addPreference(captor.capture()); verify(mPreferenceCategory, times(3)).addPreference(captor.capture());
assertThat(captor.getValue().getTitle()).isEqualTo("sub3"); 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);
}
} }

View File

@@ -143,6 +143,9 @@ public class MobileNetworkActivityTest {
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID); intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID);
doReturn(intent).when(mMobileNetworkActivity).getIntent(); doReturn(intent).when(mMobileNetworkActivity).getIntent();
mSubscriptionInfos.add(mSubscriptionInfo);
mSubscriptionInfos.add(mSubscriptionInfo2);
doReturn(mSubscriptionInfos).when(mSubscriptionManager).getAvailableSubscriptionInfoList();
doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID); doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID);
assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID); assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID);