From 75a070f3f0834a79643f0d4e268c0c1c6bd6f26a Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 2 Aug 2024 19:44:50 +0800 Subject: [PATCH] Restrict MobileDataSlice - Hide MobileDataSlice if the user is not allowed to configure mobile networks. Bug: 310630794 Flag: EXEMPT bugfix Test: manual test atest -c MobileDataSliceTest Change-Id: I35814733a915f011e284b082ce7a94898ce8a6fb --- .../network/telephony/MobileDataSlice.java | 39 +++++++++++++++---- .../telephony/MobileDataSliceTest.java | 34 +++++++++++++--- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java index fd65e8562a2..f5e734d7e09 100644 --- a/src/com/android/settings/network/telephony/MobileDataSlice.java +++ b/src/com/android/settings/network/telephony/MobileDataSlice.java @@ -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; @@ -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(); @@ -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 @@ -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. * diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java index 8445fe22c9f..9cd69b4e4b0 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java @@ -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; @@ -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; @@ -68,6 +71,7 @@ public class MobileDataSliceTest { private Context mContext; private MobileDataSlice mMobileDataSlice; + private ListBuilder mListBuilder; @Before public void setUp() { @@ -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 @@ -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()); } }