auto import from //branches/cupcake_rel/...@140373
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 9f428e9..2cf47df 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -57,7 +57,6 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.pm.Signature;
-import android.content.pm.PackageParser.Package;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
@@ -129,6 +128,7 @@
     static final int SCAN_FORCE_DEX = 1<<2;
     static final int SCAN_UPDATE_SIGNATURE = 1<<3;
     static final int SCAN_FORWARD_LOCKED = 1<<4;
+    static final int SCAN_NEW_INSTALL = 1<<5;
     
     static final int LOG_BOOT_PROGRESS_PMS_START = 3060;
     static final int LOG_BOOT_PROGRESS_PMS_SYSTEM_SCAN_START = 3070;
@@ -1963,6 +1963,31 @@
                 }
                 removeExisting = true;
             }
+            
+            // Verify that this new package doesn't have any content providers
+            // that conflict with existing packages.  Only do this if the
+            // package isn't already installed, since we don't want to break
+            // things that are installed.
+            if ((scanMode&SCAN_NEW_INSTALL) != 0) {
+                int N = pkg.providers.size();
+                int i;
+                for (i=0; i<N; i++) {
+                    PackageParser.Provider p = pkg.providers.get(i);
+                    String names[] = p.info.authority.split(";");
+                    for (int j = 0; j < names.length; j++) {
+                        if (mProviders.containsKey(names[j])) {
+                            PackageParser.Provider other = mProviders.get(names[j]);
+                            Log.w(TAG, "Can't install because provider name " + names[j] +
+                                    " (in package " + pkg.applicationInfo.packageName +
+                                    ") is already used by "
+                                    + ((other != null && other.component != null)
+                                            ? other.component.getPackageName() : "?"));
+                            mLastScanError = PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER;
+                            return null;
+                        }
+                    }
+                }
+            }
         }
 
         if (removeExisting) {
@@ -2181,9 +2206,12 @@
                             ", className = " + p.info.name +
                             ", isSyncable = " + p.info.isSyncable);
                     } else {
+                        PackageParser.Provider other = mProviders.get(names[j]);
                         Log.w(TAG, "Skipping provider name " + names[j] +
                               " (in package " + pkg.applicationInfo.packageName +
-                              "): name already used");
+                              "): name already used by "
+                              + ((other != null && other.component != null)
+                                      ? other.component.getPackageName() : "?"));
                     }
                 }
                 if ((parseFlags&PackageParser.PARSE_CHATTY) != 0) {
@@ -3205,7 +3233,7 @@
                 mHandler.removeCallbacks(this);
                 PackageInstalledInfo res;
                 synchronized (mInstallLock) {
-                    res = installPackageLI(packageURI, flags);
+                    res = installPackageLI(packageURI, flags, true);
                 }
                 if (observer != null) {
                     try {
@@ -3246,7 +3274,7 @@
     private void installNewPackageLI(String pkgName,
             File tmpPackageFile, 
             String destFilePath, File destPackageFile, File destResourceFile,
-            PackageParser.Package pkg, boolean forwardLocked,
+            PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             PackageInstalledInfo res) {
         // Remember this for later, in case we need to rollback this install
         boolean dataDirExists = (new File(mAppDataDir, pkgName)).exists();
@@ -3270,7 +3298,8 @@
                 destResourceFile, pkg, 0,
                 SCAN_MONITOR | SCAN_FORCE_DEX
                 | SCAN_UPDATE_SIGNATURE 
-                | (forwardLocked ? SCAN_FORWARD_LOCKED : 0));
+                | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
+                | (newInstall ? SCAN_NEW_INSTALL : 0));
         if (newPackage == null) {
             Log.w(TAG, "Package couldn't be installed in " + destPackageFile);
             if ((res.returnCode=mLastScanError) == PackageManager.INSTALL_SUCCEEDED) {
@@ -3302,7 +3331,7 @@
     private void replacePackageLI(String pkgName,
             File tmpPackageFile, 
             String destFilePath, File destPackageFile, File destResourceFile,
-            PackageParser.Package pkg, boolean forwardLocked,
+            PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             PackageInstalledInfo res) {
         PackageParser.Package deletedPackage;
         // First find the old package info and check signatures
@@ -3317,17 +3346,19 @@
         if(sysPkg) {
             replaceSystemPackageLI(deletedPackage, 
                     tmpPackageFile, destFilePath, 
-                    destPackageFile, destResourceFile, pkg, forwardLocked, res);
+                    destPackageFile, destResourceFile, pkg, forwardLocked,
+                    newInstall, res);
         } else {
             replaceNonSystemPackageLI(deletedPackage, tmpPackageFile, destFilePath, 
-                    destPackageFile, destResourceFile, pkg, forwardLocked, res);
+                    destPackageFile, destResourceFile, pkg, forwardLocked,
+                    newInstall, res);
         }
     }
     
     private void replaceNonSystemPackageLI(PackageParser.Package deletedPackage,
             File tmpPackageFile, 
             String destFilePath, File destPackageFile, File destResourceFile,
-            PackageParser.Package pkg, boolean forwardLocked,
+            PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             PackageInstalledInfo res) {
         PackageParser.Package newPackage = null;
         String pkgName = deletedPackage.packageName;
@@ -3347,7 +3378,8 @@
                     destResourceFile, pkg, parseFlags,
                     SCAN_MONITOR | SCAN_FORCE_DEX
                     | SCAN_UPDATE_SIGNATURE 
-                    | (forwardLocked ? SCAN_FORWARD_LOCKED : 0));
+                    | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
+                    | (newInstall ? SCAN_NEW_INSTALL : 0));
             if (newPackage == null) {
                     Log.w(TAG, "Package couldn't be installed in " + destPackageFile);
                 if ((res.returnCode=mLastScanError) == PackageManager.INSTALL_SUCCEEDED) {
@@ -3404,7 +3436,7 @@
                         Uri.fromFile(new File(deletedPackage.mPath)),
                         isForwardLocked(deletedPackage)
                         ? PackageManager.FORWARD_LOCK_PACKAGE
-                                : 0);
+                                : 0, false);
             }
         }
     }
@@ -3412,7 +3444,7 @@
     private void replaceSystemPackageLI(PackageParser.Package deletedPackage,
             File tmpPackageFile, 
             String destFilePath, File destPackageFile, File destResourceFile,
-            PackageParser.Package pkg, boolean forwardLocked,
+            PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             PackageInstalledInfo res) {
         PackageParser.Package newPackage = null;
         boolean updatedSettings = false;
@@ -3450,7 +3482,8 @@
                 destResourceFile, pkg, parseFlags,
                 SCAN_MONITOR | SCAN_FORCE_DEX
                 | SCAN_UPDATE_SIGNATURE 
-                | (forwardLocked ? SCAN_FORWARD_LOCKED : 0));
+                | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
+                | (newInstall ? SCAN_NEW_INSTALL : 0));
         if (newPackage == null) {
             Log.w(TAG, "Package couldn't be installed in " + destPackageFile);
             if ((res.returnCode=mLastScanError) == PackageManager.INSTALL_SUCCEEDED) {
@@ -3484,8 +3517,7 @@
                     oldPkgSetting.resourcePath,
                     oldPkg, parseFlags,
                     SCAN_MONITOR
-                    | SCAN_UPDATE_SIGNATURE
-                    | (forwardLocked ? SCAN_FORWARD_LOCKED : 0));
+                    | SCAN_UPDATE_SIGNATURE);
             // Restore the old system information in Settings
             synchronized(mPackages) {
                 if(updatedSettings) {
@@ -3556,7 +3588,8 @@
         }
     }
     
-    private PackageInstalledInfo installPackageLI(Uri pPackageURI, int pFlags) {
+    private PackageInstalledInfo installPackageLI(Uri pPackageURI,
+            int pFlags, boolean newInstall) {
         File tmpPackageFile = null;
         String pkgName = null;
         boolean forwardLocked = false;
@@ -3669,21 +3702,21 @@
                 replacePackageLI(pkgName,
                         tmpPackageFile, 
                         destFilePath, destPackageFile, destResourceFile,
-                        pkg, forwardLocked,
+                        pkg, forwardLocked, newInstall,
                         res);
             } else {
                 installNewPackageLI(pkgName,
                         tmpPackageFile, 
                         destFilePath, destPackageFile, destResourceFile,
-                        pkg, forwardLocked,
+                        pkg, forwardLocked, newInstall,
                         res);
             }
         } finally {
             if (tmpPackageFile != null && tmpPackageFile.exists()) {
                 tmpPackageFile.delete();
             }
-            return res;
         }
+        return res;
     }
     
     private int setPermissionsLI(String pkgName,