summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/strings.xml4
-rwxr-xr-xsrc/com/android/packageinstaller/UninstallAppProgress.java48
2 files changed, 45 insertions, 7 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9b0cf678..f0747f27 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -133,6 +133,10 @@
is a current device administrator [CHAR LIMIT=80] -->
<string name="uninstall_failed_device_policy_manager">Can\'t uninstall because this package is an
active device administrator.</string>
+ <!-- String presented to the user when uninstalling a package failed because the target package
+ is a current device administrator for some user [CHAR LIMIT=80] -->
+ <string name="uninstall_failed_device_policy_manager_of_user">Can\'t uninstall because this package is an
+ active device administrator for the user <xliff:g id="username">%1$s</xliff:g>.</string>
<!-- String presented to the user when uninstalling a package failed because a profile owner
has marked the the target package as not able to be uninstalled [CHAR LIMIT=80] -->
<string name="uninstall_blocked_profile_owner">This app is needed for
diff --git a/src/com/android/packageinstaller/UninstallAppProgress.java b/src/com/android/packageinstaller/UninstallAppProgress.java
index 68d053ae..ec3295a2 100755
--- a/src/com/android/packageinstaller/UninstallAppProgress.java
+++ b/src/com/android/packageinstaller/UninstallAppProgress.java
@@ -17,6 +17,7 @@
package com.android.packageinstaller;
import android.app.Activity;
+import android.app.admin.IDevicePolicyManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -54,7 +55,6 @@ import java.util.List;
*/
public class UninstallAppProgress extends Activity implements OnClickListener {
private final String TAG="UninstallAppProgress";
- private boolean localLOGV = false;
private ApplicationInfo mAppInfo;
private boolean mAllUsers;
@@ -109,13 +109,46 @@ public class UninstallAppProgress extends Activity implements OnClickListener {
Toast.makeText(ctx, statusText, Toast.LENGTH_LONG).show();
setResultAndFinish(mResultCode);
return;
- case PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER:
- Log.d(TAG, "Uninstall failed because " + packageName
- + " is a device admin");
- mDeviceManagerButton.setVisibility(View.VISIBLE);
- statusText = getString(R.string.uninstall_failed_device_policy_manager);
+ case PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER: {
+ UserManager userManager =
+ (UserManager) getSystemService(Context.USER_SERVICE);
+ IDevicePolicyManager dpm = IDevicePolicyManager.Stub.asInterface(
+ ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
+ // Find out if the package is an active admin for some non-current user.
+ int myUserId = UserHandle.myUserId();
+ UserInfo otherBlockingUser = null;
+ for (UserInfo user : userManager.getUsers()) {
+ if (user.id == myUserId) continue;
+ UserInfo parentUser = userManager.getProfileParent(user.id);
+ // User in question is a profile of current user
+ if (parentUser != null && parentUser.id == myUserId) continue;
+
+ try {
+ if (dpm.packageHasActiveAdmins(packageName, user.id)) {
+ otherBlockingUser = user;
+ break;
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to talk to package manager", e);
+ }
+ }
+ if (otherBlockingUser == null) {
+ Log.d(TAG, "Uninstall failed because " + packageName
+ + " is a device admin");
+ mDeviceManagerButton.setVisibility(View.VISIBLE);
+ statusText = getString(
+ R.string.uninstall_failed_device_policy_manager);
+ } else {
+ Log.d(TAG, "Uninstall failed because " + packageName
+ + " is a device admin of user " + otherBlockingUser);
+ mDeviceManagerButton.setVisibility(View.GONE);
+ statusText = String.format(
+ getString(R.string.uninstall_failed_device_policy_manager_of_user),
+ otherBlockingUser.name);
+ }
break;
- case PackageManager.DELETE_FAILED_OWNER_BLOCKED:
+ }
+ case PackageManager.DELETE_FAILED_OWNER_BLOCKED: {
UserManager userManager =
(UserManager) getSystemService(Context.USER_SERVICE);
IPackageManager packageManager = IPackageManager.Stub.asInterface(
@@ -149,6 +182,7 @@ public class UninstallAppProgress extends Activity implements OnClickListener {
userName);
}
break;
+ }
default:
Log.d(TAG, "Uninstall failed for " + packageName + " with code "
+ msg.arg1);