diff options
3 files changed, 67 insertions, 23 deletions
diff --git a/packages/BackupRestoreConfirmation/AndroidManifest.xml b/packages/BackupRestoreConfirmation/AndroidManifest.xml index 8141fa72e56f..e67b3be43ea1 100644 --- a/packages/BackupRestoreConfirmation/AndroidManifest.xml +++ b/packages/BackupRestoreConfirmation/AndroidManifest.xml @@ -30,6 +30,7 @@ android:title="" android:windowSoftInputMode="stateAlwaysHidden" android:excludeFromRecents="true" + android:launchMode="singleTop" android:exported="true" > </activity> </application> diff --git a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java index 9fa7a6646c9c..d6b6bf8d1e56 100644 --- a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java +++ b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java @@ -52,7 +52,9 @@ public class BackupRestoreConfirmation extends Activity { static final String TAG = "BackupRestoreConfirmation"; static final boolean DEBUG = true; - static final String DID_ACKNOWLEDGE = "did_acknowledge"; + static final String KEY_DID_ACKNOWLEDGE = "did_acknowledge"; + static final String KEY_TOKEN = "token"; + static final String KEY_ACTION = "action"; static final int MSG_START_BACKUP = 1; static final int MSG_BACKUP_PACKAGE = 2; @@ -69,6 +71,7 @@ public class BackupRestoreConfirmation extends Activity { int mToken; boolean mIsEncrypted; boolean mDidAcknowledge; + String mAction; TextView mStatusView; TextView mCurPassword; @@ -134,26 +137,9 @@ public class BackupRestoreConfirmation extends Activity { super.onCreate(icicle); final Intent intent = getIntent(); - final String action = intent.getAction(); - final int layoutId; - final int titleId; - if (action.equals(FullBackup.FULL_BACKUP_INTENT_ACTION)) { - layoutId = R.layout.confirm_backup; - titleId = R.string.backup_confirm_title; - } else if (action.equals(FullBackup.FULL_RESTORE_INTENT_ACTION)) { - layoutId = R.layout.confirm_restore; - titleId = R.string.restore_confirm_title; - } else { - Slog.w(TAG, "Backup/restore confirmation activity launched with invalid action!"); - finish(); - return; - } - - mToken = intent.getIntExtra(FullBackup.CONF_TOKEN_INTENT_EXTRA, -1); - if (mToken < 0) { - Slog.e(TAG, "Backup/restore confirmation requested but no token passed!"); - finish(); + boolean tokenValid = setTokenOrFinish(intent, icicle); + if (!tokenValid) { // already called finish() return; } @@ -169,6 +155,61 @@ public class BackupRestoreConfirmation extends Activity { mObserver.setHandler(mHandler); } + setViews(intent, icicle); + } + + @Override + public void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + + boolean tokenValid = setTokenOrFinish(intent, null); + if (!tokenValid) { // already called finish() + return; + } + + setViews(intent, null); + } + + private boolean setTokenOrFinish(Intent intent, Bundle icicle) { + mToken = intent.getIntExtra(FullBackup.CONF_TOKEN_INTENT_EXTRA, -1); + + // for relaunch, we try to use the last token before exit + if (icicle != null) { + mToken = icicle.getInt(KEY_TOKEN, mToken); + } + + if (mToken < 0) { + Slog.e(TAG, "Backup/restore confirmation requested but no token passed!"); + finish(); + return false; + } + + return true; + } + + private void setViews(Intent intent, Bundle icicle) { + mAction = intent.getAction(); + + // for relaunch, we try to use the last action before exit + if (icicle != null) { + mAction = icicle.getString(KEY_ACTION, mAction); + } + + final int layoutId; + final int titleId; + if (mAction.equals(FullBackup.FULL_BACKUP_INTENT_ACTION)) { + layoutId = R.layout.confirm_backup; + titleId = R.string.backup_confirm_title; + } else if (mAction.equals(FullBackup.FULL_RESTORE_INTENT_ACTION)) { + layoutId = R.layout.confirm_restore; + titleId = R.string.restore_confirm_title; + } else { + Slog.w(TAG, "Backup/restore confirmation activity launched with invalid action!"); + finish(); + return; + } + setTitle(titleId); setContentView(layoutId); @@ -202,7 +243,7 @@ public class BackupRestoreConfirmation extends Activity { // if we're a relaunch we may need to adjust button enable state if (icicle != null) { - mDidAcknowledge = icicle.getBoolean(DID_ACKNOWLEDGE, false); + mDidAcknowledge = icicle.getBoolean(KEY_DID_ACKNOWLEDGE, false); mAllowButton.setEnabled(!mDidAcknowledge); mDenyButton.setEnabled(!mDidAcknowledge); } @@ -249,7 +290,9 @@ public class BackupRestoreConfirmation extends Activity { @Override protected void onSaveInstanceState(Bundle outState) { - outState.putBoolean(DID_ACKNOWLEDGE, mDidAcknowledge); + outState.putBoolean(KEY_DID_ACKNOWLEDGE, mDidAcknowledge); + outState.putInt(KEY_TOKEN, mToken); + outState.putString(KEY_ACTION, mAction); } void sendAcknowledgement(int token, boolean allow, IFullBackupRestoreObserver observer) { diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 14b76ab64fa8..3b80f555d458 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2638,7 +2638,7 @@ public class BackupManagerService implements BackupManagerServiceInterface { confIntent.setClassName("com.android.backupconfirm", "com.android.backupconfirm.BackupRestoreConfirmation"); confIntent.putExtra(FullBackup.CONF_TOKEN_INTENT_EXTRA, token); - confIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + confIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); mContext.startActivityAsUser(confIntent, UserHandle.SYSTEM); } catch (ActivityNotFoundException e) { return false; |