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

Commit f16c90f9 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Show mobile data icon with carrier Wi-Fi level in Settings" into tm-dev

parents a47f9bb1 f8f2d17b
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.net.wifi.WifiManager;
import android.os.UserManager;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
@@ -65,6 +64,7 @@ import com.android.settingslib.mobile.MobileMappings;
import com.android.settingslib.mobile.MobileMappings.Config;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.SignalStrengthUtil;
import com.android.wifitrackerlib.WifiEntry;

import java.util.Collections;
import java.util.List;
@@ -282,16 +282,18 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
        return Html.fromHtml(result, Html.FROM_HTML_MODE_LEGACY);
    }

    private Drawable getIcon(int subId) {
    @VisibleForTesting
    Drawable getIcon(int subId) {
        final TelephonyManager tmForSubId = mTelephonyManager.createForSubscriptionId(subId);
        final SignalStrength strength = tmForSubId.getSignalStrength();
        int level = (strength == null) ? 0 : strength.getLevel();
        int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
        boolean isCarrierNetworkActive = isCarrierNetworkActive();
        if (shouldInflateSignalStrength(subId) || isCarrierNetworkActive) {
            level = isCarrierNetworkActive
                    ? SignalStrength.NUM_SIGNAL_STRENGTH_BINS
                    : (level + 1);
        if (isCarrierNetworkActive) {
            level = getCarrierNetworkLevel();
            numLevels = WifiEntry.WIFI_LEVEL_MAX + 1;
        } else if (shouldInflateSignalStrength(subId)) {
            level += 1;
            numLevels += 1;
        }

@@ -488,6 +490,11 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
                && mWifiPickerTrackerHelper.isCarrierNetworkActive();
    }

    private int getCarrierNetworkLevel() {
        if (mWifiPickerTrackerHelper == null) return WifiEntry.WIFI_LEVEL_MIN;
        return mWifiPickerTrackerHelper.getCarrierNetworkLevel();
    }

    /**
     * To inject necessary data from each static api.
     */
+11 −0
Original line number Diff line number Diff line
@@ -155,6 +155,17 @@ public class WifiPickerTrackerHelper implements LifecycleObserver {
        return mergedCarrierEntry.getSsid();
    }

    /** Return the carrier network level */
    public int getCarrierNetworkLevel() {
        final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry();
        if (mergedCarrierEntry == null) return WifiEntry.WIFI_LEVEL_MIN;

        int level = mergedCarrierEntry.getLevel();
        // To avoid icons not found with WIFI_LEVEL_UNREACHABLE(-1), use WIFI_LEVEL_MIN(0) instead.
        if (level < WifiEntry.WIFI_LEVEL_MIN) level = WifiEntry.WIFI_LEVEL_MIN;
        return level;
    }

    @VisibleForTesting
    void setWifiPickerTracker(@NonNull WifiPickerTracker wifiPickerTracker) {
        mWifiPickerTracker = wifiPickerTracker;
+61 −18
Original line number Diff line number Diff line
@@ -20,12 +20,14 @@ import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GOOD;
import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GREAT;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;

import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
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.never;
@@ -55,7 +57,6 @@ import android.text.Html;

import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -78,12 +79,12 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@RunWith(AndroidJUnit4.class)
public class SubscriptionsPreferenceControllerTest {
    private static final String KEY = "preference_group";
    private static final int SUB_ID = 1;

    @Mock
    private UserManager mUserManager;
@@ -105,6 +106,10 @@ public class SubscriptionsPreferenceControllerTest {
    private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
    @Mock
    private WifiManager mWifiManager;
    @Mock
    private SignalStrength mSignalStrength;
    @Mock
    private ServiceState mServiceState;

    private LifecycleRegistry mLifecycleRegistry;
    private int mOnChildUpdatedCount;
@@ -116,6 +121,7 @@ public class SubscriptionsPreferenceControllerTest {
    private NetworkCapabilities mNetworkCapabilities;
    private FakeSubscriptionsPreferenceController mController;
    private static SubsPrefCtrlInjector sInjector;
    private NetworkRegistrationInfo mNetworkRegistrationInfo;

    @Before
    public void setUp() {
@@ -131,6 +137,12 @@ public class SubscriptionsPreferenceControllerTest {
        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
        when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
        when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
        when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GREAT);
        when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
        mNetworkRegistrationInfo = createNetworkRegistrationInfo(false /* dateState */);
        when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt()))
                .thenReturn(mNetworkRegistrationInfo);
        when(mTelephonyManager.getSignalStrength()).thenReturn(mSignalStrength);
        when(mConnectivityManager.getActiveNetwork()).thenReturn(mActiveNetwork);
        when(mConnectivityManager.getNetworkCapabilities(mActiveNetwork))
                .thenReturn(mNetworkCapabilities);
@@ -153,6 +165,7 @@ public class SubscriptionsPreferenceControllerTest {
        mController =  new FakeSubscriptionsPreferenceController(mContext, mLifecycle,
                mUpdateListener, KEY, 5);
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
        mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
    }

    @After
@@ -284,7 +297,6 @@ public class SubscriptionsPreferenceControllerTest {
        doReturn(networkType)
                .when(sInjector).getNetworkType(any(), any(), any(), anyInt(), eq(true));
        doReturn(true).when(mWifiPickerTrackerHelper).isCarrierNetworkActive();
        mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);

        mController.onResume();
        mController.displayPreference(mPreferenceScreen);
@@ -524,12 +536,7 @@ public class SubscriptionsPreferenceControllerTest {
        mController.displayPreference(mPreferenceScreen);
        Drawable actualIcon = mPreferenceCategory.getPreference(0).getIcon();
        ServiceState ss = mock(ServiceState.class);
        NetworkRegistrationInfo regInfo = new NetworkRegistrationInfo.Builder()
                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE)
                .build();
        NetworkRegistrationInfo regInfo = createNetworkRegistrationInfo(true /* dataState */);
        doReturn(ss).when(mTelephonyManagerForSub).getServiceState();
        doReturn(regInfo).when(ss).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS,
@@ -538,10 +545,43 @@ public class SubscriptionsPreferenceControllerTest {
        assertThat(icon).isEqualTo(actualIcon);
    }

    @Test
    @UiThreadTest
    public void getIcon_carrierNetworkIsNotActive_useMobileDataLevel() {
        // Fake mobile data active and level is SIGNAL_STRENGTH_GOOD(3)
        mNetworkRegistrationInfo = createNetworkRegistrationInfo(true /* dateState */);
        when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt()))
                .thenReturn(mNetworkRegistrationInfo);
        when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GOOD);
        // Fake carrier network not active and level is WIFI_LEVEL_MAX(4)
        when(mWifiPickerTrackerHelper.isCarrierNetworkActive()).thenReturn(false);
        when(mWifiPickerTrackerHelper.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX);

        mController.getIcon(SUB_ID);

        verify(sInjector).getIcon(any(), eq(SIGNAL_STRENGTH_GOOD), anyInt(), anyBoolean());
    }

    @Test
    @UiThreadTest
    public void getIcon_carrierNetworkIsActive_useCarrierNetworkLevel() {
        // Fake mobile data not active and level is SIGNAL_STRENGTH_GOOD(3)
        mNetworkRegistrationInfo = createNetworkRegistrationInfo(false /* dateState */);
        when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt()))
                .thenReturn(mNetworkRegistrationInfo);
        when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GOOD);
        // Fake carrier network active and level is WIFI_LEVEL_MAX(4)
        when(mWifiPickerTrackerHelper.isCarrierNetworkActive()).thenReturn(true);
        when(mWifiPickerTrackerHelper.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX);

        mController.getIcon(SUB_ID);

        verify(sInjector).getIcon(any(), eq(WIFI_LEVEL_MAX), anyInt(), anyBoolean());
    }

    @Test
    public void connectCarrierNetwork_isDataEnabled_helperConnect() {
        when(mTelephonyManager.isDataEnabled()).thenReturn(true);
        mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);

        mController.connectCarrierNetwork();

@@ -551,7 +591,6 @@ public class SubscriptionsPreferenceControllerTest {
    @Test
    public void connectCarrierNetwork_isNotDataEnabled_helperNeverConnect() {
        when(mTelephonyManager.isDataEnabled()).thenReturn(false);
        mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);

        mController.connectCarrierNetwork();

@@ -564,18 +603,22 @@ public class SubscriptionsPreferenceControllerTest {
        doReturn(isActiveCellularNetwork).when(sInjector).isActiveCellularNetwork(mContext);
        doReturn(isDataEnable).when(mTelephonyManagerForSub).isDataEnabled();
        ServiceState ss = mock(ServiceState.class);
        NetworkRegistrationInfo regInfo = new NetworkRegistrationInfo.Builder()
        NetworkRegistrationInfo regInfo = createNetworkRegistrationInfo(dataState);
        doReturn(ss).when(mTelephonyManagerForSub).getServiceState();
        doReturn(servicestate).when(ss).getState();
        doReturn(regInfo).when(ss).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
    }

    private NetworkRegistrationInfo createNetworkRegistrationInfo(boolean dataState) {
        return new NetworkRegistrationInfo.Builder()
                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .setRegistrationState(dataState ? NetworkRegistrationInfo.REGISTRATION_STATE_HOME
                        : NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING)
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE)
                .build();
        doReturn(ss).when(mTelephonyManagerForSub).getServiceState();
        doReturn(servicestate).when(ss).getState();
        doReturn(regInfo).when(ss).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
    }

    private List<SubscriptionInfo> setupMockSubscriptions(int count) {
+35 −14
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.settings.wifi;

import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX;
import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MIN;
import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_UNREACHABLE;

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

import static org.mockito.ArgumentMatchers.any;
@@ -23,7 +27,6 @@ import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -48,6 +51,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

@@ -58,6 +62,8 @@ public class WifiPickerTrackerHelperTest {

    @Rule
    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
    @Spy
    Context mContext = ApplicationProvider.getApplicationContext();
    @Mock
    public WifiManager mWifiManager;
    @Mock
@@ -76,11 +82,10 @@ public class WifiPickerTrackerHelperTest {

    @Before
    public void setUp() {
        final Context context = spy(ApplicationProvider.getApplicationContext());
        when(context.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
        when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
        mCarrierConfig = new PersistableBundle();
        when(mCarrierConfigCache.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
        CarrierConfigCache.setTestInstance(context, mCarrierConfigCache);
        CarrierConfigCache.setTestInstance(mContext, mCarrierConfigCache);

        mFeatureFactory = FakeFeatureFactory.setupForTest();
        when(mFeatureFactory.wifiTrackerLibProvider
@@ -88,7 +93,9 @@ public class WifiPickerTrackerHelperTest {
                        any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
                .thenReturn(mWifiPickerTracker);
        mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(mock(Lifecycle.class),
                context, null);
                mContext, null);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
    }

    @Test
@@ -140,9 +147,6 @@ public class WifiPickerTrackerHelperTest {

    @Test
    public void setCarrierNetworkEnabled_shouldSetCorrect() {
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);

        mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true);

        verify(mMergedCarrierEntry).setEnabled(true);
@@ -154,7 +158,6 @@ public class WifiPickerTrackerHelperTest {

    @Test
    public void setCarrierNetworkEnabled_mergedCarrierEntryIsNull_shouldNotSet() {
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);

        mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true);
@@ -168,8 +171,6 @@ public class WifiPickerTrackerHelperTest {

    @Test
    public void connectCarrierNetwork_returnTrueAndConnect() {
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
        when(mMergedCarrierEntry.canConnect()).thenReturn(true);

        assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isTrue();
@@ -178,7 +179,6 @@ public class WifiPickerTrackerHelperTest {

    @Test
    public void connectCarrierNetwork_mergedCarrierEntryIsNull_returnFalse() {
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);

        assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
@@ -186,11 +186,32 @@ public class WifiPickerTrackerHelperTest {

    @Test
    public void connectCarrierNetwork_canConnectIsFalse_returnFalseAndNeverConnect() {
        mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
        when(mMergedCarrierEntry.canConnect()).thenReturn(false);

        assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
        verify(mMergedCarrierEntry, never()).connect(mConnectCallback);
    }

    @Test
    public void getCarrierNetworkLevel_mergedCarrierEntryIsNull_returnMinLevel() {
        when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);

        assertThat(mWifiPickerTrackerHelper.getCarrierNetworkLevel()).isEqualTo(WIFI_LEVEL_MIN);
    }

    @Test
    public void getCarrierNetworkLevel_getUnreachableLevel_returnMinLevel() {
        when(mMergedCarrierEntry.getLevel()).thenReturn(WIFI_LEVEL_UNREACHABLE);

        assertThat(mWifiPickerTrackerHelper.getCarrierNetworkLevel()).isEqualTo(WIFI_LEVEL_MIN);
    }

    @Test
    public void getCarrierNetworkLevel_getAvailableLevel_returnSameLevel() {
        for (int level = WIFI_LEVEL_MIN; level <= WIFI_LEVEL_MAX; level++) {
            when(mMergedCarrierEntry.getLevel()).thenReturn(level);

            assertThat(mWifiPickerTrackerHelper.getCarrierNetworkLevel()).isEqualTo(level);
        }
    }
}