Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e21ec92 authored by Suchi Amalapurapu's avatar Suchi Amalapurapu Committed by Android Git Automerger
Browse files

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

Merge commit '40b6996a' into froyo-plus-aosp

* commit '40b6996a':
  Add ordered broadcast when removing packages.
parents bad5f620 40b6996a
Loading
Loading
Loading
Loading
+31 −28
Original line number Diff line number Diff line
@@ -570,14 +570,15 @@ class PackageManagerService extends IPackageManager.Stub {
                    if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
                    PostInstallData data = mRunningInstalls.get(msg.arg1);
                    mRunningInstalls.delete(msg.arg1);
                    boolean deleteOld = false;

                    if (data != null) {
                        InstallArgs args = data.args;
                        PackageInstalledInfo res = data.res;

                        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);
                            extras.putInt(Intent.EXTRA_UID, res.uid);
                            final boolean update = res.removedInfo.removedPackage != null;
@@ -592,18 +593,6 @@ class PackageManagerService extends IPackageManager.Stub {
                                        res.pkg.applicationInfo.packageName,
                                        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) {
                            try {
@@ -6076,7 +6065,8 @@ class PackageManagerService extends IPackageManager.Stub {

        if(res && sendBroadCast) {
            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
            // was re-enabled; we need to broadcast this information
@@ -6089,18 +6079,29 @@ class PackageManagerService extends IPackageManager.Stub {
                sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, extras, null);
            }
        }
        // Force a gc here.
        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();
        // Delete the resources here after sending the broadcast to let
        // other processes clean up before deleting resources.
        if (info.args != null) {
            // We delete after a gc for applications  on sdcard.
            if (deleteOld && args != null) {
                synchronized (mInstallLock) {
                info.args.doPostDeleteLI(deleteCodeAndResources);
                    args.doPostDeleteLI(true);
                }
            }
        }
        return res;
    }

    static class PackageRemovedInfo {
        String removedPackage;
        int uid = -1;
@@ -6109,7 +6110,8 @@ class PackageManagerService extends IPackageManager.Stub {
        // Clean up resources deleted packages.
        InstallArgs args = null;

        void sendBroadcast(boolean fullRemove, boolean replacing) {
        void sendBroadcast(boolean fullRemove, boolean replacing,
                IIntentReceiver finishedReceiver) {
            Bundle extras = new Bundle(1);
            extras.putInt(Intent.EXTRA_UID, removedUid >= 0 ? removedUid : uid);
            extras.putBoolean(Intent.EXTRA_DATA_REMOVED, fullRemove);
@@ -6117,7 +6119,7 @@ class PackageManagerService extends IPackageManager.Stub {
                extras.putBoolean(Intent.EXTRA_REPLACING, true);
            }
            if (removedPackage != null) {
                sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, extras, null);
                sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, extras, finishedReceiver);
            }
            if (removedUid >= 0) {
                sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, null);
@@ -9799,6 +9801,7 @@ class PackageManagerService extends IPackageManager.Stub {
                   }
                   if (returnCode == PackageManager.MOVE_SUCCEEDED) {
                       // Send resources unavailable broadcast
                       // TODO Add an ordered broadcast receiver here.
                       sendResourcesChangedBroadcast(false, pkgList, uidArr, null);
                       // Update package code and resource paths
                       synchronized (mInstallLock) {
@@ -9849,11 +9852,11 @@ class PackageManagerService extends IPackageManager.Stub {
                                   }
                               }
                           }
                       }
                       // Send resources available broadcast
                       sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
                   }
               }
               }
               if (returnCode != PackageManager.MOVE_SUCCEEDED){
                   // Clean up failed installation
                   if (mp.targetArgs != null) {