Skip to content

Commit 7155bcd

Browse files
committed
Added Shell commands to suspend personal apps.
Example: $ adb shell pm create-user --profileOf 0 --managed Dilbert Success: created user id 10 $ adb install -t --user all TestDPC-normal-debug.apk $ adb shell dpm set-profile-owner --user 10 com.afwsamples.testdpc/.DeviceAdminReceiver Success: Active admin and profile owner set to {com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver} for user 10 $ adb shell dpm mark-profile-owner-on-organization-owned-device --user 10 com.afwsamples.testdpc/.DeviceAdminReceiver Success $ adb shell dumpsys activity service com.afwsamples.testdpc dump | grep isOrganizationOwnedDeviceWithManagedProfile isOrganizationOwnedDeviceWithManagedProfile: true $ adb shell am start-user 10 Success: user started $ adb shell dumpsys activity service --user 10 com.afwsamples.testdpc get-personal-apps-suspended-reasons SERVICE com.afwsamples.testdpc/.DeviceAdminService 53ea720 pid=18007 user=10 Client: NOT_SUSPENDED (0) $ adb shell dumpsys activity service --user 10 com.afwsamples.testdpc set-personal-apps-suspended true SERVICE com.afwsamples.testdpc/.DeviceAdminService 53ea720 pid=18007 user=10 Client: Set personal apps to SUSPENDED $ adb shell dumpsys activity service --user 10 com.afwsamples.testdpc get-personal-apps-suspended-reasons SERVICE com.afwsamples.testdpc/.DeviceAdminService 908e5a0 pid=19121 user=10 Client: SUSPENDED_EXPLICITLY (1) $ adb shell am start --user 0 com.android.gallery3d/.app.GalleryActivity Test: see above Bug: 171350084 Bug: 181154143 Change-Id: I63b7e9b6459038602aa72ae376dfdd2d71dd1c83 (cherry picked from commit 1a8537e2b145969d57c39033543a435a0869d281)
1 parent b420f1d commit 7155bcd

File tree

5 files changed

+88
-12
lines changed

5 files changed

+88
-12
lines changed

app/src/main/java/com/afwsamples/testdpc/DevicePolicyManagerGateway.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ public interface DevicePolicyManagerGateway {
5959
*/
6060
boolean isProfileOwnerApp();
6161

62+
// TODO(b/171350084): use in other places
63+
/**
64+
* See {@link android.app.admin.DevicePolicyManager#isOrganizationOwnedDeviceWithManagedProfile()}.
65+
*/
66+
boolean isOrganizationOwnedDeviceWithManagedProfile();
67+
6268
/**
6369
* See {@link android.app.admin.DevicePolicyManager#createAndManageUser(android.content.ComponentName, String, android.content.ComponentName, android.os.PersistableBundle, int)}.
6470
*/
@@ -255,6 +261,16 @@ void setApplicationHidden(String packageName, boolean suspended, @NonNull Consum
255261
*/
256262
boolean isApplicationHidden(String packageName) throws NameNotFoundException;
257263

264+
/**
265+
* See {@link android.app.admin.DevicePolicyManager#setPersonalAppsSuspended(ComponentName, boolean)}.
266+
*/
267+
void setPersonalAppsSuspended(boolean suspended, @NonNull Consumer<Void> onSuccess,
268+
@NonNull Consumer<Exception> onError);
269+
/**
270+
* See {@link android.app.admin.DevicePolicyManager#getPersonalAppsSuspendedReasons(ComponentName)}.
271+
*/
272+
int getPersonalAppsSuspendedReasons();
273+
258274
// TODO(b/171350084): use in other places
259275
/**
260276
* See {@link android.app.admin.DevicePolicyManager#setLockTaskPackages(ComponentName, String[])}.

app/src/main/java/com/afwsamples/testdpc/DevicePolicyManagerGatewayImpl.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public boolean isDeviceOwnerApp() {
8888
return mDevicePolicyManager.isDeviceOwnerApp(mAdminComponentName.getPackageName());
8989
}
9090

91+
@Override
92+
public boolean isOrganizationOwnedDeviceWithManagedProfile() {
93+
return mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
94+
}
95+
9196
@Override
9297
public void createAndManageUser(String name, int flags, Consumer<UserHandle> onSuccess,
9398
Consumer<Exception> onError) {
@@ -469,17 +474,23 @@ public boolean isPackageSuspended(String packageName) throws NameNotFoundExcepti
469474
}
470475

471476
@Override
472-
public void setLockTaskPackages(String[] packages, Consumer<Void> onSuccess,
477+
public void setPersonalAppsSuspended(boolean suspended, Consumer<Void> onSuccess,
473478
Consumer<Exception> onError) {
474-
Log.d(TAG, "setLockTaskPackages(" + Arrays.toString(packages) + ")");
479+
Log.d(TAG, "setPersonalAppsSuspended(" + suspended+ ")");
480+
475481
try {
476-
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, packages);
482+
mDevicePolicyManager.setPersonalAppsSuspended(mAdminComponentName, suspended);
477483
onSuccess.accept(null);
478484
} catch (Exception e) {
479485
onError.accept(e);
480486
}
481487
}
482488

489+
@Override
490+
public int getPersonalAppsSuspendedReasons() {
491+
return mDevicePolicyManager.getPersonalAppsSuspendedReasons(mAdminComponentName);
492+
}
493+
483494
@Override
484495
public void setApplicationHidden(String packageName, boolean hidden,
485496
Consumer<Void> onSuccess, Consumer<Exception> onError) {
@@ -498,6 +509,18 @@ public boolean isApplicationHidden(String packageName) throws NameNotFoundExcept
498509
return mDevicePolicyManager.isApplicationHidden(mAdminComponentName, packageName);
499510
}
500511

512+
@Override
513+
public void setLockTaskPackages(String[] packages, Consumer<Void> onSuccess,
514+
Consumer<Exception> onError) {
515+
Log.d(TAG, "setLockTaskPackages(" + Arrays.toString(packages) + ")");
516+
try {
517+
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, packages);
518+
onSuccess.accept(null);
519+
} catch (Exception e) {
520+
onError.accept(e);
521+
}
522+
}
523+
501524
@Override
502525
public String[] getLockTaskPackages() {
503526
return mDevicePolicyManager.getLockTaskPackages(mAdminComponentName);

app/src/main/java/com/afwsamples/testdpc/ShellCommand.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ final class ShellCommand {
7878
private static final String CMD_GET_PASSWORD_QUALITY = "get-password-quality";
7979
private static final String CMD_TRANSFER_OWNERSHIP = "transfer-ownership";
8080
private static final String CMD_SET_SUSPENDED_PACKAGES = "set-suspended-packages";
81-
private static final String CMD_LIST_PACKAGE_SUSPENDED = "list-suspended-packages";
81+
private static final String CMD_IS_SUSPENDED_PACKAGE = "is-suspended-packages";
82+
private static final String CMD_SET_PERSONAL_APPS_SUSPENDED = "set-personal-apps-suspended";
83+
private static final String CMD_GET_PERSONAL_APPS_SUSPENDED_REASONS
84+
= "get-personal-apps-suspended-reasons";
8285
private static final String CMD_SET_HIDDEN_PACKAGE = "set-hidden-package";
8386
private static final String CMD_IS_HIDDEN_PACKAGE = "is-hidden-package";
8487
private static final String CMD_SET_LOCK_TASK_PACKAGES = "set-lock-task-packages";
@@ -198,8 +201,14 @@ public void run() {
198201
case CMD_SET_SUSPENDED_PACKAGES:
199202
execute(() -> setSuspendedPackages());
200203
break;
201-
case CMD_LIST_PACKAGE_SUSPENDED:
202-
execute(() -> listSuspendedPackages());
204+
case CMD_IS_SUSPENDED_PACKAGE:
205+
execute(() -> isSuspendedPackage());
206+
break;
207+
case CMD_SET_PERSONAL_APPS_SUSPENDED:
208+
execute(() -> setPersonalAppsSuspended());
209+
break;
210+
case CMD_GET_PERSONAL_APPS_SUSPENDED_REASONS:
211+
execute(() -> getPersonalAppsSuspendedReasons());
203212
break;
204213
case CMD_SET_HIDDEN_PACKAGE:
205214
execute(() -> setHiddenPackage());
@@ -231,6 +240,8 @@ public void run() {
231240
private void dumpState() {
232241
mWriter.printf("isDeviceOwner: %b\n", mDevicePolicyManagerGateway.isDeviceOwnerApp());
233242
mWriter.printf("isProfileOwner: %b\n", mDevicePolicyManagerGateway.isProfileOwnerApp());
243+
mWriter.printf("isOrganizationOwnedDeviceWithManagedProfile: %b\n",
244+
mDevicePolicyManagerGateway.isOrganizationOwnedDeviceWithManagedProfile());
234245
}
235246

236247
private void showUsage() {
@@ -289,7 +300,11 @@ private void showUsage() {
289300
mWriter.printf("\t%s <SUSPENDED> <PKG1> [PKG2] [PGKN] - suspend / unsuspend the given "
290301
+ "packages\n", CMD_SET_SUSPENDED_PACKAGES);
291302
mWriter.printf("\t%s <PKG1> [PKG2] [PKGN] - checks if the given packages are suspended\n",
292-
CMD_LIST_PACKAGE_SUSPENDED);
303+
CMD_IS_SUSPENDED_PACKAGE);
304+
mWriter.printf("\t%s <SUSPENDED> - suspend / unsuspend personal apps\n",
305+
CMD_SET_PERSONAL_APPS_SUSPENDED);
306+
mWriter.printf("\t%s - gets the reasons for suspending personal apps\n",
307+
CMD_GET_PERSONAL_APPS_SUSPENDED_REASONS);
293308
mWriter.printf("\t%s <PKG> <HIDDEN> - hide / unhide the given package\n",
294309
CMD_SET_HIDDEN_PACKAGE);
295310
mWriter.printf("\t%s <PKG> - checks if the given package is hidden\n",
@@ -587,7 +602,7 @@ private void setSuspendedPackages() {
587602
(e) -> onError(e, "Error settings %s to %s", printableNames, printableStatus));
588603
}
589604

590-
private void listSuspendedPackages() {
605+
private void isSuspendedPackage() {
591606
getListFromAllArgs().forEach((packageName) -> {
592607
try {
593608
boolean suspended = mDevicePolicyManagerGateway.isPackageSuspended(packageName);
@@ -625,6 +640,24 @@ private void isHiddenPackage() {
625640
}
626641
}
627642

643+
private void setPersonalAppsSuspended() {
644+
boolean suspended = Boolean.parseBoolean(mArgs[1]);
645+
String printableStatus = suspendedToString(suspended);
646+
647+
Log.i(TAG, "setPersonalAppsSuspended(): " + printableStatus);
648+
649+
mDevicePolicyManagerGateway.setPersonalAppsSuspended(suspended,
650+
(v) -> onSuccess("Set personal apps to %s", printableStatus),
651+
(e) -> onError(e, "Error setting personal apps to %s", printableStatus));
652+
}
653+
654+
private void getPersonalAppsSuspendedReasons() {
655+
int reasons = mDevicePolicyManagerGateway.getPersonalAppsSuspendedReasons();
656+
String printableReasons = Util.personalAppsSuspensionReasonToString(reasons);
657+
658+
mWriter.printf("%s (%d)\n", printableReasons, reasons);
659+
}
660+
628661
private void setLockTaskPackages() {
629662
String[] packages = getArrayFromArgs(/* index= */ 1);
630663

app/src/main/java/com/afwsamples/testdpc/common/Util.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ public static String lockTaskFeaturesToString(int flags) {
254254
return flagsToString(DevicePolicyManager.class, "LOCK_TASK_FEATURE_", flags);
255255
}
256256

257+
public static String personalAppsSuspensionReasonToString(int reasons) {
258+
return flagsToString(DevicePolicyManager.class, "PERSONAL_APPS_", reasons);
259+
}
260+
257261
public static void onSuccessLog(String tag, String template, Object... args) {
258262
Log.d(tag, String.format(template, args) + " succeeded");
259263
}

app/src/main/java/com/afwsamples/testdpc/policy/PolicyManagementFragment.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2320,8 +2320,8 @@ private void loadAppFeedbackNotifications() {
23202320

23212321
private void loadAppStatus() {
23222322
final @StringRes int appStatusStringId;
2323-
boolean isOrgOwned = Util.SDK_INT >= VERSION_CODES.R &&
2324-
mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
2323+
boolean isOrgOwned = Util.SDK_INT >= VERSION_CODES.R
2324+
&& mDevicePolicyManagerGateway.isOrganizationOwnedDeviceWithManagedProfile();
23252325
if (mDevicePolicyManager.isProfileOwnerApp(mPackageName)) {
23262326
if (isOrgOwned) {
23272327
appStatusStringId = R.string.this_is_an_org_owned_profile_owner;
@@ -2560,7 +2560,7 @@ private void reloadSetAutoTimeUi() {
25602560
return;
25612561
}
25622562
boolean isOrgOwned =
2563-
mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
2563+
mDevicePolicyManagerGateway.isOrganizationOwnedDeviceWithManagedProfile();
25642564

25652565
if (mDevicePolicyManager.isDeviceOwnerApp(mPackageName)
25662566
|| (mDevicePolicyManager.isProfileOwnerApp(mPackageName)
@@ -2576,7 +2576,7 @@ private void reloadSetAutoTimeZoneUi() {
25762576
return;
25772577
}
25782578
boolean isOrgOwned =
2579-
mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
2579+
mDevicePolicyManagerGateway.isOrganizationOwnedDeviceWithManagedProfile();
25802580

25812581
if (mDevicePolicyManager.isDeviceOwnerApp(mPackageName)
25822582
|| (mDevicePolicyManager.isProfileOwnerApp(mPackageName)

0 commit comments

Comments
 (0)