UserCapabilities.java revision ffae4c1a0eb57d2201a67951a3368daebcbab76e
1c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling/* 2c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * Copyright (C) 2016 The Android Open Source Project 3c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * 4c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * Licensed under the Apache License, Version 2.0 (the "License"); 5c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * you may not use this file except in compliance with the License. 6c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * You may obtain a copy of the License at 7c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * 8c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * http://www.apache.org/licenses/LICENSE-2.0 9c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * 10c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * Unless required by applicable law or agreed to in writing, software 11c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * distributed under the License is distributed on an "AS IS" BASIS, 12c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * See the License for the specific language governing permissions and 14c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling * limitations under the License. 15c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling */ 16c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 17c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingpackage com.android.settings.users; 18c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 19c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.app.admin.DevicePolicyManager; 20c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.content.Context; 21c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.content.pm.UserInfo; 22c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.os.UserHandle; 23c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.os.UserManager; 24c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport android.provider.Settings; 25c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport com.android.settings.Utils; 26c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport com.android.settingslib.RestrictedLockUtils; 27c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 28c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingpublic class UserCapabilities { 29c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mEnabled = true; 30c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mCanAddUser = true; 31c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mCanAddRestrictedProfile = true; 32c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mIsAdmin; 33c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mIsGuest; 34c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mCanAddGuest; 35c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mDisallowAddUser; 36c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling boolean mDisallowAddUserSetByAdmin; 37ffae4c1a0eb57d2201a67951a3368daebcbab76eAlex Chau boolean mDisallowSwitchUser; 38c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin; 39c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 40c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling private UserCapabilities() {} 41c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 42c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public static UserCapabilities create(Context context) { 43c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 44c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling UserCapabilities caps = new UserCapabilities(); 45881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang 46c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling if (!UserManager.supportsMultipleUsers() || Utils.isMonkeyRunning()) { 47c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling caps.mEnabled = false; 48c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return caps; 49c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 50c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 51c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId()); 52c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling caps.mIsGuest = myUserInfo.isGuest(); 53c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling caps.mIsAdmin = myUserInfo.isAdmin(); 54c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( 55c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling Context.DEVICE_POLICY_SERVICE); 56c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling // No restricted profiles for tablets with a device owner, or phones. 57c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling if (dpm.isDeviceManaged() || Utils.isVoiceCapable(context)) { 58c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling caps.mCanAddRestrictedProfile = false; 59c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 60c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling caps.updateAddUserCapabilities(context); 61c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return caps; 62c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 63c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 64c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public void updateAddUserCapabilities(Context context) { 65c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(context, 66c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling UserManager.DISALLOW_ADD_USER, UserHandle.myUserId()); 67c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling final boolean hasBaseUserRestriction = RestrictedLockUtils.hasBaseUserRestriction( 68c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling context, UserManager.DISALLOW_ADD_USER, UserHandle.myUserId()); 69c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mDisallowAddUserSetByAdmin = 70c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mEnforcedAdmin != null && !hasBaseUserRestriction; 71c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mDisallowAddUser = 72c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling (mEnforcedAdmin != null || hasBaseUserRestriction); 73c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mCanAddUser = true; 74c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling if (!mIsAdmin || UserManager.getMaxSupportedUsers() < 2 75c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling || !UserManager.supportsMultipleUsers() 76c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling || mDisallowAddUser) { 77c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mCanAddUser = false; 78c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 79c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 80c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling final boolean canAddUsersWhenLocked = mIsAdmin || Settings.Global.getInt( 81c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling context.getContentResolver(), Settings.Global.ADD_USERS_WHEN_LOCKED, 0) == 1; 82c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling mCanAddGuest = !mIsGuest && !mDisallowAddUser && canAddUsersWhenLocked; 83ffae4c1a0eb57d2201a67951a3368daebcbab76eAlex Chau 84ffae4c1a0eb57d2201a67951a3368daebcbab76eAlex Chau UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 85ffae4c1a0eb57d2201a67951a3368daebcbab76eAlex Chau mDisallowSwitchUser = userManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH); 86c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 87c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 88c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public boolean isAdmin() { 89c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return mIsAdmin; 90c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 91c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 92c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public boolean disallowAddUser() { 93c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return mDisallowAddUser; 94c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 95c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 96c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public boolean disallowAddUserSetByAdmin() { 97c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return mDisallowAddUserSetByAdmin; 98c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 99c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 100c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin() { 101c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return mEnforcedAdmin; 102c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 103c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 104c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling 105c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling @Override 106c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling public String toString() { 107c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling return "UserCapabilities{" + 108c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling "mEnabled=" + mEnabled + 109c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mCanAddUser=" + mCanAddUser + 110c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mCanAddRestrictedProfile=" + mCanAddRestrictedProfile + 111c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mIsAdmin=" + mIsAdmin + 112c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mIsGuest=" + mIsGuest + 113c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mCanAddGuest=" + mCanAddGuest + 114c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mDisallowAddUser=" + mDisallowAddUser + 115c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling ", mEnforcedAdmin=" + mEnforcedAdmin + 116ffae4c1a0eb57d2201a67951a3368daebcbab76eAlex Chau ", mDisallowSwitchUser=" + mDisallowSwitchUser + 117c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling '}'; 118c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling } 119c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling} 120