Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.content.pm;
     18 
     19 import android.os.Parcel;
     20 import android.os.Parcelable;
     21 import android.os.SystemProperties;
     22 import android.os.UserHandle;
     23 
     24 /**
     25  * Per-user information.
     26  * @hide
     27  */
     28 public class UserInfo implements Parcelable {
     29 
     30     /** 8 bits for user type */
     31     public static final int FLAG_MASK_USER_TYPE = 0x000000FF;
     32 
     33     /**
     34      * *************************** NOTE ***************************
     35      * These flag values CAN NOT CHANGE because they are written
     36      * directly to storage.
     37      */
     38 
     39     /**
     40      * Primary user. Only one user can have this flag set. Meaning of this
     41      * flag TBD.
     42      */
     43     public static final int FLAG_PRIMARY = 0x00000001;
     44 
     45     /**
     46      * User with administrative privileges. Such a user can create and
     47      * delete users.
     48      */
     49     public static final int FLAG_ADMIN   = 0x00000002;
     50 
     51     /**
     52      * Indicates a guest user that may be transient.
     53      */
     54     public static final int FLAG_GUEST   = 0x00000004;
     55 
     56     /**
     57      * Indicates the user has restrictions in privileges, in addition to those for normal users.
     58      * Exact meaning TBD. For instance, maybe they can't install apps or administer WiFi access pts.
     59      */
     60     public static final int FLAG_RESTRICTED = 0x00000008;
     61 
     62     /**
     63      * Indicates that this user has gone through its first-time initialization.
     64      */
     65     public static final int FLAG_INITIALIZED = 0x00000010;
     66 
     67     /**
     68      * Indicates that this user is a profile of another user, for example holding a users
     69      * corporate data.
     70      */
     71     public static final int FLAG_MANAGED_PROFILE = 0x00000020;
     72 
     73     /**
     74      * Indicates that this user is disabled.
     75      */
     76     public static final int FLAG_DISABLED = 0x00000040;
     77 
     78 
     79     public static final int NO_PROFILE_GROUP_ID = -1;
     80 
     81     public int id;
     82     public int serialNumber;
     83     public String name;
     84     public String iconPath;
     85     public int flags;
     86     public long creationTime;
     87     public long lastLoggedInTime;
     88     public int profileGroupId;
     89 
     90     /** User is only partially created. */
     91     public boolean partial;
     92     public boolean guestToRemove;
     93 
     94     public UserInfo(int id, String name, int flags) {
     95         this(id, name, null, flags);
     96     }
     97 
     98     public UserInfo(int id, String name, String iconPath, int flags) {
     99         this.id = id;
    100         this.name = name;
    101         this.flags = flags;
    102         this.iconPath = iconPath;
    103         this.profileGroupId = NO_PROFILE_GROUP_ID;
    104     }
    105 
    106     public boolean isPrimary() {
    107         return (flags & FLAG_PRIMARY) == FLAG_PRIMARY;
    108     }
    109 
    110     public boolean isAdmin() {
    111         return (flags & FLAG_ADMIN) == FLAG_ADMIN;
    112     }
    113 
    114     public boolean isGuest() {
    115         return (flags & FLAG_GUEST) == FLAG_GUEST;
    116     }
    117 
    118     public boolean isRestricted() {
    119         return (flags & FLAG_RESTRICTED) == FLAG_RESTRICTED;
    120     }
    121 
    122     public boolean isManagedProfile() {
    123         return (flags & FLAG_MANAGED_PROFILE) == FLAG_MANAGED_PROFILE;
    124     }
    125 
    126     public boolean isEnabled() {
    127         return (flags & FLAG_DISABLED) != FLAG_DISABLED;
    128     }
    129 
    130     /**
    131      * @return true if this user can be switched to.
    132      **/
    133     public boolean supportsSwitchTo() {
    134         // TODO remove fw.show_hidden_users when we have finished developing managed profiles.
    135         return !isManagedProfile() || SystemProperties.getBoolean("fw.show_hidden_users", false);
    136     }
    137 
    138     public UserInfo() {
    139     }
    140 
    141     public UserInfo(UserInfo orig) {
    142         name = orig.name;
    143         iconPath = orig.iconPath;
    144         id = orig.id;
    145         flags = orig.flags;
    146         serialNumber = orig.serialNumber;
    147         creationTime = orig.creationTime;
    148         lastLoggedInTime = orig.lastLoggedInTime;
    149         partial = orig.partial;
    150         profileGroupId = orig.profileGroupId;
    151         guestToRemove = orig.guestToRemove;
    152     }
    153 
    154     public UserHandle getUserHandle() {
    155         return new UserHandle(id);
    156     }
    157 
    158     @Override
    159     public String toString() {
    160         return "UserInfo{" + id + ":" + name + ":" + Integer.toHexString(flags) + "}";
    161     }
    162 
    163     public int describeContents() {
    164         return 0;
    165     }
    166 
    167     public void writeToParcel(Parcel dest, int parcelableFlags) {
    168         dest.writeInt(id);
    169         dest.writeString(name);
    170         dest.writeString(iconPath);
    171         dest.writeInt(flags);
    172         dest.writeInt(serialNumber);
    173         dest.writeLong(creationTime);
    174         dest.writeLong(lastLoggedInTime);
    175         dest.writeInt(partial ? 1 : 0);
    176         dest.writeInt(profileGroupId);
    177         dest.writeInt(guestToRemove ? 1 : 0);
    178     }
    179 
    180     public static final Parcelable.Creator<UserInfo> CREATOR
    181             = new Parcelable.Creator<UserInfo>() {
    182         public UserInfo createFromParcel(Parcel source) {
    183             return new UserInfo(source);
    184         }
    185         public UserInfo[] newArray(int size) {
    186             return new UserInfo[size];
    187         }
    188     };
    189 
    190     private UserInfo(Parcel source) {
    191         id = source.readInt();
    192         name = source.readString();
    193         iconPath = source.readString();
    194         flags = source.readInt();
    195         serialNumber = source.readInt();
    196         creationTime = source.readLong();
    197         lastLoggedInTime = source.readLong();
    198         partial = source.readInt() != 0;
    199         profileGroupId = source.readInt();
    200         guestToRemove = source.readInt() != 0;
    201     }
    202 }
    203