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 com.android.server.pm; 18 19 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 20 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 21 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 22 23 24 import java.io.File; 25 import java.util.HashSet; 26 27 /** 28 * Settings base class for pending and resolved classes. 29 */ 30 class PackageSettingBase extends GrantedPermissions { 31 /** 32 * Indicates the state of installation. Used by PackageManager to figure out 33 * incomplete installations. Say a package is being installed (the state is 34 * set to PKG_INSTALL_INCOMPLETE) and remains so till the package 35 * installation is successful or unsuccessful in which case the 36 * PackageManager will no longer maintain state information associated with 37 * the package. If some exception(like device freeze or battery being pulled 38 * out) occurs during installation of a package, the PackageManager needs 39 * this information to clean up the previously failed installation. 40 */ 41 static final int PKG_INSTALL_COMPLETE = 1; 42 static final int PKG_INSTALL_INCOMPLETE = 0; 43 44 final String name; 45 final String realName; 46 File codePath; 47 String codePathString; 48 File resourcePath; 49 String resourcePathString; 50 String nativeLibraryPathString; 51 long timeStamp; 52 long firstInstallTime; 53 long lastUpdateTime; 54 int versionCode; 55 56 boolean uidError; 57 58 PackageSignatures signatures = new PackageSignatures(); 59 60 boolean permissionsFixed; 61 boolean haveGids; 62 63 // Whether this package is currently stopped, thus can not be 64 // started until explicitly launched by the user. 65 public boolean stopped; 66 67 // Set to true if we have never launched this app. 68 public boolean notLaunched; 69 70 /* Explicitly disabled components */ 71 HashSet<String> disabledComponents = new HashSet<String>(0); 72 /* Explicitly enabled components */ 73 HashSet<String> enabledComponents = new HashSet<String>(0); 74 int enabled = COMPONENT_ENABLED_STATE_DEFAULT; 75 int installStatus = PKG_INSTALL_COMPLETE; 76 77 PackageSettingBase origPackage; 78 79 /* package name of the app that installed this package */ 80 String installerPackageName; 81 PackageSettingBase(String name, String realName, File codePath, File resourcePath, 82 String nativeLibraryPathString, int pVersionCode, int pkgFlags) { 83 super(pkgFlags); 84 this.name = name; 85 this.realName = realName; 86 init(codePath, resourcePath, nativeLibraryPathString, pVersionCode); 87 } 88 89 /** 90 * New instance of PackageSetting with one-level-deep cloning. 91 */ 92 @SuppressWarnings("unchecked") 93 PackageSettingBase(PackageSettingBase base) { 94 super(base); 95 96 name = base.name; 97 realName = base.realName; 98 codePath = base.codePath; 99 codePathString = base.codePathString; 100 resourcePath = base.resourcePath; 101 resourcePathString = base.resourcePathString; 102 nativeLibraryPathString = base.nativeLibraryPathString; 103 timeStamp = base.timeStamp; 104 firstInstallTime = base.firstInstallTime; 105 lastUpdateTime = base.lastUpdateTime; 106 versionCode = base.versionCode; 107 108 uidError = base.uidError; 109 110 signatures = new PackageSignatures(base.signatures); 111 112 permissionsFixed = base.permissionsFixed; 113 haveGids = base.haveGids; 114 stopped = base.stopped; 115 notLaunched = base.notLaunched; 116 117 disabledComponents = (HashSet<String>) base.disabledComponents.clone(); 118 119 enabledComponents = (HashSet<String>) base.enabledComponents.clone(); 120 121 enabled = base.enabled; 122 installStatus = base.installStatus; 123 124 origPackage = base.origPackage; 125 126 installerPackageName = base.installerPackageName; 127 } 128 129 void init(File codePath, File resourcePath, String nativeLibraryPathString, 130 int pVersionCode) { 131 this.codePath = codePath; 132 this.codePathString = codePath.toString(); 133 this.resourcePath = resourcePath; 134 this.resourcePathString = resourcePath.toString(); 135 this.nativeLibraryPathString = nativeLibraryPathString; 136 this.versionCode = pVersionCode; 137 } 138 139 public void setInstallerPackageName(String packageName) { 140 installerPackageName = packageName; 141 } 142 143 String getInstallerPackageName() { 144 return installerPackageName; 145 } 146 147 public void setInstallStatus(int newStatus) { 148 installStatus = newStatus; 149 } 150 151 public int getInstallStatus() { 152 return installStatus; 153 } 154 155 public void setTimeStamp(long newStamp) { 156 timeStamp = newStamp; 157 } 158 159 /** 160 * Make a shallow copy of this package settings. 161 */ 162 public void copyFrom(PackageSettingBase base) { 163 grantedPermissions = base.grantedPermissions; 164 gids = base.gids; 165 166 timeStamp = base.timeStamp; 167 firstInstallTime = base.firstInstallTime; 168 lastUpdateTime = base.lastUpdateTime; 169 signatures = base.signatures; 170 permissionsFixed = base.permissionsFixed; 171 haveGids = base.haveGids; 172 stopped = base.stopped; 173 notLaunched = base.notLaunched; 174 disabledComponents = base.disabledComponents; 175 enabledComponents = base.enabledComponents; 176 enabled = base.enabled; 177 installStatus = base.installStatus; 178 } 179 180 boolean enableComponentLPw(String componentClassName) { 181 boolean changed = disabledComponents.remove(componentClassName); 182 changed |= enabledComponents.add(componentClassName); 183 return changed; 184 } 185 186 boolean disableComponentLPw(String componentClassName) { 187 boolean changed = enabledComponents.remove(componentClassName); 188 changed |= disabledComponents.add(componentClassName); 189 return changed; 190 } 191 192 boolean restoreComponentLPw(String componentClassName) { 193 boolean changed = enabledComponents.remove(componentClassName); 194 changed |= disabledComponents.remove(componentClassName); 195 return changed; 196 } 197 198 int getCurrentEnabledStateLPr(String componentName) { 199 if (enabledComponents.contains(componentName)) { 200 return COMPONENT_ENABLED_STATE_ENABLED; 201 } else if (disabledComponents.contains(componentName)) { 202 return COMPONENT_ENABLED_STATE_DISABLED; 203 } else { 204 return COMPONENT_ENABLED_STATE_DEFAULT; 205 } 206 } 207 }