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