diff options
5 files changed, 45 insertions, 15 deletions
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 @@ public final class Pm { 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 @@ package android.content.pm; * {@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 abstract class PackageManager { 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 @@ public class PackageManagerTests extends AndroidTestCase { 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 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { * 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 @@ class PackageManagerService extends IPackageManager.Stub { flags | REMOVE_CHATTY, info, true); } - if(res && sendBroadCast) { + if (res && sendBroadCast) { boolean systemUpdate = info.isRemovedPackageSystemUpdate; info.sendBroadcast(deleteCodeAndResources, systemUpdate); @@ -6278,7 +6278,8 @@ class PackageManagerService extends IPackageManager.Stub { info.args.doPostDeleteLI(deleteCodeAndResources); } } - return res; + + return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR; } static class PackageRemovedInfo { |