1cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/*
2cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Copyright (C) 2011 The Android Open Source Project
3cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
4cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * you may not use this file except in compliance with the License.
6cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * You may obtain a copy of the License at
7cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
8cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
10cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Unless required by applicable law or agreed to in writing, software
11cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * See the License for the specific language governing permissions and
14cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * limitations under the License.
15cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
16cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
17cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpackage com.android.server.pm;
18cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
19cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
21cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
22cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
23d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackbornimport android.content.pm.ApplicationInfo;
247767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.PackageUserState;
257767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.UserInfo;
26483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.util.SparseArray;
27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
29cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
307767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport java.util.List;
31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Settings base class for pending and resolved classes.
34cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
35cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootclass PackageSettingBase extends GrantedPermissions {
36cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /**
37cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Indicates the state of installation. Used by PackageManager to figure out
38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * incomplete installations. Say a package is being installed (the state is
39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * set to PKG_INSTALL_INCOMPLETE) and remains so till the package
40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * installation is successful or unsuccessful in which case the
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * PackageManager will no longer maintain state information associated with
42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * the package. If some exception(like device freeze or battery being pulled
43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * out) occurs during installation of a package, the PackageManager needs
44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * this information to clean up the previously failed installation.
45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    static final int PKG_INSTALL_COMPLETE = 1;
47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    static final int PKG_INSTALL_INCOMPLETE = 0;
48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final String name;
50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final String realName;
51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    File codePath;
52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    String codePathString;
53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    File resourcePath;
54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    String resourcePathString;
55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    String nativeLibraryPathString;
56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    long timeStamp;
57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    long firstInstallTime;
58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    long lastUpdateTime;
59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int versionCode;
60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    boolean uidError;
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSignatures signatures = new PackageSignatures();
64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    boolean permissionsFixed;
66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    boolean haveGids;
67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
68f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra    PackageKeySetData keySetData = new PackageKeySetData();
69f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra
704a9f071f3d3fdd20615167cda6f22da912bc60c7Dianne Hackborn    private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
717767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
72cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Whether this package is currently stopped, thus can not be
73cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // started until explicitly launched by the user.
747767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
75483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int installStatus = PKG_INSTALL_COMPLETE;
77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSettingBase origPackage;
79483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /* package name of the app that installed this package */
81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    String installerPackageName;
82cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSettingBase(String name, String realName, File codePath, File resourcePath,
83cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
84cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        super(pkgFlags);
85cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.name = name;
86cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.realName = realName;
87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
89cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
90cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /**
91cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * New instance of PackageSetting with one-level-deep cloning.
92cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
93cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    @SuppressWarnings("unchecked")
94cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSettingBase(PackageSettingBase base) {
95cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        super(base);
96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        name = base.name;
98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        realName = base.realName;
99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        codePath = base.codePath;
100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        codePathString = base.codePathString;
101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        resourcePath = base.resourcePath;
102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        resourcePathString = base.resourcePathString;
103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        nativeLibraryPathString = base.nativeLibraryPathString;
104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStamp = base.timeStamp;
105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        firstInstallTime = base.firstInstallTime;
106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        lastUpdateTime = base.lastUpdateTime;
107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        versionCode = base.versionCode;
108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        uidError = base.uidError;
110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        signatures = new PackageSignatures(base.signatures);
112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        permissionsFixed = base.permissionsFixed;
114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        haveGids = base.haveGids;
1157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        userState.clear();
1167767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        for (int i=0; i<base.userState.size(); i++) {
1177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            userState.put(base.userState.keyAt(i),
1187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    new PackageUserState(base.userState.valueAt(i)));
1197767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        installStatus = base.installStatus;
121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        origPackage = base.origPackage;
123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        installerPackageName = base.installerPackageName;
125f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra
126f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra        keySetData = new PackageKeySetData(base.keySetData);
127f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra
128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void init(File codePath, File resourcePath, String nativeLibraryPathString,
131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int pVersionCode) {
132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.codePath = codePath;
133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.codePathString = codePath.toString();
134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.resourcePath = resourcePath;
135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.resourcePathString = resourcePath.toString();
136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.nativeLibraryPathString = nativeLibraryPathString;
137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        this.versionCode = pVersionCode;
138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public void setInstallerPackageName(String packageName) {
141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        installerPackageName = packageName;
142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    String getInstallerPackageName() {
145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return installerPackageName;
146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public void setInstallStatus(int newStatus) {
149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        installStatus = newStatus;
150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public int getInstallStatus() {
153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return installStatus;
154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public void setTimeStamp(long newStamp) {
157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStamp = newStamp;
158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /**
161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Make a shallow copy of this package settings.
162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public void copyFrom(PackageSettingBase base) {
164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        grantedPermissions = base.grantedPermissions;
165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        gids = base.gids;
166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStamp = base.timeStamp;
168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        firstInstallTime = base.firstInstallTime;
169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        lastUpdateTime = base.lastUpdateTime;
170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        signatures = base.signatures;
171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        permissionsFixed = base.permissionsFixed;
172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        haveGids = base.haveGids;
1737767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        userState.clear();
1747767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        for (int i=0; i<base.userState.size(); i++) {
1757767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
1767767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        installStatus = base.installStatus;
178f1bcca82158c39da3c3696f9af954be2c0be1809Geremy Condra        keySetData = base.keySetData;
179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1817767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private PackageUserState modifyUserState(int userId) {
1827767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = userState.get(userId);
1837767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (state == null) {
1844a9f071f3d3fdd20615167cda6f22da912bc60c7Dianne Hackborn            state = new PackageUserState();
1857767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            userState.put(userId, state);
1867767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
1877767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return state;
1887767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
1897767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
1907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    public PackageUserState readUserState(int userId) {
1917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = userState.get(userId);
192d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        if (state != null) {
193d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            return state;
194d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        }
1954a9f071f3d3fdd20615167cda6f22da912bc60c7Dianne Hackborn        return DEFAULT_USER_STATE;
1967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
1977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
1983fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn    void setEnabled(int state, int userId, String callingPackage) {
1993fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn        PackageUserState st = modifyUserState(userId);
2003fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn        st.enabled = state;
2013fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn        st.lastDisableAppCaller = callingPackage;
202483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
203483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
204483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getEnabled(int userId) {
2057767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).enabled;
2067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
2077767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
2083fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn    String getLastDisabledAppCaller(int userId) {
2093fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn        return readUserState(userId).lastDisableAppCaller;
2103fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn    }
2113fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn
2127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    void setInstalled(boolean inst, int userId) {
2137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).installed = inst;
2147767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
2157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
2167767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    boolean getInstalled(int userId) {
2177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).installed;
2187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
2197767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
2207767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    boolean isAnyInstalled(int[] users) {
2217767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        for (int user: users) {
2227767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            if (readUserState(user).installed) {
2237767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                return true;
2247767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            }
2257767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
2267767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return false;
2277767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
2287767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
229786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn    int[] queryInstalledUsers(int[] users, boolean installed) {
2307767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        int num = 0;
2317767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        for (int user : users) {
232786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            if (getInstalled(user) == installed) {
2337767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                num++;
2347767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            }
2357767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
2367767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        int[] res = new int[num];
2377767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        num = 0;
2387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        for (int user : users) {
239786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            if (getInstalled(user) == installed) {
2407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                res[num] = user;
2417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                num++;
2427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            }
2437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
2447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return res;
245483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
246483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
247483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean getStopped(int userId) {
2487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).stopped;
249483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
250483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
251483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void setStopped(boolean stop, int userId) {
2527767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).stopped = stop;
253483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
254483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
255483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean getNotLaunched(int userId) {
2567767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).notLaunched;
257483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
258483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
259483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void setNotLaunched(boolean stop, int userId) {
2607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).notLaunched = stop;
2617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
2627767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
263655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    boolean getBlocked(int userId) {
264655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        return readUserState(userId).blocked;
265655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    }
266655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
267655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    void setBlocked(boolean blocked, int userId) {
268655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        modifyUserState(userId).blocked = blocked;
269655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    }
270655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
2717767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    void setUserState(int userId, int enabled, boolean installed, boolean stopped,
272655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            boolean notLaunched, boolean blocked,
273655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            String lastDisableAppCaller, HashSet<String> enabledComponents,
2747767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            HashSet<String> disabledComponents) {
2757767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = modifyUserState(userId);
2767767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.enabled = enabled;
2777767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.installed = installed;
2787767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.stopped = stopped;
2797767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.notLaunched = notLaunched;
280655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        state.blocked = blocked;
2813fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn        state.lastDisableAppCaller = lastDisableAppCaller;
2827767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.enabledComponents = enabledComponents;
2837767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        state.disabledComponents = disabledComponents;
284483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
285483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
286483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    HashSet<String> getEnabledComponents(int userId) {
2877767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).enabledComponents;
288483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
289483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
290483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    HashSet<String> getDisabledComponents(int userId) {
2917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return readUserState(userId).disabledComponents;
292483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
293483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
294483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void setEnabledComponents(HashSet<String> components, int userId) {
2957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).enabledComponents = components;
296483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
297483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
298483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void setDisabledComponents(HashSet<String> components, int userId) {
2997767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).disabledComponents = components;
3007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
3017767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
3027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    void setEnabledComponentsCopy(HashSet<String> components, int userId) {
3037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).enabledComponents = components != null
3047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? new HashSet<String>(components) : null;
305483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
306483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
3077767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    void setDisabledComponentsCopy(HashSet<String> components, int userId) {
3087767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserState(userId).disabledComponents = components != null
3097767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? new HashSet<String>(components) : null;
3107767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
3117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
3127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
3137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = modifyUserState(userId);
3147767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (disabled && state.disabledComponents == null) {
3157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            state.disabledComponents = new HashSet<String>(1);
3167767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
3177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (enabled && state.enabledComponents == null) {
3187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            state.enabledComponents = new HashSet<String>(1);
319483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
3207767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return state;
321483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
322483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
323483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void addDisabledComponent(String componentClassName, int userId) {
3247767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
325483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
326483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
327483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void addEnabledComponent(String componentClassName, int userId) {
3287767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
329483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
330483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
331483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean enableComponentLPw(String componentClassName, int userId) {
3327767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = modifyUserStateComponents(userId, false, true);
3337767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        boolean changed = state.disabledComponents != null
3347767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? state.disabledComponents.remove(componentClassName) : false;
3357767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        changed |= state.enabledComponents.add(componentClassName);
336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return changed;
337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
339483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean disableComponentLPw(String componentClassName, int userId) {
3407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = modifyUserStateComponents(userId, true, false);
3417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        boolean changed = state.enabledComponents != null
3427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? state.enabledComponents.remove(componentClassName) : false;
3437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        changed |= state.disabledComponents.add(componentClassName);
344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return changed;
345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
347483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean restoreComponentLPw(String componentClassName, int userId) {
3487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = modifyUserStateComponents(userId, true, true);
3497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        boolean changed = state.disabledComponents != null
3507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? state.disabledComponents.remove(componentClassName) : false;
3517767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        changed |= state.enabledComponents != null
3527767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                ? state.enabledComponents.remove(componentClassName) : false;
353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return changed;
354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
356483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getCurrentEnabledStateLPr(String componentName, int userId) {
3577767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState state = readUserState(userId);
3587767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return COMPONENT_ENABLED_STATE_ENABLED;
3607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        } else if (state.disabledComponents != null
3617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                && state.disabledComponents.contains(componentName)) {
362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return COMPONENT_ENABLED_STATE_DISABLED;
363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return COMPONENT_ENABLED_STATE_DEFAULT;
365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
367135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
368135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    void removeUser(int userId) {
3697767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        userState.delete(userId);
370135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
371483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani}
372