am aa088447: Hold the current transport instantiated all the time.

Merge commit 'aa088447baadd2e0bbcfd18cc529645610c13ddc'

* commit 'aa088447baadd2e0bbcfd18cc529645610c13ddc':
  Hold the current transport instantiated all the time.
This commit is contained in:
Christopher Tate
2009-06-17 15:37:53 -07:00
committed by The Android Open Source Project
2 changed files with 32 additions and 25 deletions

View File

@@ -42,11 +42,14 @@ interface IBackupTransport {
*/
/**
* Verify that this is a suitable time for a backup pass. This should return zero
* if a backup is reasonable right now, false otherwise. This method will be called
* outside of the {@link #startSession}/{@link #endSession} pair.
* if a backup is reasonable right now, some positive value otherwise. This method
* will be called outside of the {@link #startSession}/{@link #endSession} pair.
*
* <p>If this is not a suitable time for a backup, the transport should suggest a
* <p>If this is not a suitable time for a backup, the transport should return a
* backoff delay, in milliseconds, after which the Backup Manager should try again.
*
* @return Zero if this is a suitable time for a backup pass, or a positive time delay
* in milliseconds to suggest deferring the backup pass for a while.
*/
long requestBackupTime();

View File

@@ -68,7 +68,7 @@ import java.util.List;
class BackupManagerService extends IBackupManager.Stub {
private static final String TAG = "BackupManagerService";
private static final boolean DEBUG = true;
private static final long COLLECTION_INTERVAL = 1000;
//private static final long COLLECTION_INTERVAL = 3 * 60 * 1000;
@@ -90,7 +90,7 @@ class BackupManagerService extends IBackupManager.Stub {
private class BackupRequest {
public ApplicationInfo appInfo;
public boolean fullBackup;
BackupRequest(ApplicationInfo app, boolean isFull) {
appInfo = app;
fullBackup = isFull;
@@ -120,7 +120,9 @@ class BackupManagerService extends IBackupManager.Stub {
private final Object mClearDataLock = new Object();
private volatile boolean mClearingData;
// Current active transport & restore session
private int mTransportId;
private IBackupTransport mTransport;
private RestoreSession mActiveRestoreSession;
private File mStateDir;
@@ -128,7 +130,7 @@ class BackupManagerService extends IBackupManager.Stub {
private File mJournalDir;
private File mJournal;
private RandomAccessFile mJournalStream;
public BackupManagerService(Context context) {
mContext = context;
mPackageManager = context.getPackageManager();
@@ -144,14 +146,16 @@ class BackupManagerService extends IBackupManager.Stub {
mJournalDir.mkdirs();
makeJournalLocked(); // okay because no other threads are running yet
//!!! TODO: default to cloud transport, not local
mTransportId = BackupManager.TRANSPORT_LOCAL;
// Build our mapping of uid to backup client services
synchronized (mBackupParticipants) {
addPackageParticipantsLocked(null);
}
// Stand up our default transport
//!!! TODO: default to cloud transport, not local
mTransportId = BackupManager.TRANSPORT_LOCAL;
mTransport = createTransport(mTransportId);
// Now that we know about valid backup participants, parse any
// leftover journal files and schedule a new backup pass
parseLeftoverJournals();
@@ -284,7 +288,7 @@ class BackupManagerService extends IBackupManager.Stub {
// deleted. If we crash prior to that, the old journal is parsed
// at next boot and the journaled requests fulfilled.
}
(new PerformBackupThread(mTransportId, mBackupQueue, oldJournal)).run();
(new PerformBackupThread(mTransport, mBackupQueue, oldJournal)).run();
break;
case MSG_RUN_FULL_BACKUP:
@@ -396,7 +400,7 @@ class BackupManagerService extends IBackupManager.Stub {
}
return allApps;
}
// Reset the given package's known backup participants. Unlike add/remove, the update
// action cannot be passed a null package name.
void updatePackageParticipantsLocked(String packageName) {
@@ -505,13 +509,13 @@ class BackupManagerService extends IBackupManager.Stub {
class PerformBackupThread extends Thread {
private static final String TAG = "PerformBackupThread";
int mTransport;
IBackupTransport mTransport;
ArrayList<BackupRequest> mQueue;
File mJournal;
public PerformBackupThread(int transportId, ArrayList<BackupRequest> queue,
public PerformBackupThread(IBackupTransport transport, ArrayList<BackupRequest> queue,
File journal) {
mTransport = transportId;
mTransport = transport;
mQueue = queue;
mJournal = journal;
}
@@ -520,15 +524,9 @@ class BackupManagerService extends IBackupManager.Stub {
public void run() {
if (DEBUG) Log.v(TAG, "Beginning backup of " + mQueue.size() + " targets");
// stand up the current transport
IBackupTransport transport = createTransport(mTransport);
if (transport == null) {
return;
}
// start up the transport
try {
transport.startSession();
mTransport.startSession();
} catch (Exception e) {
Log.e(TAG, "Error session transport");
e.printStackTrace();
@@ -536,11 +534,11 @@ class BackupManagerService extends IBackupManager.Stub {
}
// The transport is up and running; now run all the backups in our queue
doQueuedBackups(transport);
doQueuedBackups(mTransport);
// Finally, tear down the transport
try {
transport.endSession();
mTransport.endSession();
} catch (Exception e) {
Log.e(TAG, "Error ending transport");
e.printStackTrace();
@@ -939,8 +937,14 @@ class BackupManagerService extends IBackupManager.Stub {
public int selectBackupTransport(int transportId) {
mContext.enforceCallingPermission("android.permission.BACKUP", "selectBackupTransport");
int prevTransport = mTransportId;
mTransportId = transportId;
int prevTransport = -1;
IBackupTransport newTransport = createTransport(transportId);
if (newTransport != null) {
// !!! TODO: a method on the old transport that says it's being deactivated?
mTransport = newTransport;
prevTransport = mTransportId;
mTransportId = transportId;
}
return prevTransport;
}