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;
237cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chenimport android.os.UserManager;
244b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
254b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani/**
264b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Per-user information.
274b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * @hide
284b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani */
294b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasanipublic class UserInfo implements Parcelable {
30258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
31eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    /** 16 bits for user type */
32eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    public static final int FLAG_MASK_USER_TYPE = 0x0000FFFF;
33258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
344b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
355dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * *************************** NOTE ***************************
365dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * These flag values CAN NOT CHANGE because they are written
375dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * directly to storage.
385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     */
395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
405dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    /**
4170f6c38644a4a6e28c016c265e6987bf00dd61f1Xiaohui Chen     * Primary user. Only one user can have this flag set. It identifies the first human user
4270f6c38644a4a6e28c016c265e6987bf00dd61f1Xiaohui Chen     * on a device.
434b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
444b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_PRIMARY = 0x00000001;
454b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
464b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
474b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * User with administrative privileges. Such a user can create and
484b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * delete users.
494b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
504b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_ADMIN   = 0x00000002;
514b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
524b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    /**
534b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     * Indicates a guest user that may be transient.
544b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani     */
554b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final int FLAG_GUEST   = 0x00000004;
564b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
57258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
58258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Indicates the user has restrictions in privileges, in addition to those for normal users.
59258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Exact meaning TBD. For instance, maybe they can't install apps or administer WiFi access pts.
60258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
61258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public static final int FLAG_RESTRICTED = 0x00000008;
62258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    /**
645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     * Indicates that this user has gone through its first-time initialization.
655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn     */
665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public static final int FLAG_INITIALIZED = 0x00000010;
675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
68a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    /**
69a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     * Indicates that this user is a profile of another user, for example holding a users
70a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     * corporate data.
71a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy     */
72a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    public static final int FLAG_MANAGED_PROFILE = 0x00000020;
73a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
74df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    /**
75df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina     * Indicates that this user is disabled.
761ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova     *
771ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova     * <p>Note: If an ephemeral user is disabled, it shouldn't be later re-enabled. Ephemeral users
781ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova     * are disabled as their removal is in progress to indicate that they shouldn't be re-entered.
79df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina     */
80df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    public static final int FLAG_DISABLED = 0x00000040;
81df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina
820a29ecd8a53b5ac63b628e870a344650ff34c4b0Rubin Xu    public static final int FLAG_QUIET_MODE = 0x00000080;
83a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
84c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova    /**
85c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova     * Indicates that this user is ephemeral. I.e. the user will be removed after leaving
86c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova     * the foreground.
87c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova     */
88c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova    public static final int FLAG_EPHEMERAL = 0x00000100;
89c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova
90eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    /**
91eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani     * User is for demo purposes only and can be removed at any time.
92eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani     */
93eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    public static final int FLAG_DEMO = 0x00000200;
94eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani
9506a484adb93c6c969321147b07112684383305f6Fyodor Kupolov    public static final int NO_PROFILE_GROUP_ID = UserHandle.USER_NULL;
96a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
974b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int id;
982a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int serialNumber;
994b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public String name;
100b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    public String iconPath;
1014b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int flags;
102920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani    public long creationTime;
103920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani    public long lastLoggedInTime;
104bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey    public String lastLoggedInFingerprint;
105d3986be5e40115158cb3e41f251cad41cf08eeabTony Mak    /**
106d3986be5e40115158cb3e41f251cad41cf08eeabTony Mak     * If this user is a parent user, it would be its own user id.
107d3986be5e40115158cb3e41f251cad41cf08eeabTony Mak     * If this user is a child user, it would be its parent user id.
108d3986be5e40115158cb3e41f251cad41cf08eeabTony Mak     * Otherwise, it would be {@link #NO_PROFILE_GROUP_ID}.
109d3986be5e40115158cb3e41f251cad41cf08eeabTony Mak     */
1102a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy    public int profileGroupId;
11106a484adb93c6c969321147b07112684383305f6Fyodor Kupolov    public int restrictedProfileParentId;
11202c8990bd6125f05cb32561727d559dc9327a601Kenny Guy    /** Which profile badge color/label to use. */
11302c8990bd6125f05cb32561727d559dc9327a601Kenny Guy    public int profileBadge;
1144b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
115d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    /** User is only partially created. */
116d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    public boolean partial;
117eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski    public boolean guestToRemove;
118d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn
1194b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo(int id, String name, int flags) {
120b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        this(id, name, null, flags);
121b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    }
122b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani
123b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani    public UserInfo(int id, String name, String iconPath, int flags) {
1244b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.id = id;
1254b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.name = name;
1264b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        this.flags = flags;
127b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        this.iconPath = iconPath;
1282a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        this.profileGroupId = NO_PROFILE_GROUP_ID;
12906a484adb93c6c969321147b07112684383305f6Fyodor Kupolov        this.restrictedProfileParentId = NO_PROFILE_GROUP_ID;
1304b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1314b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1324b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isPrimary() {
1334b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_PRIMARY) == FLAG_PRIMARY;
1344b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1354b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1364b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isAdmin() {
1374b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_ADMIN) == FLAG_ADMIN;
1384b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1394b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
1404b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public boolean isGuest() {
1414b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return (flags & FLAG_GUEST) == FLAG_GUEST;
1424b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
1434b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
14467df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani    public boolean isRestricted() {
14567df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani        return (flags & FLAG_RESTRICTED) == FLAG_RESTRICTED;
14667df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani    }
14767df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani
148a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    public boolean isManagedProfile() {
149a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy        return (flags & FLAG_MANAGED_PROFILE) == FLAG_MANAGED_PROFILE;
150a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy    }
151a52dc3eb40777b055c0ca8d7885bd2c9577bcd1aKenny Guy
152df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    public boolean isEnabled() {
153df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina        return (flags & FLAG_DISABLED) != FLAG_DISABLED;
154df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina    }
155df35d570ed25257c6782e632ab1bae5e1603855aAlexandra Gherghina
1560a29ecd8a53b5ac63b628e870a344650ff34c4b0Rubin Xu    public boolean isQuietModeEnabled() {
1570a29ecd8a53b5ac63b628e870a344650ff34c4b0Rubin Xu        return (flags & FLAG_QUIET_MODE) == FLAG_QUIET_MODE;
1580a29ecd8a53b5ac63b628e870a344650ff34c4b0Rubin Xu    }
159c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova
160c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova    public boolean isEphemeral() {
161c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova        return (flags & FLAG_EPHEMERAL) == FLAG_EPHEMERAL;
162c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova    }
163c4dd021322d38ea32ac49930e904b6d08ce6490cLenka Trochtova
16412747879b0204b9dfee997eddc981d09289e8b77Amith Yamasani    public boolean isInitialized() {
16512747879b0204b9dfee997eddc981d09289e8b77Amith Yamasani        return (flags & FLAG_INITIALIZED) == FLAG_INITIALIZED;
16612747879b0204b9dfee997eddc981d09289e8b77Amith Yamasani    }
167eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani
168eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    public boolean isDemo() {
169eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani        return (flags & FLAG_DEMO) == FLAG_DEMO;
170eb437d4dffb310857e19bb619778dc5b6b7febffAmith Yamasani    }
17112747879b0204b9dfee997eddc981d09289e8b77Amith Yamasani
1721a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    /**
1737db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov     * Returns true if the user is a split system user.
1747db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov     * <p>If {@link UserManager#isSplitSystemUser split system user mode} is not enabled,
1757db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov     * the method always returns false.
1767db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov     */
1777db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public boolean isSystemOnly() {
178a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen        return isSystemOnly(id);
179a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen    }
180a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen
181a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen    /**
182a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen     * Returns true if the given user is a split system user.
183a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen     * <p>If {@link UserManager#isSplitSystemUser split system user mode} is not enabled,
184a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen     * the method always returns false.
185a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen     */
186a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen    public static boolean isSystemOnly(int userId) {
187a4490622207804ef85f39439ff7b9cb2470f6287Xiaohui Chen        return userId == UserHandle.USER_SYSTEM && UserManager.isSplitSystemUser();
1887db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
1897db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1907db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    /**
1911a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy     * @return true if this user can be switched to.
1921a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy     **/
1931a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    public boolean supportsSwitchTo() {
1941ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova        if (isEphemeral() && !isEnabled()) {
1951ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova            // Don't support switching to an ephemeral user with removal in progress.
1961ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova            return false;
1971ddda4793c26fd249590fd3549cf060ecb7c157bLenka Trochtova        }
198434a74f5589844987048cf51e05cc20e5321a2a2Robin Lee        return !isManagedProfile();
1991a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy    }
2001a447535cef7e3739d5f763dfe13e568568b9789Kenny Guy
2017cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen    /**
2027cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen     * @return true if this user can be switched to by end user through UI.
2037cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen     */
2047cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen    public boolean supportsSwitchToByUser() {
2057cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen        // Hide the system user when it does not represent a human user.
2067cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen        boolean hideSystemUser = UserManager.isSplitSystemUser();
2077cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen        return (!hideSystemUser || id != UserHandle.USER_SYSTEM) && supportsSwitchTo();
2087cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen    }
2097cb69df507f5f7956c52a2868a0d6e89aec6dde2Xiaohui Chen
210b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot    /* @hide */
211b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot    public boolean canHaveProfile() {
212b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot        if (isManagedProfile() || isGuest() || isRestricted()) {
213b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot            return false;
214b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot        }
215b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot        if (UserManager.isSplitSystemUser()) {
216b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot            return id != UserHandle.USER_SYSTEM;
217bd0e03bb763ae7956ecba35fe5759d4b443158caXiaohui Chen        } else {
218bd0e03bb763ae7956ecba35fe5759d4b443158caXiaohui Chen            return id == UserHandle.USER_SYSTEM;
219b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot        }
220b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot    }
221b818681dcae157412b897587ff856cd0c531c3f4Nicolas Prevot
2224b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo() {
2234b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2244b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
2254b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public UserInfo(UserInfo orig) {
2264b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        name = orig.name;
227b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        iconPath = orig.iconPath;
2284b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        id = orig.id;
2294b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        flags = orig.flags;
2302a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        serialNumber = orig.serialNumber;
231920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        creationTime = orig.creationTime;
232920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        lastLoggedInTime = orig.lastLoggedInTime;
233bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey        lastLoggedInFingerprint = orig.lastLoggedInFingerprint;
234d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        partial = orig.partial;
2352a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        profileGroupId = orig.profileGroupId;
2366f48d6ef35df55e092d18619fe1f92a2593682d4Amith Yamasani        restrictedProfileParentId = orig.restrictedProfileParentId;
237eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        guestToRemove = orig.guestToRemove;
23802c8990bd6125f05cb32561727d559dc9327a601Kenny Guy        profileBadge = orig.profileBadge;
2394b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2404b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
241b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public UserHandle getUserHandle() {
242b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return new UserHandle(id);
243b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
244b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
2454b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    @Override
2464b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public String toString() {
2470b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        return "UserInfo{" + id + ":" + name + ":" + Integer.toHexString(flags) + "}";
2484b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2494b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
2504b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public int describeContents() {
2514b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        return 0;
2524b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2534b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
2544b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public void writeToParcel(Parcel dest, int parcelableFlags) {
2554b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeInt(id);
2564b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeString(name);
257b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        dest.writeString(iconPath);
2584b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        dest.writeInt(flags);
2592a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        dest.writeInt(serialNumber);
260920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        dest.writeLong(creationTime);
261920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        dest.writeLong(lastLoggedInTime);
262bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey        dest.writeString(lastLoggedInFingerprint);
263d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        dest.writeInt(partial ? 1 : 0);
2642a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        dest.writeInt(profileGroupId);
265eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        dest.writeInt(guestToRemove ? 1 : 0);
26606a484adb93c6c969321147b07112684383305f6Fyodor Kupolov        dest.writeInt(restrictedProfileParentId);
26702c8990bd6125f05cb32561727d559dc9327a601Kenny Guy        dest.writeInt(profileBadge);
2684b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2694b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
2704b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    public static final Parcelable.Creator<UserInfo> CREATOR
2714b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            = new Parcelable.Creator<UserInfo>() {
2724b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        public UserInfo createFromParcel(Parcel source) {
2734b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            return new UserInfo(source);
2744b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        }
2754b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        public UserInfo[] newArray(int size) {
2764b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani            return new UserInfo[size];
2774b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        }
2784b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    };
2794b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani
2804b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    private UserInfo(Parcel source) {
2814b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        id = source.readInt();
2824b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        name = source.readString();
283b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani        iconPath = source.readString();
2844b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani        flags = source.readInt();
2852a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        serialNumber = source.readInt();
286920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        creationTime = source.readLong();
287920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        lastLoggedInTime = source.readLong();
288bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey        lastLoggedInFingerprint = source.readString();
289d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        partial = source.readInt() != 0;
2902a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        profileGroupId = source.readInt();
291eddeb49a734a524347587e7654025c489fb6331eAdam Lesinski        guestToRemove = source.readInt() != 0;
29206a484adb93c6c969321147b07112684383305f6Fyodor Kupolov        restrictedProfileParentId = source.readInt();
29302c8990bd6125f05cb32561727d559dc9327a601Kenny Guy        profileBadge = source.readInt();
2944b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani    }
2954b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani}
296