@@ -198,22 +198,26 @@ class RestoreParams {
198198 public long token ;
199199 public PackageInfo pkgInfo ;
200200 public int pmToken ; // in post-install restore, the PM's token for this transaction
201+ public boolean needFullBackup ;
201202
202203 RestoreParams (IBackupTransport _transport , IRestoreObserver _obs ,
203- long _token , PackageInfo _pkg , int _pmToken ) {
204+ long _token , PackageInfo _pkg , int _pmToken , boolean _needFullBackup ) {
204205 transport = _transport ;
205206 observer = _obs ;
206207 token = _token ;
207208 pkgInfo = _pkg ;
208209 pmToken = _pmToken ;
210+ needFullBackup = _needFullBackup ;
209211 }
210212
211- RestoreParams (IBackupTransport _transport , IRestoreObserver _obs , long _token ) {
213+ RestoreParams (IBackupTransport _transport , IRestoreObserver _obs , long _token ,
214+ boolean _needFullBackup ) {
212215 transport = _transport ;
213216 observer = _obs ;
214217 token = _token ;
215218 pkgInfo = null ;
216219 pmToken = 0 ;
220+ needFullBackup = _needFullBackup ;
217221 }
218222 }
219223
@@ -323,7 +327,8 @@ public void handleMessage(Message msg) {
323327 RestoreParams params = (RestoreParams )msg .obj ;
324328 Slog .d (TAG , "MSG_RUN_RESTORE observer=" + params .observer );
325329 (new PerformRestoreTask (params .transport , params .observer ,
326- params .token , params .pkgInfo , params .pmToken )).run ();
330+ params .token , params .pkgInfo , params .pmToken ,
331+ params .needFullBackup )).run ();
327332 break ;
328333 }
329334
@@ -1559,6 +1564,7 @@ class PerformRestoreTask implements Runnable {
15591564 private PackageInfo mTargetPackage ;
15601565 private File mStateDir ;
15611566 private int mPmToken ;
1567+ private boolean mNeedFullBackup ;
15621568
15631569 class RestoreRequest {
15641570 public PackageInfo app ;
@@ -1571,12 +1577,14 @@ class RestoreRequest {
15711577 }
15721578
15731579 PerformRestoreTask (IBackupTransport transport , IRestoreObserver observer ,
1574- long restoreSetToken , PackageInfo targetPackage , int pmToken ) {
1580+ long restoreSetToken , PackageInfo targetPackage , int pmToken ,
1581+ boolean needFullBackup ) {
15751582 mTransport = transport ;
15761583 mObserver = observer ;
15771584 mToken = restoreSetToken ;
15781585 mTargetPackage = targetPackage ;
15791586 mPmToken = pmToken ;
1587+ mNeedFullBackup = needFullBackup ;
15801588
15811589 try {
15821590 mStateDir = new File (mBaseStateDir , transport .transportDirName ());
@@ -1654,7 +1662,8 @@ public void run() {
16541662 // Pull the Package Manager metadata from the restore set first
16551663 pmAgent = new PackageManagerBackupAgent (
16561664 mPackageManager , agentPackages );
1657- processOneRestore (omPackage , 0 , IBackupAgent .Stub .asInterface (pmAgent .onBind ()));
1665+ processOneRestore (omPackage , 0 , IBackupAgent .Stub .asInterface (pmAgent .onBind ()),
1666+ mNeedFullBackup );
16581667
16591668 // Verify that the backup set includes metadata. If not, we can't do
16601669 // signature/version verification etc, so we simply do not proceed with
@@ -1751,7 +1760,8 @@ public void run() {
17511760
17521761 // And then finally run the restore on this agent
17531762 try {
1754- processOneRestore (packageInfo , metaInfo .versionCode , agent );
1763+ processOneRestore (packageInfo , metaInfo .versionCode , agent ,
1764+ mNeedFullBackup );
17551765 ++count ;
17561766 } finally {
17571767 // unbind and tidy up even on timeout or failure, just in case
@@ -1821,7 +1831,8 @@ public void run() {
18211831 }
18221832
18231833 // Do the guts of a restore of one application, using mTransport.getRestoreData().
1824- void processOneRestore (PackageInfo app , int appVersionCode , IBackupAgent agent ) {
1834+ void processOneRestore (PackageInfo app , int appVersionCode , IBackupAgent agent ,
1835+ boolean needFullBackup ) {
18251836 // !!! TODO: actually run the restore through mTransport
18261837 final String packageName = app .packageName ;
18271838
@@ -1900,6 +1911,14 @@ void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent)
19001911 try { if (newState != null ) newState .close (); } catch (IOException e ) {}
19011912 backupData = newState = null ;
19021913 mCurrentOperations .delete (token );
1914+
1915+ // If we know a priori that we'll need to perform a full post-restore backup
1916+ // pass, clear the new state file data. This means we're discarding work that
1917+ // was just done by the app's agent, but this way the agent doesn't need to
1918+ // take any special action based on global device state.
1919+ if (needFullBackup ) {
1920+ newStateName .delete ();
1921+ }
19031922 }
19041923 }
19051924 }
@@ -2385,7 +2404,7 @@ public void restoreAtInstall(String packageName, int token) {
23852404 mWakelock .acquire ();
23862405 Message msg = mBackupHandler .obtainMessage (MSG_RUN_RESTORE );
23872406 msg .obj = new RestoreParams (getTransport (mCurrentTransport ), null ,
2388- restoreSet , pkg , token );
2407+ restoreSet , pkg , token , true );
23892408 mBackupHandler .sendMessage (msg );
23902409 } else {
23912410 // Auto-restore disabled or no way to attempt a restore; just tell the Package
@@ -2516,7 +2535,7 @@ public synchronized int restoreAll(long token, IRestoreObserver observer) {
25162535 long oldId = Binder .clearCallingIdentity ();
25172536 mWakelock .acquire ();
25182537 Message msg = mBackupHandler .obtainMessage (MSG_RUN_RESTORE );
2519- msg .obj = new RestoreParams (mRestoreTransport , observer , token );
2538+ msg .obj = new RestoreParams (mRestoreTransport , observer , token , true );
25202539 mBackupHandler .sendMessage (msg );
25212540 Binder .restoreCallingIdentity (oldId );
25222541 return 0 ;
@@ -2581,7 +2600,7 @@ public synchronized int restorePackage(String packageName, IRestoreObserver obse
25812600 long oldId = Binder .clearCallingIdentity ();
25822601 mWakelock .acquire ();
25832602 Message msg = mBackupHandler .obtainMessage (MSG_RUN_RESTORE );
2584- msg .obj = new RestoreParams (mRestoreTransport , observer , token , app , 0 );
2603+ msg .obj = new RestoreParams (mRestoreTransport , observer , token , app , 0 , false );
25852604 mBackupHandler .sendMessage (msg );
25862605 Binder .restoreCallingIdentity (oldId );
25872606 return 0 ;
0 commit comments