summaryrefslogtreecommitdiff
path: root/cmds
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2017-06-16 13:14:48 -0700
committerChristopher Tate <ctate@google.com>2017-06-20 13:28:56 -0700
commit924afe2b0f721afa857a55c33da559f6efc41d32 (patch)
treefa7031d15af51b8a466b67e7c8d615d3f549803f /cmds
parent101ba665ddcd40de9f2fe51be910f03b90574a55 (diff)
Add 'bmgr' command to synchronously init transports
bmgr init TRANSPORT [...] will run an init operation on each named transport, blocking until the operations have all completed. Bug 62253989 Test: manual Change-Id: I7dbd94293738d5ecf195764f5b28905253819791
Diffstat (limited to 'cmds')
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java111
1 files changed, 93 insertions, 18 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 1b77427c5b72..b61cdecbfb7b 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -17,8 +17,8 @@
package com.android.commands.bmgr;
import android.app.backup.BackupManager;
-import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupProgress;
+import android.app.backup.BackupTransport;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
import android.app.backup.IRestoreObserver;
@@ -30,8 +30,11 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.UserHandle;
-import android.util.Log;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.HashSet;
@@ -97,6 +100,11 @@ public final class Bmgr {
return;
}
+ if ("init".equals(op)) {
+ doInit();
+ return;
+ }
+
if ("list".equals(op)) {
doList();
return;
@@ -204,7 +212,7 @@ public final class Bmgr {
System.out.println("Performing full transport backup");
String pkg;
- ArrayList<String> allPkgs = new ArrayList<String>();
+ ArraySet<String> allPkgs = new ArraySet<String>();
while ((pkg = nextArg()) != null) {
allPkgs.add(pkg);
}
@@ -218,45 +226,77 @@ public final class Bmgr {
}
}
- class BackupObserver extends IBackupObserver.Stub {
- boolean done = false;
+ // IBackupObserver generically usable for any backup/init operation
+ abstract class Observer extends IBackupObserver.Stub {
+ private final Object trigger = new Object();
+
+ @GuardedBy("trigger")
+ private volatile boolean done = false;
@Override
public void onUpdate(String currentPackage, BackupProgress backupProgress) {
- System.out.println(
- "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred
- + "/" + backupProgress.bytesExpected);
}
@Override
public void onResult(String currentPackage, int status) {
- System.out.println("Package " + currentPackage + " with result: "
- + convertBackupStatusToString(status));
}
@Override
public void backupFinished(int status) {
- System.out.println("Backup finished with result: "
- + convertBackupStatusToString(status));
- synchronized (this) {
+ synchronized (trigger) {
done = true;
- this.notify();
+ trigger.notify();
}
}
+ public boolean done() {
+ return this.done;
+ }
+
+ // Wait forever
public void waitForCompletion() {
+ waitForCompletion(0);
+ }
+
+ // Wait for a given time and then give up
+ public void waitForCompletion(long timeout) {
// The backupFinished() callback will throw the 'done' flag; we
// just sit and wait on that notification.
- synchronized (this) {
- while (!this.done) {
+ final long targetTime = SystemClock.elapsedRealtime() + timeout;
+ synchronized (trigger) {
+ // Wait until either we're done, or we've reached a stated positive timeout
+ while (!done && (timeout <= 0 || SystemClock.elapsedRealtime() < targetTime)) {
try {
- this.wait();
+ trigger.wait(1000L);
} catch (InterruptedException ex) {
}
}
}
}
+ }
+
+ class BackupObserver extends Observer {
+ @Override
+ public void onUpdate(String currentPackage, BackupProgress backupProgress) {
+ super.onUpdate(currentPackage, backupProgress);
+ System.out.println(
+ "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred
+ + "/" + backupProgress.bytesExpected);
+ }
+ @Override
+ public void onResult(String currentPackage, int status) {
+ super.onResult(currentPackage, status);
+ System.out.println("Package " + currentPackage + " with result: "
+ + convertBackupStatusToString(status));
+ }
+
+ @Override
+ public void backupFinished(int status) {
+ super.backupFinished(status);
+ System.out.println("Backup finished with result: "
+ + convertBackupStatusToString(status));
+ }
}
private static String convertBackupStatusToString(int errorCode) {
@@ -349,7 +389,9 @@ public final class Bmgr {
} else if (pkg.equals("--incremental")) {
nonIncrementalBackup = false;
} else {
- allPkgs.add(pkg);
+ if (!allPkgs.contains(pkg)) {
+ allPkgs.add(pkg);
+ }
}
}
if (backupAll) {
@@ -470,6 +512,39 @@ public final class Bmgr {
}
}
+ class InitObserver extends Observer {
+ public int result = BackupTransport.TRANSPORT_ERROR;
+
+ @Override
+ public void backupFinished(int status) {
+ super.backupFinished(status);
+ result = status;
+ }
+ }
+
+ private void doInit() {
+ ArraySet<String> transports = new ArraySet<>();
+ String transport;
+ while ((transport = nextArg()) != null) {
+ transports.add(transport);
+ }
+ if (transports.size() == 0) {
+ showUsage();
+ return;
+ }
+
+ InitObserver observer = new InitObserver();
+ try {
+ System.out.println("Initializing transports: " + transports);
+ mBmgr.initializeTransports(transports.toArray(new String[transports.size()]), observer);
+ observer.waitForCompletion(30*1000L);
+ System.out.println("Initialization result: " + observer.result);
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ }
+ }
+
private void doList() {
String arg = nextArg(); // sets, transports, packages set#
if ("transports".equals(arg)) {