diff --git a/core/java/android/app/BackupAgent.java b/core/java/android/app/BackupAgent.java index 85c001c097c69..e8107756cc6fb 100644 --- a/core/java/android/app/BackupAgent.java +++ b/core/java/android/app/BackupAgent.java @@ -78,11 +78,16 @@ public abstract class BackupAgent extends ContextWrapper { * * @param data An open, read-only ParcelFileDescriptor pointing to a full snapshot * of the application's data. + * @param appVersionCode The android:versionCode value of the application that backed + * up this particular data set. This makes it easier for an application's + * agent to distinguish among several possible older data versions when + * asked to perform the restore operation. * @param newState An open, read/write ParcelFileDescriptor pointing to an empty * file. The application should record the final backup state * here after restoring its data from dataFd. */ - public abstract void onRestore(BackupDataInput data, ParcelFileDescriptor newState) + public abstract void onRestore(BackupDataInput data, int appVersionCode, + ParcelFileDescriptor newState) throws IOException; @@ -121,13 +126,13 @@ public abstract class BackupAgent extends ContextWrapper { } } - public void doRestore(ParcelFileDescriptor data, + public void doRestore(ParcelFileDescriptor data, int appVersionCode, ParcelFileDescriptor newState) throws RemoteException { // !!! TODO - real implementation; for now just invoke the callbacks directly Log.v(TAG, "doRestore() invoked"); BackupDataInput input = new BackupDataInput(data.getFileDescriptor()); try { - BackupAgent.this.onRestore(input, newState); + BackupAgent.this.onRestore(input, appVersionCode, newState); } catch (IOException ex) { Log.d(TAG, "onRestore (" + BackupAgent.this.getClass().getName() + ") threw", ex); throw new RuntimeException(ex); diff --git a/core/java/android/app/FullBackupAgent.java b/core/java/android/app/FullBackupAgent.java index bc6bb151baf42..d89db96674737 100644 --- a/core/java/android/app/FullBackupAgent.java +++ b/core/java/android/app/FullBackupAgent.java @@ -53,6 +53,6 @@ public class FullBackupAgent extends BackupAgent { } @Override - public void onRestore(BackupDataInput data, ParcelFileDescriptor newState) { + public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) { } } diff --git a/core/java/android/app/IBackupAgent.aidl b/core/java/android/app/IBackupAgent.aidl index bb9f00830d8ed..9b0550fce64b1 100644 --- a/core/java/android/app/IBackupAgent.aidl +++ b/core/java/android/app/IBackupAgent.aidl @@ -51,9 +51,14 @@ interface IBackupAgent { * app's backup. This is to be a replacement of the app's * current data, not to be merged into it. * + * @param appVersionCode The android:versionCode attribute of the application + * that created this data set. This can help the agent distinguish among + * various historical backup content possibilities. + * * @param newState Read-write file, empty when onRestore() is called, * that is to be written with the state description that holds after * the restore has been completed. */ - void doRestore(in ParcelFileDescriptor data, in ParcelFileDescriptor newState); + void doRestore(in ParcelFileDescriptor data, int appVersionCode, + in ParcelFileDescriptor newState); } diff --git a/core/java/android/backup/BackupHelperAgent.java b/core/java/android/backup/BackupHelperAgent.java index f7eb1b88df47f..3720d5088635f 100644 --- a/core/java/android/backup/BackupHelperAgent.java +++ b/core/java/android/backup/BackupHelperAgent.java @@ -39,9 +39,9 @@ public class BackupHelperAgent extends BackupAgent { } @Override - public void onRestore(BackupDataInput data, ParcelFileDescriptor newState) + public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException { - mDispatcher.performRestore(data, newState); + mDispatcher.performRestore(data, appVersionCode, newState); } public BackupHelperDispatcher getDispatcher() { diff --git a/core/java/android/backup/BackupHelperDispatcher.java b/core/java/android/backup/BackupHelperDispatcher.java index e9a8f71b4e1c5..b25c3e3ed8847 100644 --- a/core/java/android/backup/BackupHelperDispatcher.java +++ b/core/java/android/backup/BackupHelperDispatcher.java @@ -46,7 +46,8 @@ public class BackupHelperDispatcher { } } - public void performRestore(BackupDataInput input, ParcelFileDescriptor newState) + public void performRestore(BackupDataInput input, int appVersionCode, + ParcelFileDescriptor newState) throws IOException { boolean alreadyComplained = false; diff --git a/core/java/android/backup/IBackupManager.aidl b/core/java/android/backup/IBackupManager.aidl index efc664c54a24d..d6283d048b7d7 100644 --- a/core/java/android/backup/IBackupManager.aidl +++ b/core/java/android/backup/IBackupManager.aidl @@ -33,19 +33,19 @@ interface IBackupManager { * Tell the system service that the caller has made changes to its * data, and therefore needs to undergo an incremental backup pass. */ - oneway void dataChanged(String packageName); + void dataChanged(String packageName); /** * Notifies the Backup Manager Service that an agent has become available. This * method is only invoked by the Activity Manager. */ - oneway void agentConnected(String packageName, IBinder agent); + void agentConnected(String packageName, IBinder agent); /** * Notify the Backup Manager Service that an agent has unexpectedly gone away. * This method is only invoked by the Activity Manager. */ - oneway void agentDisconnected(String packageName); + void agentDisconnected(String packageName); /** * Schedule an immediate backup attempt for all pending updates. This is @@ -57,7 +57,7 @@ interface IBackupManager { * *
Callers must hold the android.permission.BACKUP permission to use this method.
*/
- oneway void backupNow();
+ void backupNow();
/**
* Identify the currently selected transport. Callers must hold the
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index c60f98123d904..197404e895886 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -795,6 +795,16 @@ class BackupManagerService extends IBackupManager.Stub {
private int mToken;
private RestoreSet mImage;
+ class RestoreRequest {
+ public PackageInfo app;
+ public int storedAppVersion;
+
+ RestoreRequest(PackageInfo _app, int _version) {
+ app = _app;
+ storedAppVersion = _version;
+ }
+ }
+
PerformRestoreThread(IBackupTransport transport, int restoreSetToken) {
mTransport = transport;
mToken = restoreSetToken;
@@ -840,11 +850,13 @@ class BackupManagerService extends IBackupManager.Stub {
mPackageManager, allAgentApps());
PackageInfo pmApp = new PackageInfo();
pmApp.packageName = PACKAGE_MANAGER_SENTINEL;
- processOneRestore(pmApp, IBackupAgent.Stub.asInterface(pmAgent.onBind()));
+ // !!! TODO: version currently ignored when 'restoring' the PM metadata
+ processOneRestore(pmApp, 0,
+ IBackupAgent.Stub.asInterface(pmAgent.onBind()));
// build the set of apps we will attempt to restore
PackageInfo[] packages = mTransport.getAppSet(mImage.token);
- HashSet