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