diff options
author | Kenny Guy <kennyguy@google.com> | 2014-02-25 13:01:38 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-02-25 13:01:38 +0000 |
commit | e21c52a8c9ef27c348f784daa8ec384152c3264e (patch) | |
tree | f3a830421493265b9733289edf86afe564807813 | |
parent | f5a9ad1cd046439d8fe0eba883c35717a052943e (diff) | |
parent | 1a447535cef7e3739d5f763dfe13e568568b9789 (diff) | |
download | frameworks_base-e21c52a8c9ef27c348f784daa8ec384152c3264e.zip frameworks_base-e21c52a8c9ef27c348f784daa8ec384152c3264e.tar.gz frameworks_base-e21c52a8c9ef27c348f784daa8ec384152c3264e.tar.bz2 |
Merge "Hide managed profiles from user switchers."
9 files changed, 105 insertions, 78 deletions
diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index aa4a243..6f1d4f8 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -18,6 +18,7 @@ package android.content.pm; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemProperties; import android.os.UserHandle; /** @@ -116,6 +117,14 @@ public class UserInfo implements Parcelable { return (flags & FLAG_MANAGED_PROFILE) == FLAG_MANAGED_PROFILE; } + /** + * @return true if this user can be switched to. + **/ + public boolean supportsSwitchTo() { + // TODO remove fw.show_hidden_users when we have finished developing managed profiles. + return !isManagedProfile() || SystemProperties.getBoolean("fw.show_hidden_users", false); + } + public UserInfo() { } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 8f6dda1..1ec5cd5 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -164,11 +164,13 @@ public class UserManager { /** * Returns whether the system supports multiple users. - * @return true if multiple users can be created, false if it is a single user device. + * @return true if multiple users can be created by user, false if it is a single user device. * @hide */ public static boolean supportsMultipleUsers() { - return getMaxSupportedUsers() > 1; + return getMaxSupportedUsers() > 1 + && SystemProperties.getBoolean("fw.show_multiuserui", + Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI)); } /** @@ -601,6 +603,26 @@ public class UserManager { } /** + * Returns true if the user switcher should be shown, this will be if there + * are multiple users that aren't managed profiles. + * @hide + * @return true if user switcher should be shown. + */ + public boolean isUserSwitcherEnabled() { + List<UserInfo> users = getUsers(true); + if (users == null) { + return false; + } + int switchableUserCount = 0; + for (UserInfo user : users) { + if (user.supportsSwitchTo()) { + ++switchableUserCount; + } + } + return switchableUserCount > 1; + } + + /** * Returns a serial number on this device for a given userHandle. User handles can be recycled * when deleting and creating users, but serial numbers are not reused until the device is wiped. * @param userHandle diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 20a918e..8d68277 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1189,6 +1189,8 @@ <!-- Maximum number of supported users --> <integer name="config_multiuserMaximumUsers">1</integer> + <!-- Whether UI for multi user should be shown --> + <bool name="config_enableMultiUserUI">false</bool> <!-- Minimum span needed to begin a touch scaling gesture. If the span is equal to or greater than this size, a scaling gesture diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b1bf781..9f368c4 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -289,6 +289,7 @@ <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="bool" name="config_forceDefaultOrientation" /> <java-symbol type="bool" name="config_wifi_batched_scan_supported" /> + <java-symbol type="bool" name="config_enableMultiUserUI"/> <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_extraFreeKbytesAdjust" /> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index 7ac94bd..1e79ee4 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -1051,9 +1051,6 @@ public class KeyguardHostView extends KeyguardViewBase { } private void enableUserSelectorIfNecessary() { - if (!UserManager.supportsMultipleUsers()) { - return; // device doesn't support multi-user mode - } final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); if (um == null) { Throwable t = new Throwable(); @@ -1063,61 +1060,53 @@ public class KeyguardHostView extends KeyguardViewBase { } // if there are multiple users, we need to enable to multi-user switcher - final List<UserInfo> users = um.getUsers(true); - if (users == null) { - Throwable t = new Throwable(); - t.fillInStackTrace(); - Log.e(TAG, "list of users is null.", t); + if (!um.isUserSwitcherEnabled()) { return; } final View multiUserView = findViewById(R.id.keyguard_user_selector); if (multiUserView == null) { - Throwable t = new Throwable(); - t.fillInStackTrace(); - Log.e(TAG, "can't find user_selector in layout.", t); + if (DEBUG) Log.d(TAG, "can't find user_selector in layout."); return; } - if (users.size() > 1) { - if (multiUserView instanceof KeyguardMultiUserSelectorView) { - mKeyguardMultiUserSelectorView = (KeyguardMultiUserSelectorView) multiUserView; - mKeyguardMultiUserSelectorView.setVisibility(View.VISIBLE); - mKeyguardMultiUserSelectorView.addUsers(users); - UserSwitcherCallback callback = new UserSwitcherCallback() { - @Override - public void hideSecurityView(int duration) { - getSecurityContainer().animate().alpha(0).setDuration(duration); - } + if (multiUserView instanceof KeyguardMultiUserSelectorView) { + mKeyguardMultiUserSelectorView = (KeyguardMultiUserSelectorView) multiUserView; + mKeyguardMultiUserSelectorView.setVisibility(View.VISIBLE); + mKeyguardMultiUserSelectorView.addUsers(um.getUsers(true)); + UserSwitcherCallback callback = new UserSwitcherCallback() { + @Override + public void hideSecurityView(int duration) { + getSecurityContainer().animate().alpha(0).setDuration(duration); + } - @Override - public void showSecurityView() { - getSecurityContainer().setAlpha(1.0f); - } + @Override + public void showSecurityView() { + getSecurityContainer().setAlpha(1.0f); + } - @Override - public void showUnlockHint() { - if (getSecurityContainer() != null) { - getSecurityContainer().showUsabilityHint(); - } + @Override + public void showUnlockHint() { + if (getSecurityContainer() != null) { + getSecurityContainer().showUsabilityHint(); } + } - @Override - public void userActivity() { - if (mViewMediatorCallback != null) { - mViewMediatorCallback.userActivity(); - } + @Override + public void userActivity() { + if (mViewMediatorCallback != null) { + mViewMediatorCallback.userActivity(); } - }; - mKeyguardMultiUserSelectorView.setCallback(callback); - } else { - Throwable t = new Throwable(); - t.fillInStackTrace(); - if (multiUserView == null) { - Log.e(TAG, "could not find the user_selector.", t); - } else { - Log.e(TAG, "user_selector is the wrong type.", t); } + }; + mKeyguardMultiUserSelectorView.setCallback(callback); + } else { + Throwable t = new Throwable(); + t.fillInStackTrace(); + if (multiUserView == null) { + Log.e(TAG, "could not find the user_selector.", t); + } else { + Log.e(TAG, "user_selector is the wrong type.", t); } } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java index 7975d8e..06815e1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java @@ -76,11 +76,13 @@ public class KeyguardMultiUserSelectorView extends FrameLayout implements View.O Collections.sort(users, mOrderAddedComparator); for (UserInfo user: users) { - KeyguardMultiUserAvatar uv = createAndAddUser(user); - if (user.id == activeUser.id) { - mActiveUserAvatar = uv; + if (user.supportsSwitchTo()) { + KeyguardMultiUserAvatar uv = createAndAddUser(user); + if (user.id == activeUser.id) { + mActiveUserAvatar = uv; + } + uv.setActive(false, false, null); } - uv.setActive(false, false, null); } mActiveUserAvatar.lockPressed(true); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java index e0ee4e0..151177e 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java @@ -704,7 +704,7 @@ public class KeyguardViewMediator { private void maybeSendUserPresentBroadcast() { if (mSystemReady && mLockPatternUtils.isLockScreenDisabled() - && mUserManager.getUsers(true).size() == 1) { + && !mUserManager.isUserSwitcherEnabled()) { // Lock screen is disabled because the user has set the preference to "None". // In this case, send out ACTION_USER_PRESENT here instead of in // handleKeyguardDone() @@ -940,7 +940,7 @@ public class KeyguardViewMediator { return; } - if (mUserManager.getUsers(true).size() < 2 + if (!mUserManager.isUserSwitcherEnabled() && mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) { if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off"); return; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index 4d7ff5e..bcb818a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -312,7 +312,7 @@ class QuickSettings { public void onClick(View v) { collapsePanels(); final UserManager um = UserManager.get(mContext); - if (um.getUsers(true).size() > 1) { + if (um.isUserSwitcherEnabled()) { // Since keyguard and systemui were merged into the same process to save // memory, they share the same Looper and graphics context. As a result, // there's no way to allow concurrent animation while keyguard inflates. diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index f82ca22..0120a03 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -363,36 +363,38 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } private void addUsersToMenu(ArrayList<Action> items) { - List<UserInfo> users = ((UserManager) mContext.getSystemService(Context.USER_SERVICE)) - .getUsers(); - if (users.size() > 1) { + UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + if (um.isUserSwitcherEnabled()) { + List<UserInfo> users = um.getUsers(); UserInfo currentUser = getCurrentUser(); for (final UserInfo user : users) { - boolean isCurrentUser = currentUser == null - ? user.id == 0 : (currentUser.id == user.id); - Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath) - : null; - SinglePressAction switchToUser = new SinglePressAction( - com.android.internal.R.drawable.ic_menu_cc, icon, - (user.name != null ? user.name : "Primary") - + (isCurrentUser ? " \u2714" : "")) { - public void onPress() { - try { - ActivityManagerNative.getDefault().switchUser(user.id); - } catch (RemoteException re) { - Log.e(TAG, "Couldn't switch user " + re); + if (user.supportsSwitchTo()) { + boolean isCurrentUser = currentUser == null + ? user.id == 0 : (currentUser.id == user.id); + Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath) + : null; + SinglePressAction switchToUser = new SinglePressAction( + com.android.internal.R.drawable.ic_menu_cc, icon, + (user.name != null ? user.name : "Primary") + + (isCurrentUser ? " \u2714" : "")) { + public void onPress() { + try { + ActivityManagerNative.getDefault().switchUser(user.id); + } catch (RemoteException re) { + Log.e(TAG, "Couldn't switch user " + re); + } } - } - public boolean showDuringKeyguard() { - return true; - } + public boolean showDuringKeyguard() { + return true; + } - public boolean showBeforeProvisioning() { - return false; - } - }; - items.add(switchToUser); + public boolean showBeforeProvisioning() { + return false; + } + }; + items.add(switchToUser); + } } } } |