Restrict WifiSlice functionality for guest user

- Hide Wi-Fi toggle and show Wi-Fi status only if the user is a guest.

Bug: 232798363
Test: manual test
make RunSettingsRoboTests ROBOTEST_FILTER=WifiSliceTest

Change-Id: I35418477808eb5082f4651f5689f018dbb8e42ac
This commit is contained in:
Weng Su
2022-06-09 06:07:55 +08:00
parent 7ab5a44498
commit 5f421125ab
2 changed files with 50 additions and 1 deletions

View File

@@ -34,7 +34,9 @@ import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Binder; import android.os.Binder;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -96,10 +98,18 @@ public class WifiSlice implements CustomSliceable {
@Override @Override
public Slice getSlice() { public Slice getSlice() {
final boolean isWifiEnabled = isWifiEnabled();
// If user is a guest just return a slice without a toggle.
if (isGuestUser(mContext)) {
Log.e(TAG, "Guest user is not allowed to configure Wi-Fi!");
EventLog.writeEvent(0x534e4554, "232798363", -1 /* UID */, "User is a guest");
return getListBuilder(isWifiEnabled, null /* wifiSliceItem */,
false /* isWiFiPermissionGranted */).build();
}
// If external calling package doesn't have Wi-Fi permission. // If external calling package doesn't have Wi-Fi permission.
final boolean isPermissionGranted = final boolean isPermissionGranted =
Utils.isSettingsIntelligence(mContext) || isPermissionGranted(mContext); Utils.isSettingsIntelligence(mContext) || isPermissionGranted(mContext);
final boolean isWifiEnabled = isWifiEnabled();
ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* wifiSliceItem */, ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* wifiSliceItem */,
isPermissionGranted); isPermissionGranted);
// If the caller doesn't have the permission granted, just return a slice without a toggle. // If the caller doesn't have the permission granted, just return a slice without a toggle.
@@ -139,6 +149,13 @@ public class WifiSlice implements CustomSliceable {
return listBuilder.build(); return listBuilder.build();
} }
protected static boolean isGuestUser(Context context) {
if (context == null) return false;
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) return false;
return userManager.isGuestUser();
}
private static boolean isPermissionGranted(Context settingsContext) { private static boolean isPermissionGranted(Context settingsContext) {
final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid();
final String callingPackage = settingsContext.getPackageManager() final String callingPackage = settingsContext.getPackageManager()

View File

@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.UserManager;
import androidx.slice.Slice; import androidx.slice.Slice;
import androidx.slice.SliceItem; import androidx.slice.SliceItem;
@@ -84,6 +85,8 @@ public class WifiSliceTest {
@Spy @Spy
Context mContext = ApplicationProvider.getApplicationContext(); Context mContext = ApplicationProvider.getApplicationContext();
@Mock @Mock
private UserManager mUserManager;
@Mock
private WifiManager mWifiManager; private WifiManager mWifiManager;
@Mock @Mock
private PackageManager mPackageManager; private PackageManager mPackageManager;
@@ -98,6 +101,8 @@ public class WifiSliceTest {
@Before @Before
public void setUp() { public void setUp() {
doReturn(mResolver).when(mContext).getContentResolver(); doReturn(mResolver).when(mContext).getContentResolver();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(false).when(mUserManager).isGuestUser();
doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class); doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class);
doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState();
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
@@ -113,6 +118,33 @@ public class WifiSliceTest {
mWifiSlice = new WifiSlice(mContext, mWifiRestriction); mWifiSlice = new WifiSlice(mContext, mWifiRestriction);
} }
@Test
public void getWifiSlice_isGuestUser_shouldReturnNoToggle() {
doReturn(true).when(mUserManager).isGuestUser();
final Slice wifiSlice = mWifiSlice.getSlice();
final SliceMetadata metadata = SliceMetadata.from(mContext, wifiSlice);
final List<SliceAction> toggles = metadata.getToggles();
assertThat(toggles).hasSize(0);
final int rows = SliceQuery.findAll(wifiSlice, FORMAT_SLICE, HINT_LIST_ITEM,
null /* nonHints */).size();
// Title row
assertThat(rows).isEqualTo(1);
}
@Test
public void getWifiSlice_isNotGuestUser_shouldHaveTitleAndToggle() {
doReturn(false).when(mUserManager).isGuestUser();
final Slice wifiSlice = mWifiSlice.getSlice();
assertThat(wifiSlice).isNotNull();
final SliceMetadata metadata = SliceMetadata.from(mContext, wifiSlice);
final List<SliceAction> toggles = metadata.getToggles();
assertThat(toggles).hasSize(1);
}
@Test @Test
public void getWifiSlice_fromSIPackage_shouldHaveTitleAndToggle() { public void getWifiSlice_fromSIPackage_shouldHaveTitleAndToggle() {
when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName}); when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName});