From 52c21e34536948ffb02323ffbb2288716854665a Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 31 May 2016 09:12:20 -0700 Subject: [PATCH] Setup user restrictions for demo user Prevent certain actions by demo user Also eliminate immersive mode confirmation when device is in demo mode. Bug: 27280140 Change-Id: I6955b7bb5c1ae13e1df36cef822b6fd39cb51e46 --- .../keyguard/KeyguardViewMediator.java | 2 +- .../server/am/RetailDemoModeService.java | 26 ++++++++++++++----- .../android/server/pm/UserManagerService.java | 5 ++-- .../policy/ImmersiveModeConfirmation.java | 4 ++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index c8e74ec1bf19f..3bbcf6eb99c54 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -360,7 +360,7 @@ public class KeyguardViewMediator extends SystemUI { mSwitchingUser = false; if (userId != UserHandle.USER_SYSTEM) { UserInfo info = UserManager.get(mContext).getUserInfo(userId); - if (info != null && info.isGuest()) { + if (info != null && (info.isGuest() || info.isDemo())) { // If we just switched to a guest, try to dismiss keyguard. dismiss(); } diff --git a/services/core/java/com/android/server/am/RetailDemoModeService.java b/services/core/java/com/android/server/am/RetailDemoModeService.java index a1106f50ebeb2..a0d1c2466da77 100644 --- a/services/core/java/com/android/server/am/RetailDemoModeService.java +++ b/services/core/java/com/android/server/am/RetailDemoModeService.java @@ -40,6 +40,7 @@ import android.util.Slog; import com.android.internal.os.BackgroundThread; import com.android.internal.R; +import com.android.internal.widget.LockPatternUtils; import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.pm.UserManagerService; @@ -56,8 +57,8 @@ public class RetailDemoModeService extends SystemService { private static final long SCREEN_WAKEUP_DELAY = 5000; private ActivityManagerService mAms; - private UserManagerService mUms; private NotificationManager mNm; + private UserManager mUm; private PowerManager mPm; private PowerManager.WakeLock mWakeLock; private Handler mHandler; @@ -123,12 +124,26 @@ public class RetailDemoModeService extends SystemService { UserInfo demoUser = getUserManager().createUser(DEMO_USER_NAME, UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); if (demoUser != null) { + setupDemoUser(demoUser); getActivityManager().switchUser(demoUser.id); } } }); } + void setupDemoUser(UserInfo userInfo) { + UserManager um = getUserManager(); + UserHandle user = UserHandle.of(userInfo.id); + LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); + lockPatternUtils.setLockScreenDisabled(true, userInfo.id); + um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); + um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); + um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); + um.setUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER, true, user); + Settings.Secure.putIntForUser(getContext().getContentResolver(), + Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); + } + private ActivityManagerService getActivityManager() { if (mAms == null) { mAms = (ActivityManagerService) ActivityManagerNative.getDefault(); @@ -136,12 +151,11 @@ public class RetailDemoModeService extends SystemService { return mAms; } - private UserManagerService getUserManager() { - if (mUms == null) { - mUms = (UserManagerService) UserManagerService.Stub - .asInterface(ServiceManager.getService(Context.USER_SERVICE)); + private UserManager getUserManager() { + if (mUm == null) { + mUm = getContext().getSystemService(UserManager.class); } - return mUms; + return mUm; } private void registerSettingsChangeObserver() { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 9c62b2016595d..25c52aa890031 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2031,6 +2031,7 @@ public class UserManagerService extends IUserManager.Stub { final boolean isGuest = (flags & UserInfo.FLAG_GUEST) != 0; final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0; final boolean isRestricted = (flags & UserInfo.FLAG_RESTRICTED) != 0; + final boolean isDemo = (flags & UserInfo.FLAG_DEMO) != 0; final long ident = Binder.clearCallingIdentity(); UserInfo userInfo; UserData userData; @@ -2048,8 +2049,8 @@ public class UserManagerService extends IUserManager.Stub { Log.e(LOG_TAG, "Cannot add more managed profiles for user " + parentId); return null; } - if (!isGuest && !isManagedProfile && isUserLimitReached()) { - // If we're not adding a guest user or a managed profile and the limit has + if (!isGuest && !isManagedProfile && !isDemo && isUserLimitReached()) { + // If we're not adding a guest/demo user or a managed profile and the limit has // been reached, cannot add a user. return null; } diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index a77d512201ed3..2e32fe3817224 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -30,6 +30,7 @@ import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.service.vr.IVrManager; import android.service.vr.IVrStateCallbacks; @@ -142,7 +143,8 @@ public class ImmersiveModeConfirmation { if (!disabled && (DEBUG_SHOW_EVERY_TIME || !mConfirmed) && userSetupComplete - && !mVrModeEnabled) { + && !mVrModeEnabled + && !UserManager.isDeviceInDemoMode(mContext)) { mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs); } } else {