Loading src/com/android/settings/network/telephony/MobileDataSlice.java +31 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading Loading @@ -79,19 +80,24 @@ public class MobileDataSlice implements CustomSliceable { @Override public Slice getSlice() { ListBuilder listBuilder = createListBuilder(); if (!isConfigMobileNetworksAllowed()) { return listBuilder.build(); } final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_network_cell); final String title = mContext.getText(R.string.mobile_data_settings_title).toString(); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); // Return null until we can show a disabled-action Slice, blaming Airplane mode. // Return empty slice until we can show a disabled-action Slice, blaming Airplane mode. if (isAirplaneModeEnabled()) { return null; return listBuilder.build(); } // Return null until we can show a disabled-action Slice. // Return empty slice until we can show a disabled-action Slice. if (!isMobileDataAvailable()) { return null; return listBuilder.build(); } final CharSequence summary = getSummary(); Loading @@ -109,11 +115,15 @@ public class MobileDataSlice implements CustomSliceable { rowBuilder.setSubtitle(summary); } final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) return listBuilder .setAccentColor(color) .addRow(rowBuilder); return listBuilder.build(); .addRow(rowBuilder) .build(); } @VisibleForTesting ListBuilder createListBuilder() { return new ListBuilder(mContext, getUri(), ListBuilder.INFINITY); } @Override Loading Loading @@ -211,6 +221,19 @@ public class MobileDataSlice implements CustomSliceable { return mTelephonyManager.isDataEnabled(); } @VisibleForTesting boolean isConfigMobileNetworksAllowed() { if (mContext == null) return true; UserManager userManager = mContext.getSystemService(UserManager.class); if (userManager == null) return true; boolean isAllowed = userManager.isAdminUser() && !userManager.hasUserRestriction( UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); if (!isAllowed) { Log.w(TAG, "The user is not allowed to configure Mobile Networks."); } return isAllowed; } /** * Listener for mobile data state changes. * Loading tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java +28 −6 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.android.settings.network.telephony; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -37,6 +39,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; import androidx.slice.SliceMetadata; import androidx.slice.SliceProvider; import androidx.slice.builders.ListBuilder; import androidx.slice.core.SliceAction; import androidx.slice.widget.SliceLiveData; Loading Loading @@ -68,6 +71,7 @@ public class MobileDataSliceTest { private Context mContext; private MobileDataSlice mMobileDataSlice; private ListBuilder mListBuilder; @Before public void setUp() { Loading @@ -86,6 +90,8 @@ public class MobileDataSliceTest { SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); mMobileDataSlice = spy(new MobileDataSlice(mContext)); mListBuilder = spy(mMobileDataSlice.createListBuilder()); doReturn(mListBuilder).when(mMobileDataSlice).createListBuilder(); } @Test Loading Loading @@ -175,25 +181,41 @@ public class MobileDataSliceTest { @Test public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() { when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(new ArrayList<>()); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() { when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(null); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void airplaneModeEnabled_slicePrimaryActionIsEmpty() { doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled(); doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void getSlice_disallowConfigMobileNetworks_slicePrimaryActionIsEmpty() { doReturn(false).when(mMobileDataSlice).isConfigMobileNetworksAllowed(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } } Loading
src/com/android/settings/network/telephony/MobileDataSlice.java +31 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading Loading @@ -79,19 +80,24 @@ public class MobileDataSlice implements CustomSliceable { @Override public Slice getSlice() { ListBuilder listBuilder = createListBuilder(); if (!isConfigMobileNetworksAllowed()) { return listBuilder.build(); } final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_network_cell); final String title = mContext.getText(R.string.mobile_data_settings_title).toString(); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); // Return null until we can show a disabled-action Slice, blaming Airplane mode. // Return empty slice until we can show a disabled-action Slice, blaming Airplane mode. if (isAirplaneModeEnabled()) { return null; return listBuilder.build(); } // Return null until we can show a disabled-action Slice. // Return empty slice until we can show a disabled-action Slice. if (!isMobileDataAvailable()) { return null; return listBuilder.build(); } final CharSequence summary = getSummary(); Loading @@ -109,11 +115,15 @@ public class MobileDataSlice implements CustomSliceable { rowBuilder.setSubtitle(summary); } final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) return listBuilder .setAccentColor(color) .addRow(rowBuilder); return listBuilder.build(); .addRow(rowBuilder) .build(); } @VisibleForTesting ListBuilder createListBuilder() { return new ListBuilder(mContext, getUri(), ListBuilder.INFINITY); } @Override Loading Loading @@ -211,6 +221,19 @@ public class MobileDataSlice implements CustomSliceable { return mTelephonyManager.isDataEnabled(); } @VisibleForTesting boolean isConfigMobileNetworksAllowed() { if (mContext == null) return true; UserManager userManager = mContext.getSystemService(UserManager.class); if (userManager == null) return true; boolean isAllowed = userManager.isAdminUser() && !userManager.hasUserRestriction( UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); if (!isAllowed) { Log.w(TAG, "The user is not allowed to configure Mobile Networks."); } return isAllowed; } /** * Listener for mobile data state changes. * Loading
tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java +28 −6 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.android.settings.network.telephony; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -37,6 +39,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; import androidx.slice.SliceMetadata; import androidx.slice.SliceProvider; import androidx.slice.builders.ListBuilder; import androidx.slice.core.SliceAction; import androidx.slice.widget.SliceLiveData; Loading Loading @@ -68,6 +71,7 @@ public class MobileDataSliceTest { private Context mContext; private MobileDataSlice mMobileDataSlice; private ListBuilder mListBuilder; @Before public void setUp() { Loading @@ -86,6 +90,8 @@ public class MobileDataSliceTest { SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); mMobileDataSlice = spy(new MobileDataSlice(mContext)); mListBuilder = spy(mMobileDataSlice.createListBuilder()); doReturn(mListBuilder).when(mMobileDataSlice).createListBuilder(); } @Test Loading Loading @@ -175,25 +181,41 @@ public class MobileDataSliceTest { @Test public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() { when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(new ArrayList<>()); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() { when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(null); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void airplaneModeEnabled_slicePrimaryActionIsEmpty() { doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled(); doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID); final Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNull(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } @Test public void getSlice_disallowConfigMobileNetworks_slicePrimaryActionIsEmpty() { doReturn(false).when(mMobileDataSlice).isConfigMobileNetworksAllowed(); Slice mobileData = mMobileDataSlice.getSlice(); assertThat(mobileData).isNotNull(); verify(mListBuilder, never()).addRow(any()); } }