summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java21
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java59
2 files changed, 44 insertions, 36 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 9247486dff40..9c6410a37e62 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -9335,12 +9335,18 @@ public class DevicePolicyManager {
}
/**
- * Allows the device owner to enable or disable the backup service.
+ * Allows the device owner or profile owner to enable or disable the backup service.
*
- * <p> Backup service manages all backup and restore mechanisms on the device. Setting this to
- * false will prevent data from being backed up or restored.
+ * <p> Each user has its own backup service which manages the backup and restore mechanisms in
+ * that user. Disabling the backup service will prevent data from being backed up or restored.
*
- * <p> Backup service is off by default when device owner is present.
+ * <p> Device owner calls this API to control backup services across all users on the device.
+ * Profile owner can use this API to enable or disable the profile's backup service. However,
+ * for a managed profile its backup functionality is only enabled if both the device owner
+ * and the profile owner have enabled the backup service.
+ *
+ * <p> By default, backup service is disabled on a device with device owner, and within a
+ * managed profile.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param enabled {@code true} to enable the backup service, {@code false} to disable it.
@@ -9356,7 +9362,12 @@ public class DevicePolicyManager {
}
/**
- * Return whether the backup service is enabled by the device owner.
+ * Return whether the backup service is enabled by the device owner or profile owner for the
+ * current user, as previously set by {@link #setBackupServiceEnabled(ComponentName, boolean)}.
+ *
+ * <p> Whether the backup functionality is actually enabled or not depends on settings from both
+ * the current user and the device owner, please see
+ * {@link #setBackupServiceEnabled(ComponentName, boolean)} for details.
*
* <p> Backup service manages all backup and restore mechanisms on the device.
*
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 76ae5ccd4eeb..07e2a8bfe781 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -7652,18 +7652,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
// Shutting down backup manager service permanently.
- long ident = mInjector.binderClearCallingIdentity();
- try {
- if (mInjector.getIBackupManager() != null) {
- mInjector.getIBackupManager()
- .setBackupServiceActive(UserHandle.USER_SYSTEM, false);
- }
- } catch (RemoteException e) {
- throw new IllegalStateException("Failed deactivating backup service.", e);
- } finally {
- mInjector.binderRestoreCallingIdentity(ident);
- }
-
+ toggleBackupServiceActive(UserHandle.USER_SYSTEM, /* makeActive= */ false);
if (isAdb()) {
// Log device owner provisioning was started using adb.
MetricsLogger.action(mContext, PROVISIONING_ENTRY_POINT_ADB, LOG_TAG_DEVICE_OWNER);
@@ -7691,7 +7680,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
saveUserRestrictionsLocked(userId);
}
- ident = mInjector.binderClearCallingIdentity();
+ long ident = mInjector.binderClearCallingIdentity();
try {
// TODO Send to system too?
sendOwnerChangedBroadcast(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED, userId);
@@ -7948,6 +7937,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
.write();
}
+ // Shutting down backup manager service permanently.
+ toggleBackupServiceActive(userHandle, /* makeActive= */ false);
+
mOwners.setProfileOwner(who, ownerName, userHandle);
mOwners.writeProfileOwner(userHandle);
Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle);
@@ -7971,6 +7963,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
+
+ private void toggleBackupServiceActive(int userId, boolean makeActive) {
+ long ident = mInjector.binderClearCallingIdentity();
+ try {
+ if (mInjector.getIBackupManager() != null) {
+ mInjector.getIBackupManager()
+ .setBackupServiceActive(userId, makeActive);
+ }
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Failed deactivating backup service.", e);
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
+ }
+
+ }
+
@Override
public void clearProfileOwner(ComponentName who) {
if (!mHasFeature) {
@@ -12704,22 +12712,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return;
}
Preconditions.checkNotNull(admin);
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
-
- final long ident = mInjector.binderClearCallingIdentity();
- try {
- IBackupManager ibm = mInjector.getIBackupManager();
- if (ibm != null) {
- ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, enabled);
- }
- } catch (RemoteException e) {
- throw new IllegalStateException(
- "Failed " + (enabled ? "" : "de") + "activating backup service.", e);
- } finally {
- mInjector.binderRestoreCallingIdentity(ident);
- }
+ enforceProfileOrDeviceOwner(admin);
+ int userId = mInjector.userHandleGetCallingUserId();
+ toggleBackupServiceActive(userId, enabled);
}
@Override
@@ -12728,11 +12723,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (!mHasFeature) {
return true;
}
+
+ enforceProfileOrDeviceOwner(admin);
synchronized (getLockObject()) {
try {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
IBackupManager ibm = mInjector.getIBackupManager();
- return ibm != null && ibm.isBackupServiceActive(UserHandle.USER_SYSTEM);
+ return ibm != null && ibm.isBackupServiceActive(
+ mInjector.userHandleGetCallingUserId());
} catch (RemoteException e) {
throw new IllegalStateException("Failed requesting backup service state.", e);
}