From 2d449afe3d075020bdd1115bcc15c9383cbce122 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Mon, 29 Mar 2010 19:14:24 -0700 Subject: Make RestoreSession.getAvailableRestoreSets() asynchronous This transaction can involve the transport having to query a remote backend over the wire, so it can take a Long Time(tm). Make it main-thread-safe by making it asynchronous, with the results passed as a callback to the invoker's RestoreObserver. We also make the IRestoreObserver callback interface properly oneway. Bug #2550665 Bug #2549422 Change-Id: If18a233a0a3d54c7b55101715c9e6195b762c5a0 --- cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'cmds/bmgr') diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index fa8a7c8c478..5612158021d 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -254,11 +254,13 @@ public final class Bmgr { private void doListRestoreSets() { try { - RestoreSet[] sets = mRestore.getAvailableRestoreSets(); - if (sets == null || sets.length == 0) { - System.out.println("No restore sets available"); + RestoreObserver observer = new RestoreObserver(); + int err = mRestore.getAvailableRestoreSets(observer); + if (err != 0) { + System.out.println("Unable to request restore sets"); } else { - printRestoreSets(sets); + observer.waitForCompletion(); + printRestoreSets(observer.sets); } } catch (RemoteException e) { System.err.println(e.toString()); @@ -274,6 +276,16 @@ public final class Bmgr { class RestoreObserver extends IRestoreObserver.Stub { boolean done; + RestoreSet[] sets = null; + + public void restoreSetsAvailable(RestoreSet[] result) { + synchronized (this) { + sets = result; + done = true; + this.notify(); + } + } + public void restoreStarting(int numPackages) { System.out.println("restoreStarting: " + numPackages + " packages"); } @@ -359,8 +371,11 @@ public final class Bmgr { System.err.println(BMGR_NOT_RUNNING_ERR); return; } - RestoreSet[] sets = mRestore.getAvailableRestoreSets(); - if (sets != null) { + RestoreSet[] sets = null; + int err = mRestore.getAvailableRestoreSets(observer); + if (err != 0) { + observer.waitForCompletion(); + sets = observer.sets; for (RestoreSet s : sets) { if (s.token == token) { System.out.println("Scheduling restore: " + s.name); -- cgit v1.2.3