Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4646fe8e authored by Antony Sargent's avatar Antony Sargent
Browse files

Use active instead of available subscriptions in 2 places

In a couple of places we were showing DSDS UI using the list of
*available* subscriptions instead of the list of *active* ones. This
difference is relevant for instance if you have multiple eSIM profiles -
in typical hardware only one of those can be active at one time. This CL
fixes that problem in two places:

1) The header at the top of the Network & internet page

2) The ListPreference's on the mobile network detail page for selecting
   the default subscription for Calls / SMS.

Fixes: 129673046
Test: make RunSettingsRoboTests
Change-Id: I891c856bdd4516286fcee1067684d9161ceaca80
parent 81f31ef4
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -27,16 +27,33 @@ import java.util.Iterator;
import java.util.List;

public class SubscriptionUtil {
    private static List<SubscriptionInfo> sResultsForTesting;
    private static List<SubscriptionInfo> sAvailableResultsForTesting;
    private static List<SubscriptionInfo> sActiveResultsForTesting;

    @VisibleForTesting
    public static void setAvailableSubscriptionsForTesting(List<SubscriptionInfo> results) {
        sResultsForTesting = results;
        sAvailableResultsForTesting = results;
    }

    @VisibleForTesting
    public static void setActiveSubscriptionsForTesting(List<SubscriptionInfo> results) {
        sActiveResultsForTesting = results;
    }

    public static List<SubscriptionInfo> getActiveSubscriptions(SubscriptionManager manager) {
        if (sActiveResultsForTesting != null) {
            return sActiveResultsForTesting;
        }
        List<SubscriptionInfo> subscriptions = manager.getActiveSubscriptionInfoList(true);
        if (subscriptions == null) {
            return new ArrayList<>();
        }
        return subscriptions;
    }

    public static List<SubscriptionInfo> getAvailableSubscriptions(SubscriptionManager manager) {
        if (sResultsForTesting != null) {
            return sResultsForTesting;
        if (sAvailableResultsForTesting != null) {
            return sAvailableResultsForTesting;
        }
        List<SubscriptionInfo> subscriptions = manager.getSelectableSubscriptionInfoList();
        if (subscriptions == null) {
+2 −2
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
        mSubscriptionPreferences = new ArrayMap<>();

        int order = mStartOrder;
        for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mManager)) {
        for (SubscriptionInfo info : SubscriptionUtil.getActiveSubscriptions(mManager)) {
            final int subId = info.getSubscriptionId();
            Preference pref = existingPrefs.remove(subId);
            if (pref == null) {
@@ -216,7 +216,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
        if (mSubscriptionsListener.isAirplaneModeOn()) {
            return false;
        }
        return SubscriptionUtil.getAvailableSubscriptions(mManager).size() >= 2;
        return SubscriptionUtil.getActiveSubscriptions(mManager).size() >= 2;
    }

    @Override
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ public abstract class DefaultSubscriptionController extends BasePreferenceContro

    @Override
    public int getAvailabilityStatus() {
        final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager);
        final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
        if (subs.size() > 1) {
            return AVAILABLE;
        } else {
@@ -121,7 +121,7 @@ public abstract class DefaultSubscriptionController extends BasePreferenceContro
        }
        mPreference.setVisible(true);

        final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager);
        final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);

        // We'll have one entry for each available subscription, plus one for a "ask me every
        // time" entry at the end.
+29 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.network;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@@ -108,4 +109,32 @@ public class SubscriptionUtilTest {
        assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1);
        assertThat(subs.get(1).getSubscriptionId()).isEqualTo(4);
    }

    @Test
    public void getActiveSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
        when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(null);
        final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
        assertThat(subs).isNotNull();
        assertThat(subs).isEmpty();
    }

    @Test
    public void getActiveSubscriptions_oneSubscription_oneResult() {
        final SubscriptionInfo info = mock(SubscriptionInfo.class);
        when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(Arrays.asList(info));
        final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
        assertThat(subs).isNotNull();
        assertThat(subs).hasSize(1);
    }

    @Test
    public void getActiveSubscriptions_twoSubscriptions_twoResults() {
        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
        when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(
                Arrays.asList(info1, info2));
        final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
        assertThat(subs).isNotNull();
        assertThat(subs).hasSize(2);
    }
}
+17 −17
Original line number Diff line number Diff line
@@ -103,19 +103,19 @@ public class SubscriptionsPreferenceControllerTest {

    @After
    public void tearDown() {
        SubscriptionUtil.setAvailableSubscriptionsForTesting(null);
        SubscriptionUtil.setActiveSubscriptionsForTesting(null);
    }

    @Test
    public void isAvailable_oneSubscription_availableFalse() {
        SubscriptionUtil.setAvailableSubscriptionsForTesting(
        SubscriptionUtil.setActiveSubscriptionsForTesting(
                Arrays.asList(mock(SubscriptionInfo.class)));
        assertThat(mController.isAvailable()).isFalse();
    }

    @Test
    public void isAvailable_twoSubscriptions_availableTrue() {
        SubscriptionUtil.setAvailableSubscriptionsForTesting(
        SubscriptionUtil.setActiveSubscriptionsForTesting(
                Arrays.asList(mock(SubscriptionInfo.class), mock(SubscriptionInfo.class)));
        assertThat(mController.isAvailable()).isTrue();
    }
@@ -126,13 +126,13 @@ public class SubscriptionsPreferenceControllerTest {
        for (int i = 0; i < 5; i++) {
            subs.add(mock(SubscriptionInfo.class));
        }
        SubscriptionUtil.setAvailableSubscriptionsForTesting(subs);
        SubscriptionUtil.setActiveSubscriptionsForTesting(subs);
        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void isAvailable_airplaneModeOn_availableFalse() {
        SubscriptionUtil.setAvailableSubscriptionsForTesting(
        SubscriptionUtil.setActiveSubscriptionsForTesting(
                Arrays.asList(mock(SubscriptionInfo.class), mock(SubscriptionInfo.class)));
        assertThat(mController.isAvailable()).isTrue();
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
@@ -141,7 +141,7 @@ public class SubscriptionsPreferenceControllerTest {

    @Test
    public void onAirplaneModeChanged_airplaneModeTurnedOn_eventFired() {
        SubscriptionUtil.setAvailableSubscriptionsForTesting(
        SubscriptionUtil.setActiveSubscriptionsForTesting(
                Arrays.asList(mock(SubscriptionInfo.class), mock(SubscriptionInfo.class)));
        mController.onResume();
        mController.displayPreference(mScreen);
@@ -157,7 +157,7 @@ public class SubscriptionsPreferenceControllerTest {
    @Test
    public void onAirplaneModeChanged_airplaneModeTurnedOff_eventFired() {
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(
        SubscriptionUtil.setActiveSubscriptionsForTesting(
                Arrays.asList(mock(SubscriptionInfo.class), mock(SubscriptionInfo.class)));
        mController.onResume();
        mController.displayPreference(mScreen);
@@ -174,13 +174,13 @@ public class SubscriptionsPreferenceControllerTest {
    public void onSubscriptionsChanged_countBecameTwo_eventFired() {
        final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1));
        mController.onResume();
        mController.displayPreference(mScreen);
        assertThat(mController.isAvailable()).isFalse();

        final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        mController.onSubscriptionsChanged();
        assertThat(mController.isAvailable()).isTrue();
        assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
@@ -192,14 +192,14 @@ public class SubscriptionsPreferenceControllerTest {
        final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
        when(sub1.getSubscriptionId()).thenReturn(1);
        when(sub2.getSubscriptionId()).thenReturn(2);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        mController.onResume();
        mController.displayPreference(mScreen);
        assertThat(mController.isAvailable()).isTrue();
        verify(mPreferenceCategory, times(2)).addPreference(any(Preference.class));

        final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1));
        mController.onSubscriptionsChanged();
        assertThat(mController.isAvailable()).isFalse();
        assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
@@ -221,7 +221,7 @@ public class SubscriptionsPreferenceControllerTest {
        when(sub3.getSubscriptionId()).thenReturn(3);

        // Start out with only sub1 and sub2.
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        mController.onResume();
        mController.displayPreference(mScreen);
        final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class);
@@ -233,7 +233,7 @@ public class SubscriptionsPreferenceControllerTest {
        // Now replace sub2 with sub3, and make sure the old preference was removed and the new
        // preference was added.
        final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub3));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub3));
        mController.onSubscriptionsChanged();
        assertThat(mController.isAvailable()).isTrue();
        assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
@@ -259,7 +259,7 @@ public class SubscriptionsPreferenceControllerTest {
            doReturn(i + 1).when(sub).getSubscriptionId();
            subscriptions.add(sub);
        }
        SubscriptionUtil.setAvailableSubscriptionsForTesting(subscriptions);
        SubscriptionUtil.setActiveSubscriptionsForTesting(subscriptions);
        mController.displayPreference(mScreen);
        final ArgumentCaptor<Preference> prefCaptor = ArgumentCaptor.forClass(Preference.class);
        verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture());
@@ -303,7 +303,7 @@ public class SubscriptionsPreferenceControllerTest {
        final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
        when(sub1.getSubscriptionId()).thenReturn(11);
        when(sub2.getSubscriptionId()).thenReturn(22);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));

        ShadowSubscriptionManager.setDefaultDataSubscriptionId(11);
        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(11);
@@ -324,7 +324,7 @@ public class SubscriptionsPreferenceControllerTest {
        final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
        when(sub1.getSubscriptionId()).thenReturn(11);
        when(sub2.getSubscriptionId()).thenReturn(22);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));

        ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(11);
        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(11);
@@ -346,7 +346,7 @@ public class SubscriptionsPreferenceControllerTest {
        final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
        when(sub1.getSubscriptionId()).thenReturn(11);
        when(sub2.getSubscriptionId()).thenReturn(22);
        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));

        ShadowSubscriptionManager.setDefaultDataSubscriptionId(11);
        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(22);
Loading