am 1e21ec92: am 40b6996a: Merge "Add ordered broadcast when removing packages." into froyo

Merge commit '1e21ec923404a000c46590e4a87ae9ebe87e628e' into kraken

* commit '1e21ec923404a000c46590e4a87ae9ebe87e628e':
  Add ordered broadcast when removing packages.
This commit is contained in:
Suchi Amalapurapu
2010-04-14 18:18:29 -07:00
committed by Android Git Automerger

View File

@@ -576,14 +576,15 @@ class PackageManagerService extends IPackageManager.Stub {
if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1); if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
PostInstallData data = mRunningInstalls.get(msg.arg1); PostInstallData data = mRunningInstalls.get(msg.arg1);
mRunningInstalls.delete(msg.arg1); mRunningInstalls.delete(msg.arg1);
boolean deleteOld = false;
if (data != null) { if (data != null) {
InstallArgs args = data.args; InstallArgs args = data.args;
PackageInstalledInfo res = data.res; PackageInstalledInfo res = data.res;
if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) { if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {
res.removedInfo.sendBroadcast(false, true); res.removedInfo.sendBroadcast(false, true,
new PackageRemovedIntentReceiver(res.removedInfo.args,
res.removedInfo.args != null));
Bundle extras = new Bundle(1); Bundle extras = new Bundle(1);
extras.putInt(Intent.EXTRA_UID, res.uid); extras.putInt(Intent.EXTRA_UID, res.uid);
final boolean update = res.removedInfo.removedPackage != null; final boolean update = res.removedInfo.removedPackage != null;
@@ -598,18 +599,6 @@ class PackageManagerService extends IPackageManager.Stub {
res.pkg.applicationInfo.packageName, res.pkg.applicationInfo.packageName,
extras, null); extras, null);
} }
if (res.removedInfo.args != null) {
// Remove the replaced package's older resources safely now
deleteOld = true;
}
}
// Force a gc to clear up things
Runtime.getRuntime().gc();
// We delete after a gc for applications on sdcard.
if (deleteOld) {
synchronized (mInstallLock) {
res.removedInfo.args.doPostDeleteLI(true);
}
} }
if (args.observer != null) { if (args.observer != null) {
try { try {
@@ -6100,7 +6089,8 @@ class PackageManagerService extends IPackageManager.Stub {
if(res && sendBroadCast) { if(res && sendBroadCast) {
boolean systemUpdate = info.isRemovedPackageSystemUpdate; boolean systemUpdate = info.isRemovedPackageSystemUpdate;
info.sendBroadcast(deleteCodeAndResources, systemUpdate); info.sendBroadcast(deleteCodeAndResources, systemUpdate,
new PackageRemovedIntentReceiver(info.args, deleteCodeAndResources));
// If the removed package was a system update, the old system packaged // If the removed package was a system update, the old system packaged
// was re-enabled; we need to broadcast this information // was re-enabled; we need to broadcast this information
@@ -6113,18 +6103,29 @@ class PackageManagerService extends IPackageManager.Stub {
sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, extras, null); sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, extras, null);
} }
} }
// Force a gc here.
Runtime.getRuntime().gc();
// Delete the resources here after sending the broadcast to let
// other processes clean up before deleting resources.
if (info.args != null) {
synchronized (mInstallLock) {
info.args.doPostDeleteLI(deleteCodeAndResources);
}
}
return res; return res;
} }
class PackageRemovedIntentReceiver extends IIntentReceiver.Stub {
boolean deleteOld;
InstallArgs args;
PackageRemovedIntentReceiver(InstallArgs args, boolean deleteOld) {
this.args = args;
this.deleteOld = deleteOld;
}
@Override
public void performReceive(Intent intent, int resultCode, String data, Bundle extras,
boolean ordered, boolean sticky) throws RemoteException {
// Force a gc to clear up things
Runtime.getRuntime().gc();
// We delete after a gc for applications on sdcard.
if (deleteOld && args != null) {
synchronized (mInstallLock) {
args.doPostDeleteLI(true);
}
}
}
}
static class PackageRemovedInfo { static class PackageRemovedInfo {
String removedPackage; String removedPackage;
int uid = -1; int uid = -1;
@@ -6133,7 +6134,8 @@ class PackageManagerService extends IPackageManager.Stub {
// Clean up resources deleted packages. // Clean up resources deleted packages.
InstallArgs args = null; InstallArgs args = null;
void sendBroadcast(boolean fullRemove, boolean replacing) { void sendBroadcast(boolean fullRemove, boolean replacing,
IIntentReceiver finishedReceiver) {
Bundle extras = new Bundle(1); Bundle extras = new Bundle(1);
extras.putInt(Intent.EXTRA_UID, removedUid >= 0 ? removedUid : uid); extras.putInt(Intent.EXTRA_UID, removedUid >= 0 ? removedUid : uid);
extras.putBoolean(Intent.EXTRA_DATA_REMOVED, fullRemove); extras.putBoolean(Intent.EXTRA_DATA_REMOVED, fullRemove);
@@ -6141,7 +6143,7 @@ class PackageManagerService extends IPackageManager.Stub {
extras.putBoolean(Intent.EXTRA_REPLACING, true); extras.putBoolean(Intent.EXTRA_REPLACING, true);
} }
if (removedPackage != null) { if (removedPackage != null) {
sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, extras, null); sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, extras, finishedReceiver);
} }
if (removedUid >= 0) { if (removedUid >= 0) {
sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, null); sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, null);
@@ -9835,6 +9837,7 @@ class PackageManagerService extends IPackageManager.Stub {
} }
if (returnCode == PackageManager.MOVE_SUCCEEDED) { if (returnCode == PackageManager.MOVE_SUCCEEDED) {
// Send resources unavailable broadcast // Send resources unavailable broadcast
// TODO Add an ordered broadcast receiver here.
sendResourcesChangedBroadcast(false, pkgList, uidArr, null); sendResourcesChangedBroadcast(false, pkgList, uidArr, null);
// Update package code and resource paths // Update package code and resource paths
synchronized (mInstallLock) { synchronized (mInstallLock) {
@@ -9885,9 +9888,9 @@ class PackageManagerService extends IPackageManager.Stub {
} }
} }
} }
// Send resources available broadcast
sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
} }
// Send resources available broadcast
sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
} }
} }
if (returnCode != PackageManager.MOVE_SUCCEEDED){ if (returnCode != PackageManager.MOVE_SUCCEEDED){