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

Commit 4e183215 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android Git Automerger
Browse files

am 1073e3fa: Merge "Don\'t write settings multiple times when unmounting." into gingerbread

Merge commit '1073e3fa' into gingerbread-plus-aosp

* commit '1073e3fa':
  Don't write settings multiple times when unmounting.
parents fbd5a59d 1073e3fa
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -5466,7 +5466,7 @@ class PackageManagerService extends IPackageManager.Stub {
                deletePackageLI(
                        pkgName, false,
                        dataDirExists ? PackageManager.DONT_DELETE_DATA : 0,
                                res.removedInfo);
                                res.removedInfo, true);
            }
        }
    }
@@ -5511,7 +5511,7 @@ class PackageManagerService extends IPackageManager.Stub {

        // First delete the existing package while retaining the data directory
        if (!deletePackageLI(pkgName, true, PackageManager.DONT_DELETE_DATA,
                res.removedInfo)) {
                res.removedInfo, true)) {
            // If the existing package was'nt successfully deleted
            res.returnCode = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
            deletedPkg = false;
@@ -5541,7 +5541,7 @@ class PackageManagerService extends IPackageManager.Stub {
                deletePackageLI(
                        pkgName, true,
                        PackageManager.DONT_DELETE_DATA,
                                res.removedInfo);
                                res.removedInfo, true);
            }
            // Since we failed to install the new package we need to restore the old
            // package that we deleted.
@@ -6009,7 +6009,7 @@ class PackageManagerService extends IPackageManager.Stub {
        
        synchronized (mInstallLock) {
            res = deletePackageLI(packageName, deleteCodeAndResources,
                    flags | REMOVE_CHATTY, info);
                    flags | REMOVE_CHATTY, info, true);
        }

        if(res && sendBroadCast) {
@@ -6070,7 +6070,7 @@ class PackageManagerService extends IPackageManager.Stub {
     * delete a partially installed application.
     */
    private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo,
            int flags) {
            int flags, boolean writeSettings) {
        String packageName = p.packageName;
        if (outInfo != null) {
            outInfo.removedPackage = packageName;
@@ -6123,16 +6123,18 @@ class PackageManagerService extends IPackageManager.Stub {
                    mSettings.mPreferredActivities.removeFilter(pa);
                }
            }
            if (writeSettings) {
                // Save settings now
                mSettings.writeLP();
            }
        }
    }

    /*
     * Tries to delete system package.
     */
    private boolean deleteSystemPackageLI(PackageParser.Package p,
            int flags, PackageRemovedInfo outInfo) {
            int flags, PackageRemovedInfo outInfo, boolean writeSettings) {
        ApplicationInfo applicationInfo = p.applicationInfo;
        //applicable for non-partially installed applications only
        if (applicationInfo == null) {
@@ -6164,7 +6166,8 @@ class PackageManagerService extends IPackageManager.Stub {
            deleteCodeAndResources = false;
            flags |= PackageManager.DONT_DELETE_DATA;
        }
        boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
        boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
                writeSettings);
        if (!ret) {
            return false;
        }
@@ -6185,13 +6188,16 @@ class PackageManagerService extends IPackageManager.Stub {
        }
        synchronized (mPackages) {
            updatePermissionsLP(newPkg.packageName, newPkg, true, true, false);
            if (writeSettings) {
                mSettings.writeLP();
            }
        }
        return true;
    }

    private boolean deleteInstalledPackageLI(PackageParser.Package p,
            boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
            boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
            boolean writeSettings) {
        ApplicationInfo applicationInfo = p.applicationInfo;
        if (applicationInfo == null) {
            Slog.w(TAG, "Package " + p.packageName + " has no applicationInfo.");
@@ -6202,7 +6208,7 @@ class PackageManagerService extends IPackageManager.Stub {
        }

        // Delete package data from internal structures and also remove data if flag is set
        removePackageDataLI(p, outInfo, flags);
        removePackageDataLI(p, outInfo, flags, writeSettings);

        // Delete application code and resources
        if (deleteCodeAndResources) {
@@ -6219,7 +6225,8 @@ class PackageManagerService extends IPackageManager.Stub {
     * This method handles package deletion in general
     */
    private boolean deletePackageLI(String packageName,
            boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
            boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
            boolean writeSettings) {
        if (packageName == null) {
            Slog.w(TAG, "Attempt to delete null packageName.");
            return false;
@@ -6246,7 +6253,7 @@ class PackageManagerService extends IPackageManager.Stub {

        if (dataOnly) {
            // Delete application data first
            removePackageDataLI(p, outInfo, flags);
            removePackageDataLI(p, outInfo, flags, writeSettings);
            return true;
        }
        // At this point the package should have ApplicationInfo associated with it
@@ -6259,12 +6266,13 @@ class PackageManagerService extends IPackageManager.Stub {
            Log.i(TAG, "Removing system package:"+p.packageName);
            // When an updated system application is deleted we delete the existing resources as well and
            // fall back to existing code in system partition
            ret = deleteSystemPackageLI(p, flags, outInfo);
            ret = deleteSystemPackageLI(p, flags, outInfo, writeSettings);
        } else {
            Log.i(TAG, "Removing non-system package:"+p.packageName);
            // Kill application pre-emptively especially for apps on sd.
            killApplication(packageName, p.applicationInfo.uid);
            ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
            ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
                    writeSettings);
        }
        return ret;
    }
@@ -9738,7 +9746,7 @@ class PackageManagerService extends IPackageManager.Stub {
           PackageRemovedInfo outInfo = new PackageRemovedInfo();
           synchronized (mInstallLock) {
               boolean res = deletePackageLI(pkgName, false,
                       PackageManager.DONT_DELETE_DATA, outInfo);
                       PackageManager.DONT_DELETE_DATA, outInfo, false);
               if (res) {
                   pkgList.add(pkgName);
               } else {
@@ -9747,6 +9755,13 @@ class PackageManagerService extends IPackageManager.Stub {
               }
           }
       }

       synchronized (mPackages) {
           // We didn't update the settings after removing each package;
           // write them now for all packages.
           mSettings.writeLP();
       }

       // We have to absolutely send UPDATED_MEDIA_STATUS only
       // after confirming that all the receivers processed the ordered
       // broadcast when packages get disabled, force a gc to clean things up.