@Override public int getAvailableRestoreSets(IRestoreObserver observer, IBackupManagerMonitor monitor) throws RemoteException { post( () -> { Set<Long> restoreTokens = serviceState.restoreData.keySet(); Set<RestoreSet> restoreSets = new HashSet<>(); for (long token : restoreTokens) { restoreSets.add(new RestoreSet("RestoreSet-" + token, "device", token)); } observer.restoreSetsAvailable(restoreSets.toArray(new RestoreSet[restoreSets.size()])); }); return BackupManager.SUCCESS; }
@Override public int restorePackage( String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) throws RemoteException { if (serviceState.lastRestoreToken == 0L) { return -1; } List<String> restorePackages = serviceState.restoreData.get(serviceState.lastRestoreToken); if (!restorePackages.contains(packageName)) { return BackupManager.ERROR_PACKAGE_NOT_FOUND; } post(() -> observer.restoreStarting(1)); post(() -> observer.onUpdate(0, packageName)); serviceState.restoredPackages.put(packageName, serviceState.lastRestoreToken); post(() -> observer.restoreFinished(BackupManager.SUCCESS)); return BackupManager.SUCCESS; }
public static String getUserID(Context context) { private static String uniqueID = null; private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID"; if (uniqueID == null) { SharedPreferences sharedPrefs = context.getSharedPreferences( MyBackupAgent.PREFS, Context.MODE_PRIVATE); uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null); if (uniqueID == null) { uniqueID = UUID.randomUUID().toString(); Editor editor = sharedPrefs.edit(); editor.putString(PREF_UNIQUE_ID, uniqueID); editor.commit(); //backup the changes BackupManager mBackupManager = new BackupManager(context); mBackupManager.dataChanged(); } } return uniqueID; }
private void dataChanged() { if (sBackupManager == null) { sBackupManager = new BackupManager(mContext); } sBackupManager.dataChanged(); }
@Test @Config(minSdk = LOLLIPOP) public void setBackupEnabled_multipleInstances_shouldBeEnabled() { // BackupManager is used by creating new instances, but all of them talk to the same // BackupManagerService in Android, so methods that route through the service will share states. backupManager.setBackupEnabled(true); assertThat(new BackupManager(ApplicationProvider.getApplicationContext()).isBackupEnabled()) .isTrue(); }
@Before public void setUp() { MockitoAnnotations.initMocks(this); ShadowLooper.pauseMainLooper(); shadowOf((Application) ApplicationProvider.getApplicationContext()) .grantPermissions(android.Manifest.permission.BACKUP); backupManager = new BackupManager(ApplicationProvider.getApplicationContext()); shadowOf(backupManager).addAvailableRestoreSets(123L, Arrays.asList("foo.bar", "bar.baz")); shadowOf(backupManager).addAvailableRestoreSets(456L, Arrays.asList("hello.world")); }
@Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { // TODO Auto-generated method stub super.onBackup(oldState, data, newState); if(DEBUG) Log.i(TAG,"onBackup()"); }
@Test public void restorePackage_shouldRestoreSpecifiedPackage() { RestoreSession restoreSession = backupManager.beginRestoreSession(); restoreSession.restoreSome(123L, restoreObserver, new String[0]); assertThat(shadowOf(backupManager).getPackageRestoreToken("bar.baz")).isEqualTo(0L); restoreSession.endRestoreSession(); Robolectric.flushForegroundThreadScheduler(); Mockito.reset(restoreObserver); restoreSession = backupManager.beginRestoreSession(); int result = restoreSession.restorePackage("bar.baz", restoreObserver); assertThat(result).isEqualTo(BackupManager.SUCCESS); Robolectric.flushForegroundThreadScheduler(); verify(restoreObserver).restoreStarting(eq(1)); verify(restoreObserver).restoreFinished(eq(BackupManager.SUCCESS)); assertThat(shadowOf(backupManager).getPackageRestoreToken("bar.baz")).isEqualTo(123L); }
@Test @Config(minSdk = LOLLIPOP) public void setBackupEnabled_setToTrue_shouldEnableBackup() { backupManager.setBackupEnabled(true); assertThat(backupManager.isBackupEnabled()).isTrue(); }
@Test public void restorePackage_noRestoreToken_shouldReturnFailure() { RestoreSession restoreSession = backupManager.beginRestoreSession(); int result = restoreSession.restorePackage("bar.baz", restoreObserver); assertThat(result).isEqualTo(-1); }
@Test public void restoreSome_shouldRestoreSpecifiedPackages() { RestoreSession restoreSession = backupManager.beginRestoreSession(); int result = restoreSession.restoreSome(123L, restoreObserver, new String[] {"bar.baz"}); assertThat(result).isEqualTo(BackupManager.SUCCESS); Robolectric.flushForegroundThreadScheduler(); verify(restoreObserver).restoreStarting(eq(1)); verify(restoreObserver).restoreFinished(eq(BackupManager.SUCCESS)); assertThat(shadowOf(backupManager).getPackageRestoreToken("foo.bar")).isEqualTo(0L); assertThat(shadowOf(backupManager).getPackageRestoreToken("bar.baz")).isEqualTo(123L); }
@Test public void getAvailableRestoreSets_shouldCallbackToRestoreSetsAvailable() { RestoreSession restoreSession = backupManager.beginRestoreSession(); int result = restoreSession.getAvailableRestoreSets(restoreObserver); assertThat(result).isEqualTo(BackupManager.SUCCESS); Robolectric.flushForegroundThreadScheduler(); ArgumentCaptor<RestoreSet[]> restoreSetArg = ArgumentCaptor.forClass(RestoreSet[].class); verify(restoreObserver).restoreSetsAvailable(restoreSetArg.capture()); RestoreSet[] restoreSets = restoreSetArg.getValue(); assertThat(restoreSets).hasLength(2); assertThat(restoreSets) .asList() .comparingElementsUsing(fieldCorrespondence("token")) .containsExactly(123L, 456L); }
@Test public void restoreAll_shouldRestoreData() { RestoreSession restoreSession = backupManager.beginRestoreSession(); int result = restoreSession.restoreAll(123L, restoreObserver); assertThat(result).isEqualTo(BackupManager.SUCCESS); Robolectric.flushForegroundThreadScheduler(); verify(restoreObserver).restoreStarting(eq(2)); verify(restoreObserver).restoreFinished(eq(BackupManager.SUCCESS)); assertThat(shadowOf(backupManager).getPackageRestoreToken("foo.bar")).isEqualTo(123L); assertThat(shadowOf(backupManager).getPackageRestoreToken("bar.baz")).isEqualTo(123L); assertThat(shadowOf(backupManager).getPackageRestoreToken("hello.world")).isEqualTo(0L); }
@Test @Config(minSdk = LOLLIPOP) public void isBackupEnabled_noPermission_shouldThrowSecurityException() { shadowOf((Application) ApplicationProvider.getApplicationContext()) .denyPermissions(android.Manifest.permission.BACKUP); try { backupManager.isBackupEnabled(); fail("SecurityException should be thrown"); } catch (SecurityException e) { // pass } }
@Override public void onCreate() { super.onCreate(); // Set the log dir as LauncherAppState is not initialized during restore. }
/** * Helper to notify backup agent about database changes */ private void databaseChanged() { BackupManager bm = new BackupManager(this); bm.dataChanged(); } }
public void dataChanged() { if (enabled && backupManager != null) { backupManager.dataChanged(); } }
@Override public int restoreSome( long token, IRestoreObserver observer, IBackupManagerMonitor monitor, String[] packages) throws RemoteException { List<String> restorePackages = new ArrayList<>(serviceState.restoreData.get(token)); if (packages != null) { restorePackages.retainAll(Arrays.asList(packages)); } post(() -> observer.restoreStarting(restorePackages.size())); for (int i = 0; i < restorePackages.size(); i++) { final int index = i; // final copy of i post(() -> observer.onUpdate(index, restorePackages.get(index))); serviceState.restoredPackages.put(restorePackages.get(index), token); } post(() -> observer.restoreFinished(BackupManager.SUCCESS)); serviceState.lastRestoreToken = token; return BackupManager.SUCCESS; }
@Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { synchronized (UPMApplication.sDataLock) { super.onBackup(oldState, data, newState); } }
@Test @Config(minSdk = LOLLIPOP) public void setBackupEnabled_setToFalse_shouldDisableBackup() { backupManager.setBackupEnabled(false); assertThat(backupManager.isBackupEnabled()).isFalse(); }