diff options
| author | 2016-09-06 17:31:46 +0200 | |
|---|---|---|
| committer | 2016-09-14 12:01:56 +0200 | |
| commit | 5a122a1ce90c8c09fd579147061cb7b4cd8b23e9 (patch) | |
| tree | b3a0a0d0274f26fb8949353dbb98c52054bd9428 | |
| parent | 4efd735a7605a88bcf0228de94d99a563b0f64d8 (diff) | |
Add DevicePolicyManager.setBackupServiceEnabled as hidden API.
BUG=28628532
Change-Id: I48c3423734e54b6a4d70e58d50c98c3e17790e0d
(based on a8202524608a4fc9178e6b18e13602c5a8abb404)
3 files changed, 83 insertions, 5 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 688876cb3891..d6a8dd0dec24 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -6493,4 +6493,35 @@ public class DevicePolicyManager { throw new SecurityException(functionName + " cannot be called on the parent instance"); } } + + /** + * @hide + * Enable backup service. + * <p>This includes all backup and restore mechanisms. + * Setting this to {@code false} will make backup service no-op or return empty results. + * + * <p>There must be only one user on the device, managed by the device owner. + * Otherwise a {@link SecurityException} will be thrown. + * + * <p>Backup service is off by default when device owner is present. + */ + public void setBackupServiceEnabled(@NonNull ComponentName admin, boolean enabled) { + try { + mService.setBackupServiceEnabled(admin, enabled); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** + * @hide + * @return {@code true} if backup service is enabled, {@code false} otherwise. + */ + public boolean isBackupServiceEnabled(@NonNull ComponentName admin) { + try { + return mService.isBackupServiceEnabled(admin); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 1036f0499a54..43c623033081 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -305,4 +305,7 @@ interface IDevicePolicyManager { boolean isDeviceProvisioned(); boolean isDeviceProvisioningConfigApplied(); void setDeviceProvisioningConfigApplied(); + + void setBackupServiceEnabled(in ComponentName admin, boolean enabled); + boolean isBackupServiceEnabled(in ComponentName admin); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 777c0b35e4be..5f431bc5dc78 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -497,9 +497,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { new MonitoringCertNotificationTask().execute(userId); } if (Intent.ACTION_USER_ADDED.equals(action)) { - disableSecurityLoggingIfNotCompliant(); + disableDeviceOwnerManagedSingleUserFeaturesIfNeeded(); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { - disableSecurityLoggingIfNotCompliant(); + disableDeviceOwnerManagedSingleUserFeaturesIfNeeded(); removeUserData(userHandle); } else if (Intent.ACTION_USER_STARTED.equals(action)) { synchronized (DevicePolicyManagerService.this) { @@ -1712,7 +1712,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (mOwners.hasDeviceOwner()) { mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "true"); Slog.i(LOG_TAG, "Set ro.device_owner property to true"); - disableSecurityLoggingIfNotCompliant(); + disableDeviceOwnerManagedSingleUserFeaturesIfNeeded(); if (mInjector.securityLogGetLoggingEnabledProperty()) { mSecurityLogMonitor.start(); } @@ -5930,7 +5930,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mOwners.clearDeviceOwner(); mOwners.writeDeviceOwner(); updateDeviceOwnerLocked(); - disableSecurityLoggingIfNotCompliant(); + disableDeviceOwnerManagedSingleUserFeaturesIfNeeded(); try { // Reactivate backup service. mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true); @@ -8904,10 +8904,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } - private synchronized void disableSecurityLoggingIfNotCompliant() { + private synchronized void disableDeviceOwnerManagedSingleUserFeaturesIfNeeded() { if (!isDeviceOwnerManagedSingleUserDevice()) { mInjector.securityLogSetLoggingEnabledProperty(false); Slog.w(LOG_TAG, "Security logging turned off as it's no longer a single user device."); + setBackupServiceEnabledInternal(false); + Slog.w(LOG_TAG, "Backup is off as it's a managed device that has more that one user."); } } @@ -9208,4 +9210,46 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } } + + @Override + public void setBackupServiceEnabled(ComponentName admin, boolean enabled) { + Preconditions.checkNotNull(admin); + if (!mHasFeature) { + return; + } + ensureDeviceOwnerManagingSingleUser(admin); + setBackupServiceEnabledInternal(enabled); + } + + private synchronized void setBackupServiceEnabledInternal(boolean enabled) { + 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); + } + } + + @Override + public boolean isBackupServiceEnabled(ComponentName admin) { + Preconditions.checkNotNull(admin); + if (!mHasFeature) { + return true; + } + synchronized (this) { + getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); + try { + IBackupManager ibm = mInjector.getIBackupManager(); + return ibm != null && ibm.isBackupServiceActive(UserHandle.USER_SYSTEM); + } catch (RemoteException e) { + throw new IllegalStateException("Failed requesting backup service state.", e); + } + } + } } |