diff options
| author | 2018-03-21 20:13:51 +0000 | |
|---|---|---|
| committer | 2018-03-21 20:13:51 +0000 | |
| commit | bc9f74c83ea1870a024c69720d1e0776f39b74fe (patch) | |
| tree | c4f5e230f66a4c5b917d64bb4098e8823bdcf143 | |
| parent | 9510846409cd9e379dbd799ba1bfa57078978b21 (diff) | |
| parent | 2f81559d293e09e6db706334b6b15a289ff1689a (diff) | |
Merge "Return a boolean from the mandatory backup transport setter." into pi-dev
am: 2f81559d29
Change-Id: Ibb77d5f16312f03504e7ced961b92e48f37342bc
5 files changed, 77 insertions, 16 deletions
diff --git a/api/current.txt b/api/current.txt index 3fdb47a3c960..f554c700167a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6559,7 +6559,7 @@ package android.app.admin { 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 02e77df7a1ba..4cb7f89cec5c 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -8877,15 +8877,20 @@ public class DevicePolicyManager { * <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 c29369fe96a8..c46402faa07b 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -364,7 +364,7 @@ interface IDevicePolicyManager { 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 6a9b862743f9..884f348050ec 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; 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; 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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { 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 d2fb1cab3479..43490d312dbc 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.DeviceAdminReceiver; 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 @@ public class DevicePolicyManagerTest extends DpmTestBase { 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); |