Return a boolean from the mandatory backup transport setter.
Bug: 73813043
Bug: 64012357
Test: cts-tradefed run cts -m CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.DeviceOwnerTest#testGetAndSetMandatoryBackupTransport
Test: cts-tradefed run cts -m CtsBackupHostTestCase --test android.cts.backup.BackupDeviceOwnerHostSideTest
Change-Id: I7f47a41070b767a6be8b986be485b4ad782690cf
diff --git a/api/current.txt b/api/current.txt
index a0b887a..eb73c6f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6559,7 +6559,7 @@
method public void setLockTaskPackages(android.content.ComponentName, java.lang.String[]) throws java.lang.SecurityException;
method public void setLogoutEnabled(android.content.ComponentName, boolean);
method public void setLongSupportMessage(android.content.ComponentName, java.lang.CharSequence);
- method public void setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName);
+ method public boolean setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName);
method public void setMasterVolumeMuted(android.content.ComponentName, boolean);
method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int);
method public void setMaximumTimeToLock(android.content.ComponentName, long);
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 02e77df..4cb7f89 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -8877,15 +8877,20 @@
* <p>If backups were disabled and a non-null backup transport {@link ComponentName} is
* specified, backups will be enabled.
*
+ * <p>NOTE: The method shouldn't be called on the main thread.
+ *
* @param admin admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param backupTransportComponent The backup transport layer to be used for mandatory backups.
+ * @return {@code true} if the backup transport was successfully set; {@code false} otherwise.
* @throws SecurityException if {@code admin} is not a device owner.
*/
- public void setMandatoryBackupTransport(
- @NonNull ComponentName admin, @Nullable ComponentName backupTransportComponent) {
+ @WorkerThread
+ public boolean setMandatoryBackupTransport(
+ @NonNull ComponentName admin,
+ @Nullable ComponentName backupTransportComponent) {
throwIfParentInstance("setMandatoryBackupTransport");
try {
- mService.setMandatoryBackupTransport(admin, backupTransportComponent);
+ return mService.setMandatoryBackupTransport(admin, backupTransportComponent);
} 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 c29369f..c46402f 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -364,7 +364,7 @@
void setBackupServiceEnabled(in ComponentName admin, boolean enabled);
boolean isBackupServiceEnabled(in ComponentName admin);
- void setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent);
+ boolean setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent);
ComponentName getMandatoryBackupTransport();
void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6a9b862..884f348 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -107,7 +107,9 @@
import android.app.admin.SecurityLog.SecurityEvent;
import android.app.admin.SystemUpdateInfo;
import android.app.admin.SystemUpdatePolicy;
+import android.app.backup.BackupManager;
import android.app.backup.IBackupManager;
+import android.app.backup.ISelectBackupTransportCallback;
import android.app.trust.TrustManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
@@ -252,6 +254,7 @@
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
@@ -11997,20 +12000,32 @@
}
@Override
- public void setMandatoryBackupTransport(
- ComponentName admin, ComponentName backupTransportComponent) {
+ public boolean setMandatoryBackupTransport(
+ ComponentName admin,
+ ComponentName backupTransportComponent) {
if (!mHasFeature) {
- return;
+ return false;
}
Preconditions.checkNotNull(admin);
synchronized (this) {
- ActiveAdmin activeAdmin =
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- if (!Objects.equals(backupTransportComponent, activeAdmin.mandatoryBackupTransport)) {
- activeAdmin.mandatoryBackupTransport = backupTransportComponent;
- saveSettingsLocked(UserHandle.USER_SYSTEM);
- }
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
}
+
+ final int callingUid = mInjector.binderGetCallingUid();
+ final AtomicBoolean success = new AtomicBoolean(false);
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ final ISelectBackupTransportCallback selectBackupTransportCallbackInternal =
+ new ISelectBackupTransportCallback.Stub() {
+ public void onSuccess(String transportName) {
+ saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent);
+ success.set(true);
+ countDownLatch.countDown();
+ }
+
+ public void onFailure(int reason) {
+ countDownLatch.countDown();
+ }
+ };
final long identity = mInjector.binderClearCallingIdentity();
try {
IBackupManager ibm = mInjector.getIBackupManager();
@@ -12018,14 +12033,39 @@
if (!ibm.isBackupServiceActive(UserHandle.USER_SYSTEM)) {
ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
}
- ibm.selectBackupTransportAsync(backupTransportComponent, null);
- ibm.setBackupEnabled(true);
+ ibm.selectBackupTransportAsync(
+ backupTransportComponent, selectBackupTransportCallbackInternal);
+ countDownLatch.await();
+ if (success.get()) {
+ ibm.setBackupEnabled(true);
+ }
+ } else if (backupTransportComponent == null) {
+ saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent);
+ success.set(true);
}
} catch (RemoteException e) {
throw new IllegalStateException("Failed to set mandatory backup transport.", e);
+ } catch (InterruptedException e) {
+ throw new IllegalStateException("Failed to set mandatory backup transport.", e);
} finally {
mInjector.binderRestoreCallingIdentity(identity);
}
+ return success.get();
+ }
+
+ synchronized private void saveMandatoryBackupTransport(
+ ComponentName admin, int callingUid, ComponentName backupTransportComponent) {
+ ActiveAdmin activeAdmin =
+ getActiveAdminWithPolicyForUidLocked(
+ admin,
+ DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
+ callingUid);
+ if (!Objects.equals(backupTransportComponent,
+ activeAdmin.mandatoryBackupTransport)) {
+ activeAdmin.mandatoryBackupTransport =
+ backupTransportComponent;
+ saveSettingsLocked(UserHandle.USER_SYSTEM);
+ }
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index d2fb1ca..43490d3 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -57,6 +57,7 @@
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.PasswordMetrics;
+import android.app.backup.ISelectBackupTransportCallback;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Intent;
@@ -2264,6 +2265,21 @@
assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE,
intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
+ // Make the backup transport selection succeed
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ ISelectBackupTransportCallback callback =
+ (ISelectBackupTransportCallback) invocation.getArguments()[1];
+ if (callback != null) {
+ callback.onSuccess("");
+ }
+ return null;
+ }
+ }).when(getServices().ibackupManager).selectBackupTransportAsync(
+ any(ComponentName.class), any(ISelectBackupTransportCallback.class));
+
+
// Backups are not mandatory
intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_MANDATORY_BACKUPS);
assertNull(intent);