diff options
author | Christopher Tate <ctate@google.com> | 2010-03-30 13:17:23 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-03-30 13:17:23 -0700 |
commit | 4caee4f7199d43b98badb02c9b746af66062cef2 (patch) | |
tree | 2f86cde099635d98cc44e51eac687dd4ae629544 /services/java/com/android/server | |
parent | 2fa4ab04b43ea1e377d2921f6e5112025a6f1439 (diff) | |
parent | b3f7fe44f5a3a6a4c04d4102eb61f29edf83129c (diff) | |
download | frameworks_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.java | 68 |
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); } |