summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2010-03-30 13:17:23 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-03-30 13:17:23 -0700
commit4caee4f7199d43b98badb02c9b746af66062cef2 (patch)
tree2f86cde099635d98cc44e51eac687dd4ae629544 /services/java/com/android/server
parent2fa4ab04b43ea1e377d2921f6e5112025a6f1439 (diff)
parentb3f7fe44f5a3a6a4c04d4102eb61f29edf83129c (diff)
downloadframeworks_base-4caee4f7199d43b98badb02c9b746af66062cef2.zip
frameworks_base-4caee4f7199d43b98badb02c9b746af66062cef2.tar.gz
frameworks_base-4caee4f7199d43b98badb02c9b746af66062cef2.tar.bz2
am b3f7fe44: am 22375e4a: Merge "Make RestoreSession.getAvailableRestoreSets() asynchronous" into froyo
Merge commit 'b3f7fe44f5a3a6a4c04d4102eb61f29edf83129c' into kraken * commit 'b3f7fe44f5a3a6a4c04d4102eb61f29edf83129c': Make RestoreSession.getAvailableRestoreSets() asynchronous
Diffstat (limited to 'services/java/com/android/server')
-rw-r--r--services/java/com/android/server/BackupManagerService.java68
1 files changed, 58 insertions, 10 deletions
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 7607c74..818c785 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -104,7 +104,8 @@ class BackupManagerService extends IBackupManager.Stub {
private static final int MSG_RUN_RESTORE = 3;
private static final int MSG_RUN_CLEAR = 4;
private static final int MSG_RUN_INITIALIZE = 5;
- private static final int MSG_TIMEOUT = 6;
+ private static final int MSG_RUN_GET_RESTORE_SETS = 6;
+ private static final int MSG_TIMEOUT = 7;
// Timeout interval for deciding that a bind or clear-data has taken too long
static final long TIMEOUT_INTERVAL = 10 * 1000;
@@ -177,6 +178,19 @@ class BackupManagerService extends IBackupManager.Stub {
IBackupTransport mLocalTransport, mGoogleTransport;
ActiveRestoreSession mActiveRestoreSession;
+ class RestoreGetSetsParams {
+ public IBackupTransport transport;
+ public ActiveRestoreSession session;
+ public IRestoreObserver observer;
+
+ RestoreGetSetsParams(IBackupTransport _transport, ActiveRestoreSession _session,
+ IRestoreObserver _observer) {
+ transport = _transport;
+ session = _session;
+ observer = _observer;
+ }
+ }
+
class RestoreParams {
public IBackupTransport transport;
public IRestoreObserver observer;
@@ -333,6 +347,36 @@ class BackupManagerService extends IBackupManager.Stub {
break;
}
+ case MSG_RUN_GET_RESTORE_SETS:
+ {
+ // Like other async operations, this is entered with the wakelock held
+ RestoreSet[] sets = null;
+ RestoreGetSetsParams params = (RestoreGetSetsParams)msg.obj;
+ try {
+ sets = params.transport.getAvailableRestoreSets();
+ // cache the result in the active session
+ synchronized (params.session) {
+ params.session.mRestoreSets = sets;
+ }
+ if (sets == null) EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
+ } catch (Exception e) {
+ Slog.e(TAG, "Error from transport getting set list");
+ } finally {
+ if (params.observer != null) {
+ try {
+ params.observer.restoreSetsAvailable(sets);
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to report listing to observer");
+ } catch (Exception e) {
+ Slog.e(TAG, "Restore observer threw", e);
+ }
+ }
+
+ mWakelock.release();
+ }
+ break;
+ }
+
case MSG_TIMEOUT:
{
synchronized (mCurrentOpLock) {
@@ -2343,24 +2387,28 @@ class BackupManagerService extends IBackupManager.Stub {
}
// --- Binder interface ---
- public synchronized RestoreSet[] getAvailableRestoreSets() {
+ public synchronized int getAvailableRestoreSets(IRestoreObserver observer) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"getAvailableRestoreSets");
+ if (observer == null) {
+ throw new IllegalArgumentException("Observer must not be null");
+ }
long oldId = Binder.clearCallingIdentity();
try {
if (mRestoreTransport == null) {
Slog.w(TAG, "Null transport getting restore sets");
- return null;
- }
- if (mRestoreSets == null) { // valid transport; do the one-time fetch
- mRestoreSets = mRestoreTransport.getAvailableRestoreSets();
- if (mRestoreSets == null) EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
- }
- return mRestoreSets;
+ return -1;
+ }
+ // spin off the transport request to our service thread
+ mWakelock.acquire();
+ Message msg = mBackupHandler.obtainMessage(MSG_RUN_GET_RESTORE_SETS,
+ new RestoreGetSetsParams(mRestoreTransport, this, observer));
+ mBackupHandler.sendMessage(msg);
+ return 0;
} catch (Exception e) {
Slog.e(TAG, "Error in getAvailableRestoreSets", e);
- return null;
+ return -1;
} finally {
Binder.restoreCallingIdentity(oldId);
}