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
This commit is contained in:
@@ -29,6 +29,7 @@ import android.database.ContentObserver;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import android.os.UserManager;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.telephony.SubscriptionInfo;
|
import android.telephony.SubscriptionInfo;
|
||||||
import android.telephony.SubscriptionManager;
|
import android.telephony.SubscriptionManager;
|
||||||
@@ -79,19 +80,24 @@ public class MobileDataSlice implements CustomSliceable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Slice getSlice() {
|
public Slice getSlice() {
|
||||||
|
ListBuilder listBuilder = createListBuilder();
|
||||||
|
if (!isConfigMobileNetworksAllowed()) {
|
||||||
|
return listBuilder.build();
|
||||||
|
}
|
||||||
|
|
||||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||||
R.drawable.ic_network_cell);
|
R.drawable.ic_network_cell);
|
||||||
final String title = mContext.getText(R.string.mobile_data_settings_title).toString();
|
final String title = mContext.getText(R.string.mobile_data_settings_title).toString();
|
||||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
|
@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()) {
|
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()) {
|
if (!isMobileDataAvailable()) {
|
||||||
return null;
|
return listBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
final CharSequence summary = getSummary();
|
final CharSequence summary = getSummary();
|
||||||
@@ -109,11 +115,15 @@ public class MobileDataSlice implements CustomSliceable {
|
|||||||
rowBuilder.setSubtitle(summary);
|
rowBuilder.setSubtitle(summary);
|
||||||
}
|
}
|
||||||
|
|
||||||
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
|
return listBuilder
|
||||||
ListBuilder.INFINITY)
|
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
.addRow(rowBuilder);
|
.addRow(rowBuilder)
|
||||||
return listBuilder.build();
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
ListBuilder createListBuilder() {
|
||||||
|
return new ListBuilder(mContext, getUri(), ListBuilder.INFINITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -211,6 +221,19 @@ public class MobileDataSlice implements CustomSliceable {
|
|||||||
return mTelephonyManager.isDataEnabled();
|
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.
|
* Listener for mobile data state changes.
|
||||||
*
|
*
|
||||||
|
@@ -19,8 +19,10 @@ package com.android.settings.network.telephony;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
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;
|
||||||
@@ -37,6 +39,7 @@ import androidx.core.graphics.drawable.IconCompat;
|
|||||||
import androidx.slice.Slice;
|
import androidx.slice.Slice;
|
||||||
import androidx.slice.SliceMetadata;
|
import androidx.slice.SliceMetadata;
|
||||||
import androidx.slice.SliceProvider;
|
import androidx.slice.SliceProvider;
|
||||||
|
import androidx.slice.builders.ListBuilder;
|
||||||
import androidx.slice.core.SliceAction;
|
import androidx.slice.core.SliceAction;
|
||||||
import androidx.slice.widget.SliceLiveData;
|
import androidx.slice.widget.SliceLiveData;
|
||||||
|
|
||||||
@@ -68,6 +71,7 @@ public class MobileDataSliceTest {
|
|||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private MobileDataSlice mMobileDataSlice;
|
private MobileDataSlice mMobileDataSlice;
|
||||||
|
private ListBuilder mListBuilder;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -86,6 +90,8 @@ public class MobileDataSliceTest {
|
|||||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||||
|
|
||||||
mMobileDataSlice = spy(new MobileDataSlice(mContext));
|
mMobileDataSlice = spy(new MobileDataSlice(mContext));
|
||||||
|
mListBuilder = spy(mMobileDataSlice.createListBuilder());
|
||||||
|
doReturn(mListBuilder).when(mMobileDataSlice).createListBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -175,25 +181,41 @@ public class MobileDataSliceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() {
|
public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() {
|
||||||
when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(new ArrayList<>());
|
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
|
@Test
|
||||||
public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() {
|
public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() {
|
||||||
when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(null);
|
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
|
@Test
|
||||||
public void airplaneModeEnabled_slicePrimaryActionIsEmpty() {
|
public void airplaneModeEnabled_slicePrimaryActionIsEmpty() {
|
||||||
doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled();
|
doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled();
|
||||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user