* commit '6967c04fd77023368514329c1213fba60f5a9b5a': Fix issue #5320747: Disabling an app that is an active device administrator...
This commit is contained in:
@@ -25,6 +25,7 @@ import android.app.AlertDialog;
|
|||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.DialogFragment;
|
import android.app.DialogFragment;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
@@ -86,6 +87,7 @@ public class InstalledAppDetails extends Fragment
|
|||||||
|
|
||||||
private PackageManager mPm;
|
private PackageManager mPm;
|
||||||
private IUsbManager mUsbManager;
|
private IUsbManager mUsbManager;
|
||||||
|
private DevicePolicyManager mDpm;
|
||||||
private ApplicationsState mState;
|
private ApplicationsState mState;
|
||||||
private ApplicationsState.AppEntry mAppEntry;
|
private ApplicationsState.AppEntry mAppEntry;
|
||||||
private PackageInfo mPackageInfo;
|
private PackageInfo mPackageInfo;
|
||||||
@@ -206,7 +208,8 @@ public class InstalledAppDetails extends Fragment
|
|||||||
private void initDataButtons() {
|
private void initDataButtons() {
|
||||||
if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
|
if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
|
||||||
| ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
|
| ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
|
||||||
== ApplicationInfo.FLAG_SYSTEM) {
|
== ApplicationInfo.FLAG_SYSTEM
|
||||||
|
|| mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
|
||||||
mClearDataButton.setText(R.string.clear_user_data_text);
|
mClearDataButton.setText(R.string.clear_user_data_text);
|
||||||
mClearDataButton.setEnabled(false);
|
mClearDataButton.setEnabled(false);
|
||||||
mCanClearData = false;
|
mCanClearData = false;
|
||||||
@@ -304,6 +307,11 @@ public class InstalledAppDetails extends Fragment
|
|||||||
mUninstallButton.setText(R.string.uninstall_text);
|
mUninstallButton.setText(R.string.uninstall_text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If this is a device admin, it can't be uninstall or disabled.
|
||||||
|
// We do this here so the text of the button is still set correctly.
|
||||||
|
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
mUninstallButton.setEnabled(enabled);
|
mUninstallButton.setEnabled(enabled);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
// Register listener
|
// Register listener
|
||||||
@@ -320,6 +328,7 @@ public class InstalledAppDetails extends Fragment
|
|||||||
mPm = getActivity().getPackageManager();
|
mPm = getActivity().getPackageManager();
|
||||||
IBinder b = ServiceManager.getService(Context.USB_SERVICE);
|
IBinder b = ServiceManager.getService(Context.USB_SERVICE);
|
||||||
mUsbManager = IUsbManager.Stub.asInterface(b);
|
mUsbManager = IUsbManager.Stub.asInterface(b);
|
||||||
|
mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||||
|
|
||||||
mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
|
mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
|
||||||
}
|
}
|
||||||
@@ -809,15 +818,18 @@ public class InstalledAppDetails extends Fragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkForceStop() {
|
private void checkForceStop() {
|
||||||
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
|
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
|
||||||
Uri.fromParts("package", mAppEntry.info.packageName, null));
|
// User can't force stop device admin.
|
||||||
intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
|
updateForceStopButton(false);
|
||||||
intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
|
} else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
|
||||||
if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
|
|
||||||
// If the app isn't explicitly stopped, then always show the
|
// If the app isn't explicitly stopped, then always show the
|
||||||
// force stop button.
|
// force stop button.
|
||||||
updateForceStopButton(true);
|
updateForceStopButton(true);
|
||||||
} else {
|
} else {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
|
||||||
|
Uri.fromParts("package", mAppEntry.info.packageName, null));
|
||||||
|
intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
|
||||||
|
intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
|
||||||
getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
|
getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
|
||||||
Activity.RESULT_CANCELED, null, null);
|
Activity.RESULT_CANCELED, null, null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import android.app.Activity;
|
|||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.ApplicationErrorReport;
|
import android.app.ApplicationErrorReport;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -102,7 +103,8 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
|
|||||||
public static final String EXTRA_NO_COVERAGE = "noCoverage";
|
public static final String EXTRA_NO_COVERAGE = "noCoverage";
|
||||||
public static final String EXTRA_ICON_ID = "iconId"; // Int
|
public static final String EXTRA_ICON_ID = "iconId"; // Int
|
||||||
|
|
||||||
private static final boolean DEBUG = true;
|
private PackageManager mPm;
|
||||||
|
private DevicePolicyManager mDpm;
|
||||||
private String mTitle;
|
private String mTitle;
|
||||||
private int mUsageSince;
|
private int mUsageSince;
|
||||||
private int[] mTypes;
|
private int[] mTypes;
|
||||||
@@ -131,6 +133,8 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
|
mPm = getActivity().getPackageManager();
|
||||||
|
mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -429,6 +433,22 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
|
|||||||
mForceStopButton.setEnabled(false);
|
mForceStopButton.setEnabled(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < mPackages.length; i++) {
|
||||||
|
if (mDpm.packageHasActiveAdmins(mPackages[i])) {
|
||||||
|
mForceStopButton.setEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < mPackages.length; i++) {
|
||||||
|
try {
|
||||||
|
ApplicationInfo info = mPm.getApplicationInfo(mPackages[i], 0);
|
||||||
|
if ((info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
|
||||||
|
mForceStopButton.setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
|
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
|
||||||
Uri.fromParts("package", mPackages[0], null));
|
Uri.fromParts("package", mPackages[0], null));
|
||||||
intent.putExtra(Intent.EXTRA_PACKAGES, mPackages);
|
intent.putExtra(Intent.EXTRA_PACKAGES, mPackages);
|
||||||
|
|||||||
Reference in New Issue
Block a user