Fix handling of application disabled state.

Change-Id: I617b76e89eeb75437b384b92f1205bb00b15bb70
This commit is contained in:
Dianne Hackborn
2010-07-24 16:32:42 -07:00
parent 3bee5af816
commit 46730fc783
2 changed files with 29 additions and 7 deletions

View File

@@ -2786,6 +2786,9 @@ public class PackageParser {
// For use by package manager to keep track of where it has done dexopt. // For use by package manager to keep track of where it has done dexopt.
public boolean mDidDexOpt; public boolean mDidDexOpt;
// User set enabled state.
public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
// Additional data supplied by callers. // Additional data supplied by callers.
public Object mExtras; public Object mExtras;
@@ -3012,6 +3015,12 @@ public class PackageParser {
} }
private static boolean copyNeeded(int flags, Package p, Bundle metaData) { private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
if (p.applicationInfo.enabled != enabled) {
return true;
}
}
if ((flags & PackageManager.GET_META_DATA) != 0 if ((flags & PackageManager.GET_META_DATA) != 0
&& (metaData != null || p.mAppMetaData != null)) { && (metaData != null || p.mAppMetaData != null)) {
return true; return true;
@@ -3045,6 +3054,7 @@ public class PackageParser {
if (!sCompatibilityModeEnabled) { if (!sCompatibilityModeEnabled) {
ai.disableCompatibilityMode(); ai.disableCompatibilityMode();
} }
ai.enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
return ai; return ai;
} }

View File

@@ -1495,6 +1495,7 @@ class PackageManagerService extends IPackageManager.Stub {
ps.pkg.applicationInfo.publicSourceDir = ps.resourcePathString; ps.pkg.applicationInfo.publicSourceDir = ps.resourcePathString;
ps.pkg.applicationInfo.sourceDir = ps.codePathString; ps.pkg.applicationInfo.sourceDir = ps.codePathString;
ps.pkg.applicationInfo.dataDir = getDataPathForPackage(ps.pkg).getPath(); ps.pkg.applicationInfo.dataDir = getDataPathForPackage(ps.pkg).getPath();
ps.pkg.mSetEnabled = ps.enabled;
} }
return generatePackageInfo(ps.pkg, flags); return generatePackageInfo(ps.pkg, flags);
} }
@@ -6875,6 +6876,7 @@ class PackageManagerService extends IPackageManager.Stub {
return; return;
} }
pkgSetting.enabled = newState; pkgSetting.enabled = newState;
pkgSetting.pkg.mSetEnabled = newState;
} else { } else {
// We're dealing with a component level state change // We're dealing with a component level state change
switch (newState) { switch (newState) {
@@ -8261,6 +8263,7 @@ class PackageManagerService extends IPackageManager.Stub {
private void insertPackageSettingLP(PackageSetting p, PackageParser.Package pkg) { private void insertPackageSettingLP(PackageSetting p, PackageParser.Package pkg) {
p.pkg = pkg; p.pkg = pkg;
pkg.mSetEnabled = p.enabled;
String codePath = pkg.applicationInfo.sourceDir; String codePath = pkg.applicationInfo.sourceDir;
String resourcePath = pkg.applicationInfo.publicSourceDir; String resourcePath = pkg.applicationInfo.publicSourceDir;
// Update code path if needed // Update code path if needed
@@ -9486,6 +9489,9 @@ class PackageManagerService extends IPackageManager.Stub {
} }
boolean isEnabledLP(ComponentInfo componentInfo, int flags) { boolean isEnabledLP(ComponentInfo componentInfo, int flags) {
if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
return true;
}
final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); final PackageSetting packageSettings = mPackages.get(componentInfo.packageName);
if (Config.LOGV) { if (Config.LOGV) {
Log.v(TAG, "isEnabledLock - packageName = " + componentInfo.packageName Log.v(TAG, "isEnabledLock - packageName = " + componentInfo.packageName
@@ -9501,14 +9507,20 @@ class PackageManagerService extends IPackageManager.Stub {
Debug.waitForDebugger(); Debug.waitForDebugger();
Log.i(TAG, "We will crash!"); Log.i(TAG, "We will crash!");
} }
return false;
} }
return ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED
|| ((componentInfo.enabled || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
&& ((packageSettings.enabled == COMPONENT_ENABLED_STATE_ENABLED) && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
|| (componentInfo.applicationInfo.enabled return false;
&& packageSettings.enabled != COMPONENT_ENABLED_STATE_DISABLED)) }
&& !packageSettings.disabledComponents.contains(componentInfo.name)) if (packageSettings.enabledComponents.contains(componentInfo.name)) {
|| packageSettings.enabledComponents.contains(componentInfo.name)); return true;
}
if (packageSettings.disabledComponents.contains(componentInfo.name)) {
return false;
}
return componentInfo.enabled;
} }
} }