Merge "Switch to returnCode for IPackageDeleteObserver"
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index cc6e739..d058e38 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -767,10 +767,10 @@
         boolean finished;
         boolean result;
 
-        public void packageDeleted(boolean succeeded) {
+        public void packageDeleted(String packageName, int returnCode) {
             synchronized (this) {
                 finished = true;
-                result = succeeded;
+                result = returnCode == PackageManager.DELETE_SUCCEEDED;
                 notifyAll();
             }
         }
diff --git a/core/java/android/content/pm/IPackageDeleteObserver.aidl b/core/java/android/content/pm/IPackageDeleteObserver.aidl
index bc16b3e..2e2d16e 100644
--- a/core/java/android/content/pm/IPackageDeleteObserver.aidl
+++ b/core/java/android/content/pm/IPackageDeleteObserver.aidl
@@ -23,6 +23,6 @@
  * {@hide}
  */
 oneway interface IPackageDeleteObserver {
-    void packageDeleted(in boolean succeeded);
+    void packageDeleted(in String packageName, in int returnCode);
 }
 
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 7525749..fc07478 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -552,9 +552,38 @@
     public static final int DONT_DELETE_DATA = 0x00000001;
 
     /**
+     * Return code for when package deletion succeeds. This is passed to the
+     * {@link IPackageDeleteObserver} by {@link #deletePackage()} if the system
+     * succeeded in deleting the package.
+     * 
+     * @hide
+     */
+    public static final int DELETE_SUCCEEDED = 1;
+
+    /**
+     * Deletion failed return code: this is passed to the
+     * {@link IPackageDeleteObserver} by {@link #deletePackage()} if the system
+     * failed to delete the package for an unspecified reason.
+     * 
+     * @hide
+     */
+    public static final int DELETE_FAILED_INTERNAL_ERROR = -1;
+
+    /**
+     * Deletion failed return code: this is passed to the
+     * {@link IPackageDeleteObserver} by {@link #deletePackage()} if the system
+     * failed to delete the package because it is the active DevicePolicy
+     * manager.
+     * 
+     * @hide
+     */
+    public static final int DELETE_FAILED_DEVICE_POLICY_MANAGER = -2;
+
+    /**
      * Return code that is passed to the {@link IPackageMoveObserver} by
-     * {@link #movePackage(android.net.Uri, IPackageMoveObserver)}
-     * when the package has been successfully moved by the system.
+     * {@link #movePackage(android.net.Uri, IPackageMoveObserver)} when the
+     * package has been successfully moved by the system.
+     * 
      * @hide
      */
     public static final int MOVE_SUCCEEDED = 1;
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 7af64e4..5d28ef7 100755
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -769,9 +769,9 @@
             return doneFlag;
         }
 
-        public void packageDeleted(boolean succeeded) throws RemoteException {
+        public void packageDeleted(String packageName, int returnCode) throws RemoteException {
             synchronized(this) {
-                this.succeeded = succeeded;
+                this.succeeded = returnCode == PackageManager.DELETE_SUCCEEDED;
                 doneFlag = true;
                 notifyAll();
             }
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index f1a6e15..461a3e5 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -6204,10 +6204,10 @@
         mHandler.post(new Runnable() {
             public void run() {
                 mHandler.removeCallbacks(this);
-                final boolean succeded = deletePackageX(packageName, true, true, flags);
+                final int returnCode = deletePackageX(packageName, true, true, flags);
                 if (observer != null) {
                     try {
-                        observer.packageDeleted(succeded);
+                        observer.packageDeleted(packageName, returnCode);
                     } catch (RemoteException e) {
                         Log.i(TAG, "Observer no longer exists.");
                     } //end catch
@@ -6230,17 +6230,17 @@
      *  persisting settings for later use
      *  sending a broadcast if necessary
      */
-    private boolean deletePackageX(String packageName, boolean sendBroadCast,
+    private int deletePackageX(String packageName, boolean sendBroadCast,
                                    boolean deleteCodeAndResources, int flags) {
-        PackageRemovedInfo info = new PackageRemovedInfo();
-        boolean res;
+        final PackageRemovedInfo info = new PackageRemovedInfo();
+        final boolean res;
 
         IDevicePolicyManager dpm = IDevicePolicyManager.Stub.asInterface(
                 ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
         try {
             if (dpm != null && dpm.packageHasActiveAdmins(packageName)) {
                 Slog.w(TAG, "Not removing package " + packageName + ": has active device admin");
-                return false;
+                return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
             }
         } catch (RemoteException e) {
         }
@@ -6250,7 +6250,7 @@
                     flags | REMOVE_CHATTY, info, true);
         }
 
-        if(res && sendBroadCast) {
+        if (res && sendBroadCast) {
             boolean systemUpdate = info.isRemovedPackageSystemUpdate;
             info.sendBroadcast(deleteCodeAndResources, systemUpdate);
 
@@ -6278,7 +6278,8 @@
                 info.args.doPostDeleteLI(deleteCodeAndResources);
             }
         }
-        return res;
+
+        return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;
     }
 
     static class PackageRemovedInfo {