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

Commit 5f421125 authored by Weng Su's avatar Weng Su
Browse files

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
parent 7ab5a444
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -34,7 +34,9 @@ import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;

import androidx.annotation.Nullable;
@@ -96,10 +98,18 @@ public class WifiSlice implements CustomSliceable {

    @Override
    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.
        final boolean isPermissionGranted =
                Utils.isSettingsIntelligence(mContext) || isPermissionGranted(mContext);
        final boolean isWifiEnabled = isWifiEnabled();
        ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* wifiSliceItem */,
                isPermissionGranted);
        // 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();
    }

    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) {
        final int callingUid = Binder.getCallingUid();
        final String callingPackage = settingsContext.getPackageManager()
+32 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.UserManager;

import androidx.slice.Slice;
import androidx.slice.SliceItem;
@@ -84,6 +85,8 @@ public class WifiSliceTest {
    @Spy
    Context mContext = ApplicationProvider.getApplicationContext();
    @Mock
    private UserManager mUserManager;
    @Mock
    private WifiManager mWifiManager;
    @Mock
    private PackageManager mPackageManager;
@@ -98,6 +101,8 @@ public class WifiSliceTest {
    @Before
    public void setUp() {
        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(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState();
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
@@ -113,6 +118,33 @@ public class WifiSliceTest {
        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
    public void getWifiSlice_fromSIPackage_shouldHaveTitleAndToggle() {
        when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName});