Hide timeout to user0 pref when switching blocked.

Do not show the "timeout to admin user" settings preference when user
switching is blocked on the current user, e.g. in demo mode.

Test: atest SettingsRoboTests:TimeoutToDockUserPreferenceControllerTest
Bug: 255277938
Change-Id: Ibd0944c69254000a453f477eb72a0ba5832e9793
This commit is contained in:
Darrell Shi
2023-03-30 16:42:05 +00:00
parent 17e504f6a8
commit a86614db74
2 changed files with 28 additions and 2 deletions

View File

@@ -20,6 +20,7 @@ import static android.provider.Settings.Secure.TIMEOUT_TO_DOCK_USER;
import android.content.Context; import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -34,6 +35,8 @@ import java.util.Arrays;
* automatically switch to the designated Dock User when the device is docked. * automatically switch to the designated Dock User when the device is docked.
*/ */
public class TimeoutToDockUserPreferenceController extends BasePreferenceController { public class TimeoutToDockUserPreferenceController extends BasePreferenceController {
private final UserManager mUserManager;
private final String[] mEntries; private final String[] mEntries;
private final String[] mValues; private final String[] mValues;
@@ -41,6 +44,8 @@ public class TimeoutToDockUserPreferenceController extends BasePreferenceControl
String preferenceKey) { String preferenceKey) {
super(context, preferenceKey); super(context, preferenceKey);
mUserManager = context.getSystemService(UserManager.class);
mEntries = mContext.getResources().getStringArray( mEntries = mContext.getResources().getStringArray(
com.android.settings.R.array.switch_to_dock_user_when_docked_timeout_entries); com.android.settings.R.array.switch_to_dock_user_when_docked_timeout_entries);
mValues = mContext.getResources().getStringArray( mValues = mContext.getResources().getStringArray(
@@ -62,9 +67,10 @@ public class TimeoutToDockUserPreferenceController extends BasePreferenceControl
return UNSUPPORTED_ON_DEVICE; return UNSUPPORTED_ON_DEVICE;
} }
// Multi-user feature disabled by user. // Multi-user feature disabled by user, or user switching blocked on the user.
if (Settings.Global.getInt(mContext.getContentResolver(), if (Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.USER_SWITCHER_ENABLED, 0) != 1) { Settings.Global.USER_SWITCHER_ENABLED, 0) != 1
|| mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)) {
return CONDITIONALLY_UNAVAILABLE; return CONDITIONALLY_UNAVAILABLE;
} }

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
@@ -41,6 +42,8 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -51,6 +54,9 @@ public class TimeoutToDockUserPreferenceControllerTest {
private Resources mResources; private Resources mResources;
private TimeoutToDockUserPreferenceController mController; private TimeoutToDockUserPreferenceController mController;
@Mock
private UserManager mUserManager;
private static final String FAKE_PREFERENCE_KEY = "timeout_to_dock_user_preference"; private static final String FAKE_PREFERENCE_KEY = "timeout_to_dock_user_preference";
private String[] mEntries; private String[] mEntries;
@@ -58,9 +64,12 @@ public class TimeoutToDockUserPreferenceControllerTest {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext()); mContext = spy(ApplicationProvider.getApplicationContext());
mResources = spy(mContext.getResources()); mResources = spy(mContext.getResources());
doReturn(mResources).when(mContext).getResources(); doReturn(mResources).when(mContext).getResources();
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mEntries = mResources.getStringArray( mEntries = mResources.getStringArray(
R.array.switch_to_dock_user_when_docked_timeout_entries); R.array.switch_to_dock_user_when_docked_timeout_entries);
@@ -78,6 +87,9 @@ public class TimeoutToDockUserPreferenceControllerTest {
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED, Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED,
1); 1);
// User switching not blocked.
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
// Set to user 1; // Set to user 1;
ShadowUserHandle.setUid(1); ShadowUserHandle.setUid(1);
} }
@@ -106,6 +118,14 @@ public class TimeoutToDockUserPreferenceControllerTest {
BasePreferenceController.CONDITIONALLY_UNAVAILABLE); BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
} }
@Test
public void getAvailabilityStatus_userSwitchingBlocked_returnConditionallyUnavailable() {
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test @Test
public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() { public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() {
when(Utils.canCurrentUserDream(mContext)).thenReturn(true); when(Utils.canCurrentUserDream(mContext)).thenReturn(true);