14b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani/*
24b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Copyright (C) 2011 The Android Open Source Project
34b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani *
44b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
54b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * you may not use this file except in compliance with the License.
64b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * You may obtain a copy of the License at
74b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani *
84b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
94b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani *
104b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Unless required by applicable law or agreed to in writing, software
114b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
124b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * See the License for the specific language governing permissions and
144b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * limitations under the License.
154b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani */
164b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
174b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasanipackage android.content.pm;
184b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
194b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasaniimport android.os.Parcel;
204b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasaniimport android.os.Parcelable;
211a447535cef7e3739d5f763dfe13e568568b9789Kenny Guyimport android.os.SystemProperties;
22b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkeyimport android.os.UserHandle;
234b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
244b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani/**
254b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Per-user information.
264b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * @hide
274b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani */
284b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasanipublic class UserInfo implements Parcelable {
29258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
30df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    /** 8 bits for user type */
31df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    public static final int FLAG_MASK_USER_TYPE = 0x000000FF;
32258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
334b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
345dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * *************************** NOTE ***************************
355dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * These flag values CAN NOT CHANGE because they are written
365dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * directly to storage.
375dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     */
385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    /**
404b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * Primary user. Only one user can have this flag set. Meaning of this
414b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * flag TBD.
424b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
434b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_PRIMARY = 0x00000001;
444b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
454b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
464b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * User with administrative privileges. Such a user can create and
474b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * delete users.
484b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
494b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_ADMIN   = 0x00000002;
504b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
514b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
524b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * Indicates a guest user that may be transient.
534b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
544b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_GUEST   = 0x00000004;
554b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
56258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
57258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Indicates the user has restrictions in privileges, in addition to those for normal users.
58258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Exact meaning TBD. For instance, maybe they can't install apps or administer WiFi access pts.
59258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
60258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public static final int FLAG_RESTRICTED = 0x00000008;
61258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
625dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    /**
635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * Indicates that this user has gone through its first-time initialization.
645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     */
655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public static final int FLAG_INITIALIZED = 0x00000010;
665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
67a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    /**
68a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     * Indicates that this user is a profile of another user, for example holding a users
69a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     * corporate data.
70a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     */
71a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    public static final int FLAG_MANAGED_PROFILE = 0x00000020;
72a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
73df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    /**
74df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina     * Indicates that this user is disabled.
75df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina     */
76df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    public static final int FLAG_DISABLED = 0x00000040;
77df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina
78a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
792a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy    public static final int NO_PROFILE_GROUP_ID = -1;
80a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
814b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int id;
822a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int serialNumber;
834b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public String name;
84b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    public String iconPath;
854b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int flags;
86920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani    public long creationTime;
87920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani    public long lastLoggedInTime;
882a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy    public int profileGroupId;
894b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
90d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    /** User is only partially created. */
91d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    public boolean partial;
92eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski    public boolean guestToRemove;
93d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn
944b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo(int id, String name, int flags) {
95b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        this(id, name, null, flags);
96b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    }
97b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani
98b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    public UserInfo(int id, String name, String iconPath, int flags) {
994b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.id = id;
1004b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.name = name;
1014b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.flags = flags;
102b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        this.iconPath = iconPath;
1032a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        this.profileGroupId = NO_PROFILE_GROUP_ID;
1044b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1054b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1064b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isPrimary() {
1074b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_PRIMARY) == FLAG_PRIMARY;
1084b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1094b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1104b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isAdmin() {
1114b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_ADMIN) == FLAG_ADMIN;
1124b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1134b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1144b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isGuest() {
1154b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_GUEST) == FLAG_GUEST;
1164b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1174b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
11867df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani    public boolean isRestricted() {
11967df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani        return (flags & FLAG_RESTRICTED) == FLAG_RESTRICTED;
12067df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani    }
12167df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani
122a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    public boolean isManagedProfile() {
123a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy        return (flags & FLAG_MANAGED_PROFILE) == FLAG_MANAGED_PROFILE;
124a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    }
125a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
126df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    public boolean isEnabled() {
127df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina        return (flags & FLAG_DISABLED) != FLAG_DISABLED;
128df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    }
129df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina
1301a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    /**
1311a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy     * @return true if this user can be switched to.
1321a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy     **/
1331a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    public boolean supportsSwitchTo() {
1341a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy        // TODO remove fw.show_hidden_users when we have finished developing managed profiles.
1351a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy        return !isManagedProfile() || SystemProperties.getBoolean("fw.show_hidden_users", false);
1361a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    }
1371a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy
1384b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo() {
1394b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1404b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1414b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo(UserInfo orig) {
1424b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        name = orig.name;
143b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        iconPath = orig.iconPath;
1444b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        id = orig.id;
1454b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        flags = orig.flags;
1462a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        serialNumber = orig.serialNumber;
147920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        creationTime = orig.creationTime;
148920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        lastLoggedInTime = orig.lastLoggedInTime;
149d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        partial = orig.partial;
1502a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        profileGroupId = orig.profileGroupId;
151eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        guestToRemove = orig.guestToRemove;
1524b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1534b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
154b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public UserHandle getUserHandle() {
155b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return new UserHandle(id);
156b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
157b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
1584b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    @Override
1594b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public String toString() {
1600b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        return "UserInfo{" + id + ":" + name + ":" + Integer.toHexString(flags) + "}";
1614b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1624b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1634b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int describeContents() {
1644b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return 0;
1654b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1664b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1674b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public void writeToParcel(Parcel dest, int parcelableFlags) {
1684b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeInt(id);
1694b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeString(name);
170b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        dest.writeString(iconPath);
1714b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeInt(flags);
1722a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        dest.writeInt(serialNumber);
173920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        dest.writeLong(creationTime);
174920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        dest.writeLong(lastLoggedInTime);
175d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        dest.writeInt(partial ? 1 : 0);
1762a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        dest.writeInt(profileGroupId);
177eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        dest.writeInt(guestToRemove ? 1 : 0);
1784b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1794b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1804b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final Parcelable.Creator<UserInfo> CREATOR
1814b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            = new Parcelable.Creator<UserInfo>() {
1824b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        public UserInfo createFromParcel(Parcel source) {
1834b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            return new UserInfo(source);
1844b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        }
1854b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        public UserInfo[] newArray(int size) {
1864b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            return new UserInfo[size];
1874b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        }
1884b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    };
1894b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1904b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    private UserInfo(Parcel source) {
1914b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        id = source.readInt();
1924b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        name = source.readString();
193b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        iconPath = source.readString();
1944b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        flags = source.readInt();
1952a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        serialNumber = source.readInt();
196920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        creationTime = source.readLong();
197920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        lastLoggedInTime = source.readLong();
198d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        partial = source.readInt() != 0;
1992a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        profileGroupId = source.readInt();
200eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        guestToRemove = source.readInt() != 0;
2014b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2024b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani}
203