From 3fd80809ccd74caf85e8ebd167d0a38e5f8f1520 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Tue, 26 Feb 2019 08:51:10 +0800 Subject: [PATCH] Use Device Policy dialog in switchbar We need to pop dialog when switchbar is disabled by Device Policy Test: visual, robolectric Fixes: 124855614 Change-Id: Ief65baa2c4912cb7c85d5eccc2c0f363d2fc898b --- .../users/MultiUserSwitchBarController.java | 22 ++++- .../testutils/shadow/ShadowUserManager.java | 17 ++++ .../MultiUserSwitchBarControllerTest.java | 83 +++++++++++++++++++ 3 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java diff --git a/src/com/android/settings/users/MultiUserSwitchBarController.java b/src/com/android/settings/users/MultiUserSwitchBarController.java index 9588f714648..58de14963fa 100644 --- a/src/com/android/settings/users/MultiUserSwitchBarController.java +++ b/src/com/android/settings/users/MultiUserSwitchBarController.java @@ -17,27 +17,34 @@ package com.android.settings.users; import android.content.Context; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.util.Log; +import androidx.annotation.VisibleForTesting; + import com.android.settings.widget.SwitchWidgetController; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; public class MultiUserSwitchBarController implements SwitchWidgetController.OnSwitchChangeListener, LifecycleObserver, OnStart, OnStop { + private static final String TAG = "MultiUserSwitchBarCtrl"; interface OnMultiUserSwitchChangedListener { void onMultiUserSwitchChanged(boolean newState); } + @VisibleForTesting + final SwitchWidgetController mSwitchBar; - private static final String TAG = "MultiUserSwitchBarCtrl"; private final Context mContext; - private final SwitchWidgetController mSwitchBar; private final UserCapabilities mUserCapabilities; private final OnMultiUserSwitchChangedListener mListener; + MultiUserSwitchBarController(Context context, SwitchWidgetController switchBar, OnMultiUserSwitchChangedListener listener) { mContext = context; @@ -45,8 +52,15 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw mListener = listener; mUserCapabilities = UserCapabilities.create(context); mSwitchBar.setChecked(mUserCapabilities.mUserSwitcherEnabled); - mSwitchBar.setEnabled(!mUserCapabilities.mDisallowSwitchUser - && !mUserCapabilities.mIsGuest && mUserCapabilities.isAdmin()); + + if (mUserCapabilities.mDisallowSwitchUser) { + mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal + .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH, + UserHandle.myUserId())); + } else { + mSwitchBar.setEnabled(!mUserCapabilities.mDisallowSwitchUser + && !mUserCapabilities.mIsGuest && mUserCapabilities.isAdmin()); + } mSwitchBar.setListener(this); } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java index 9a18c1f9aaf..bceba3c9864 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java @@ -26,6 +26,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.shadow.api.Shadow; +import org.robolectric.annotation.Resetter; import java.util.ArrayList; import java.util.Collections; @@ -38,6 +39,8 @@ import java.util.Set; @Implements(value = UserManager.class) public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager { + private static boolean sIsSupportsMultipleUsers; + private final List mRestrictions = new ArrayList<>(); private final Map> mRestrictionSources = new HashMap<>(); private final List mUserProfileInfos = new ArrayList<>(); @@ -50,6 +53,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager mUserProfileInfos.add(userInfo); } + @Resetter + public static void reset() { + sIsSupportsMultipleUsers = false; + } + @Implementation protected List getProfiles(@UserIdInt int userHandle) { return mUserProfileInfos; @@ -124,4 +132,13 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager public void setUserSwitcherEnabled(boolean userSwitchEnabled) { mUserSwitchEnabled = userSwitchEnabled; } + + @Implementation + protected static boolean supportsMultipleUsers() { + return sIsSupportsMultipleUsers; + } + + public void setSupportsMultipleUsers(boolean supports) { + sIsSupportsMultipleUsers = supports; + } } diff --git a/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java new file mode 100644 index 00000000000..718e01bebe0 --- /dev/null +++ b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.users; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.os.UserHandle; +import android.os.UserManager; + +import com.android.settings.testutils.shadow.ShadowUserManager; +import com.android.settings.widget.SwitchBar; +import com.android.settings.widget.SwitchBarController; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowUserManager.class}) +public class MultiUserSwitchBarControllerTest { + + private Context mContext; + private ShadowUserManager mUserManager; + private SwitchBarController mSwitchBarController; + + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mUserManager = ShadowUserManager.getShadow(); + mSwitchBarController = spy(new SwitchBarController(new SwitchBar(mContext))); + mUserManager.setSupportsMultipleUsers(true); + } + + @After + public void tearDown() { + ShadowUserManager.reset(); + } + + @Test + public void onStart_disallowUserSwitch_shouldSetDisabledByAdmin() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, true); + + final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, + mSwitchBarController, null); + + verify(mSwitchBarController).setDisabledByAdmin(any()); + } + + @Test + public void onStart_allowUserSwitch_shouldNotSetDisabledByAdmin() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, false); + + final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, + mSwitchBarController, null); + + verify(mSwitchBarController, never()).setDisabledByAdmin(any()); + } +}