Convert SetupData into a retained fragment

This will keep it from being recreated quite as much while off-thread tasks are possibly mutating it.

Change-Id: Ic9873489906339c33a76b8a600c0fc28016debc4
diff --git a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
index e7ea824..821a55c 100644
--- a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
+++ b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
@@ -69,7 +69,7 @@
     private final static int STATE_AUTODISCOVER_AUTH_DIALOG = 7;    // terminal
     private final static int STATE_AUTODISCOVER_RESULT = 8;         // terminal
     private int mState = STATE_START;
-    private SetupData mSetupData;
+    private SetupDataFragment mSetupData;
 
     // Support for UI
     private boolean mAttached;
@@ -106,13 +106,13 @@
          * Called when CheckSettings completed
          * @param result check settings result code - success is CHECK_SETTINGS_OK
          */
-        public void onCheckSettingsComplete(int result, SetupData setupData);
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData);
 
         /**
          * Called when autodiscovery completes.
          * @param result autodiscovery result code - success is AUTODISCOVER_OK
          */
-        public void onAutoDiscoverComplete(int result, SetupData setupData);
+        public void onAutoDiscoverComplete(int result, SetupDataFragment setupData);
     }
 
     // Public no-args constructor needed for fragment re-instantiation
@@ -153,8 +153,8 @@
         // If this is the first time, start the AsyncTask
         if (mAccountCheckTask == null) {
             final int checkMode = getTargetRequestCode();
-            final SetupData.SetupDataContainer container =
-                    (SetupData.SetupDataContainer) getActivity();
+            final SetupDataFragment.SetupDataContainer container =
+                    (SetupDataFragment.SetupDataContainer) getActivity();
             mSetupData = container.getSetupData();
             final Account checkAccount = mSetupData.getAccount();
             mAccountCheckTask = (AccountCheckTask)
@@ -440,7 +440,7 @@
         @Override
         protected MessagingException doInBackground(Void... params) {
             try {
-                if ((mMode & SetupData.CHECK_AUTODISCOVER) != 0) {
+                if ((mMode & SetupDataFragment.CHECK_AUTODISCOVER) != 0) {
                     if (isCancelled()) return null;
                     publishProgress(STATE_CHECK_AUTODISCOVER);
                     LogUtils.d(Logging.LOG_TAG, "Begin auto-discover for " + mCheckEmail);
@@ -468,7 +468,7 @@
                 }
 
                 // Check Incoming Settings
-                if ((mMode & SetupData.CHECK_INCOMING) != 0) {
+                if ((mMode & SetupDataFragment.CHECK_INCOMING) != 0) {
                     if (isCancelled()) return null;
                     LogUtils.d(Logging.LOG_TAG, "Begin check of incoming email settings");
                     publishProgress(STATE_CHECK_INCOMING);
@@ -513,7 +513,7 @@
                 final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext, protocol);
 
                 // Check Outgoing Settings
-                if (info.usesSmtp && (mMode & SetupData.CHECK_OUTGOING) != 0) {
+                if (info.usesSmtp && (mMode & SetupDataFragment.CHECK_OUTGOING) != 0) {
                     if (isCancelled()) return null;
                     LogUtils.d(Logging.LOG_TAG, "Begin check of outgoing email settings");
                     publishProgress(STATE_CHECK_OUTGOING);
diff --git a/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
index dad261a..29f505d 100644
--- a/src/com/android/email/activity/setup/AccountServerBaseFragment.java
+++ b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
@@ -62,7 +62,7 @@
     /*package*/ HostAuth mLoadedSendAuth;
     /*package*/ HostAuth mLoadedRecvAuth;
 
-    protected SetupData mSetupData;
+    protected SetupDataFragment mSetupData;
 
     // This is null in the setup wizard screens, and non-null in AccountSettings mode
     private Button mProceedButton;
@@ -82,7 +82,7 @@
 
         /**
          * Called when user clicks "next".  Starts account checker.
-         * @param checkMode values from {@link SetupData}
+         * @param checkMode values from {@link SetupDataFragment}
          * @param target the fragment that requested the check
          */
         public void onProceedNext(int checkMode, AccountServerBaseFragment target);
@@ -93,14 +93,14 @@
          * @param result check settings result code - success is CHECK_SETTINGS_OK
          * @param setupData possibly modified SetupData
          */
-        public void onCheckSettingsComplete(int result, SetupData setupData);
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData);
     }
 
     private static class EmptyCallback implements Callback {
         public static final Callback INSTANCE = new EmptyCallback();
         @Override public void onEnableProceedButtons(boolean enable) { }
         @Override public void onProceedNext(int checkMode, AccountServerBaseFragment target) { }
-        @Override public void onCheckSettingsComplete(int result, SetupData setupData) { }
+        @Override public void onCheckSettingsComplete(int result, SetupDataFragment setupData) { }
     }
 
     /**
@@ -154,7 +154,8 @@
         if (mSettingsMode && savedInstanceState != null) {
             mContext.setTitle(savedInstanceState.getString(BUNDLE_KEY_ACTIVITY_TITLE));
         }
-        SetupData.SetupDataContainer container = (SetupData.SetupDataContainer) mContext;
+        SetupDataFragment.SetupDataContainer container =
+                (SetupDataFragment.SetupDataContainer) mContext;
         mSetupData = container.getSetupData();
 
         super.onActivityCreated(savedInstanceState);
@@ -302,13 +303,13 @@
      * exit to previous fragment.
      */
     @Override
-    public void onCheckSettingsComplete(final int settingsResult, SetupData setupData) {
+    public void onCheckSettingsComplete(final int settingsResult, SetupDataFragment setupData) {
         mSetupData = setupData;
         new AsyncTask<Void, Void, Void>() {
             @Override
             protected Void doInBackground(Void... params) {
                 if (settingsResult == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
-                    if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_EDIT) {
+                    if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_EDIT) {
                         saveSettingsAfterEdit();
                     } else {
                         saveSettingsAfterSetup();
@@ -330,7 +331,7 @@
      * This is overridden only by AccountSetupExchange
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         throw new IllegalStateException();
     }
 
diff --git a/src/com/android/email/activity/setup/AccountSettings.java b/src/com/android/email/activity/setup/AccountSettings.java
index ebd0508..a1f94f0 100644
--- a/src/com/android/email/activity/setup/AccountSettings.java
+++ b/src/com/android/email/activity/setup/AccountSettings.java
@@ -72,7 +72,7 @@
  *       dealing with accounts being added/deleted and triggering the header reload.
  */
 public class AccountSettings extends PreferenceActivity implements FeedbackEnabledActivity,
-        SetupData.SetupDataContainer {
+        SetupDataFragment.SetupDataContainer {
     /*
      * Intent to open account settings for account=1
         adb shell am start -a android.intent.action.EDIT \
@@ -120,7 +120,7 @@
     private Uri mFeedbackUri;
     private MenuItem mFeedbackMenuItem;
 
-    private SetupData mSetupData;
+    private SetupDataFragment mSetupData;
 
     // Async Tasks
     private LoadAccountListTask mLoadAccountListTask;
@@ -227,7 +227,7 @@
                 }
             }
         } else {
-            mSetupData = savedInstanceState.getParcelable(SetupData.EXTRA_SETUP_DATA);
+            mSetupData = savedInstanceState.getParcelable(SetupDataFragment.EXTRA_SETUP_DATA);
         }
         mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false);
 
@@ -253,7 +253,8 @@
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(
                 outState);
-        outState.putParcelable(SetupData.EXTRA_SETUP_DATA, mSetupData);
+        // TODO: use the fragment manager to persist this
+        outState.putParcelable(SetupDataFragment.EXTRA_SETUP_DATA, mSetupData);
     }
 
     @Override
@@ -660,7 +661,7 @@
          * simply does a "back" to exit the settings screen.
          */
         @Override
-        public void onCheckSettingsComplete(int result, SetupData setupData) {
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
             if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
                 // Settings checked & saved; clear current fragment
                 mCurrentFragment = null;
@@ -705,7 +706,7 @@
      */
     public void onIncomingSettings(Account account) {
         try {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_EDIT, account);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_EDIT, account);
             final Fragment f = new AccountSetupIncomingFragment();
             f.setArguments(AccountSetupIncomingFragment.getArgs(true));
             // Use startPreferenceFragment here because we need to keep this activity instance
@@ -722,7 +723,7 @@
      */
     public void onOutgoingSettings(Account account) {
         try {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_EDIT, account);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_EDIT, account);
             final Fragment f = new AccountSetupOutgoingFragment();
             f.setArguments(AccountSetupOutgoingFragment.getArgs(true));
             // Use startPreferenceFragment here because we need to keep this activity instance
@@ -926,12 +927,12 @@
     }
 
     @Override
-    public SetupData getSetupData() {
+    public SetupDataFragment getSetupData() {
         return mSetupData;
     }
 
     @Override
-    public void setSetupData(SetupData setupData) {
+    public void setSetupData(SetupDataFragment setupData) {
         mSetupData = setupData;
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupActivity.java b/src/com/android/email/activity/setup/AccountSetupActivity.java
index fb29581..fd6e63d 100644
--- a/src/com/android/email/activity/setup/AccountSetupActivity.java
+++ b/src/com/android/email/activity/setup/AccountSetupActivity.java
@@ -17,6 +17,7 @@
 package com.android.email.activity.setup;
 
 import android.app.Activity;
+import android.app.FragmentTransaction;
 import android.os.Bundle;
 
 import com.android.emailcommon.Logging;
@@ -26,25 +27,37 @@
  * Superclass of all of the account setup activities; ensures that SetupData state is saved/restored
  * automatically as required
  */
-public class AccountSetupActivity extends Activity implements SetupData.SetupDataContainer {
+public class AccountSetupActivity extends Activity implements SetupDataFragment.SetupDataContainer {
     private static final boolean DEBUG_SETUP_FLOWS = false;  // Don't check in set to true
-    protected SetupData mSetupData;
+    protected SetupDataFragment mSetupData;
 
+    private static final String SETUP_DATA_FRAGMENT_TAG = "setupData";
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        if (savedInstanceState != null) {
-            mSetupData = savedInstanceState.getParcelable(SetupData.EXTRA_SETUP_DATA);
-        } else {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState == null) {
             final Bundle b = getIntent().getExtras();
             if (b != null) {
-                mSetupData = b.getParcelable(SetupData.EXTRA_SETUP_DATA);
+                mSetupData = b.getParcelable(SetupDataFragment.EXTRA_SETUP_DATA);
+                if (mSetupData != null) {
+                    final FragmentTransaction ft = getFragmentManager().beginTransaction();
+                    ft.add(mSetupData, SETUP_DATA_FRAGMENT_TAG);
+                    ft.commit();
+                }
             }
-        }
-        if (mSetupData == null) {
-            mSetupData = new SetupData();
+        } else {
+            mSetupData = (SetupDataFragment)getFragmentManager()
+                    .findFragmentByTag(SETUP_DATA_FRAGMENT_TAG);
         }
 
-        super.onCreate(savedInstanceState);
+        if (mSetupData == null) {
+            mSetupData = new SetupDataFragment();
+            final FragmentTransaction ft = getFragmentManager().beginTransaction();
+            ft.add(mSetupData, SETUP_DATA_FRAGMENT_TAG);
+            ft.commit();
+        }
+
         if (DEBUG_SETUP_FLOWS) {
             LogUtils.d(Logging.LOG_TAG, "%s onCreate %s", getClass().getName(),
                     mSetupData.debugString());
@@ -52,18 +65,12 @@
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putParcelable(SetupData.EXTRA_SETUP_DATA, mSetupData);
-    }
-
-    @Override
-    public SetupData getSetupData() {
+    public SetupDataFragment getSetupData() {
         return mSetupData;
     }
 
     @Override
-    public void setSetupData(SetupData setupData) {
+    public void setSetupData(SetupDataFragment setupData) {
         mSetupData = setupData;
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupBasics.java b/src/com/android/email/activity/setup/AccountSetupBasics.java
index 254f0d1..3ab2bea 100644
--- a/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ b/src/com/android/email/activity/setup/AccountSetupBasics.java
@@ -126,13 +126,13 @@
 
     public static void actionNewAccount(Activity fromActivity) {
         final Intent i = new Intent(fromActivity, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NORMAL);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_NORMAL);
         fromActivity.startActivity(i);
     }
 
     public static void actionNewAccountWithResult(Activity fromActivity) {
         final Intent i = new ForwardingIntent(fromActivity, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NO_ACCOUNTS);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_NO_ACCOUNTS);
         fromActivity.startActivity(i);
     }
 
@@ -142,7 +142,7 @@
      */
     public static Intent actionGetCreateAccountIntent(Context context, String accountManagerType) {
         final Intent i = new Intent(context, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_ACCOUNT_MANAGER);
         i.putExtra(EXTRA_FLOW_ACCOUNT_TYPE, accountManagerType);
         return i;
     }
@@ -155,7 +155,8 @@
         final Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
         // If we're in the "account flow" (from AccountManager), we want to return to the caller
         // (in the settings app)
-        i.putExtra(SetupData.EXTRA_SETUP_DATA, new SetupData(SetupData.FLOW_MODE_RETURN_TO_CALLER));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_TO_CALLER));
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -167,8 +168,8 @@
 
         final Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
         // If we're in the "no accounts" flow, we want to return to the caller with a result
-        i.putExtra(SetupData.EXTRA_SETUP_DATA,
-                new SetupData(SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT));
         i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -177,8 +178,8 @@
         final Intent i = new Intent(fromActivity, AccountSetupBasics.class);
         // If we're not in the "account flow" (from AccountManager), we want to show the
         // message list for the new inbox
-        i.putExtra(SetupData.EXTRA_SETUP_DATA,
-                new SetupData(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account));
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -197,22 +198,22 @@
             INTENT_CREATE_ACCOUNT = getString(R.string.intent_create_account);
         }
         if (INTENT_CREATE_ACCOUNT.equals(action)) {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_FORCE_CREATE);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_FORCE_CREATE);
         } else {
             final int intentFlowMode =
-                    intent.getIntExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_UNSPECIFIED);
-            if (intentFlowMode != SetupData.FLOW_MODE_UNSPECIFIED) {
-                mSetupData = new SetupData(intentFlowMode,
+                    intent.getIntExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_UNSPECIFIED);
+            if (intentFlowMode != SetupDataFragment.FLOW_MODE_UNSPECIFIED) {
+                mSetupData = new SetupDataFragment(intentFlowMode,
                         intent.getStringExtra(EXTRA_FLOW_ACCOUNT_TYPE));
             }
         }
 
         final int flowMode = mSetupData.getFlowMode();
-        if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
+        if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_TO_CALLER) {
             // Return to the caller who initiated account creation
             finish();
             return;
-        } else if (flowMode == SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
+        } else if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
             if (EmailContent.count(this, Account.CONTENT_URI) > 0) {
                 setResult(RESULT_OK);
             } else {
@@ -220,7 +221,7 @@
             }
             finish();
             return;
-        } else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
+        } else if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
             final Account account = mSetupData.getAccount();
             if (account != null && account.mId >= 0) {
                 // Show the message list for the new account
@@ -280,7 +281,7 @@
 
         // Handle force account creation immediately (now that fragment is set up)
         // This is never allowed in a normal user build and will exit immediately.
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             if (!DEBUG_ALLOW_NON_TEST_HARNESS_CREATION &&
                     !ActivityManager.isRunningInTestHarness()) {
                 LogUtils.e(Logging.LOG_TAG,
@@ -540,7 +541,8 @@
                 if (mAutoSetup) {
                     final AccountCheckSettingsFragment checkerFragment =
                         AccountCheckSettingsFragment.newInstance(
-                            SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
+                            SetupDataFragment.CHECK_INCOMING | SetupDataFragment.CHECK_OUTGOING,
+                                null);
                     final FragmentTransaction transaction = getFragmentManager().beginTransaction();
                     transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
                     transaction.addToBackStack("back");
@@ -681,7 +683,7 @@
      * so we inhibit reporting any error back to the Account manager.
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             AccountSetupOptions.actionOptions(this, mSetupData);
@@ -695,7 +697,7 @@
      * This is overridden only by AccountSetupIncoming
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         throw new IllegalStateException();
     }
 
diff --git a/src/com/android/email/activity/setup/AccountSetupIncoming.java b/src/com/android/email/activity/setup/AccountSetupIncoming.java
index 36cad86..6b8c592 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncoming.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncoming.java
@@ -53,10 +53,10 @@
 
     // Extras for AccountSetupIncoming intent
 
-    public static void actionIncomingSettings(Activity fromActivity, SetupData setupData) {
+    public static void actionIncomingSettings(Activity fromActivity, SetupDataFragment setupData) {
         final Intent intent = new Intent(fromActivity, AccountSetupIncoming.class);
         // Add the additional information to the intent, in case the Email process is killed.
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -141,11 +141,11 @@
         final String username = account.mHostAuthRecv.mLogin;
         final String password = account.mHostAuthRecv.mPassword;
         if (username != null && password != null) {
-            onProceedNext(SetupData.CHECK_AUTODISCOVER, mFragment);
+            onProceedNext(SetupDataFragment.CHECK_AUTODISCOVER, mFragment);
         }
     }
 
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         // If authentication failed, exit immediately (to re-enter credentials)
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.AUTODISCOVER_AUTHENTICATION) {
@@ -190,7 +190,7 @@
      * If the checked settings are OK, proceed to outgoing settings screen
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             if (mServiceInfo.usesSmtp) {
diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
index d14bb04..817f6d0 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
@@ -187,7 +187,8 @@
         mClientCertificateSelector.setHostActivity(this);
 
         final Context context = getActivity();
-        final SetupData.SetupDataContainer container = (SetupData.SetupDataContainer) context;
+        final SetupDataFragment.SetupDataContainer container =
+                (SetupDataFragment.SetupDataContainer) context;
         mSetupData = container.getSetupData();
 
         final HostAuth recvAuth = mSetupData.getAccount().mHostAuthRecv;
@@ -566,7 +567,7 @@
         }
         recvAuth.mClientCertAlias = mClientCertificateSelector.getCertificate();
 
-        mCallback.onProceedNext(SetupData.CHECK_INCOMING, this);
+        mCallback.onProceedNext(SetupDataFragment.CHECK_INCOMING, this);
         clearButtonBounce();
     }
 
@@ -590,7 +591,7 @@
      * Implements AccountCheckSettingsFragment.Callbacks
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         final AccountSetupIncoming activity = (AccountSetupIncoming) getActivity();
         activity.onAutoDiscoverComplete(result, setupData);
diff --git a/src/com/android/email/activity/setup/AccountSetupNames.java b/src/com/android/email/activity/setup/AccountSetupNames.java
index b901fec..b7c6476 100644
--- a/src/com/android/email/activity/setup/AccountSetupNames.java
+++ b/src/com/android/email/activity/setup/AccountSetupNames.java
@@ -59,9 +59,9 @@
     private boolean mRequiresName = true;
     private boolean mIsCompleting = false;
 
-    public static void actionSetNames(Activity fromActivity, SetupData setupData) {
+    public static void actionSetNames(Activity fromActivity, SetupDataFragment setupData) {
         ForwardingIntent intent = new ForwardingIntent(fromActivity, AccountSetupNames.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -108,8 +108,8 @@
 
         final int flowMode = mSetupData.getFlowMode();
 
-        if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
-                && flowMode != SetupData.FLOW_MODE_EDIT) {
+        if (flowMode != SetupDataFragment.FLOW_MODE_FORCE_CREATE
+                && flowMode != SetupDataFragment.FLOW_MODE_EDIT) {
             final String accountEmail = account.mEmailAddress;
             mDescription.setText(accountEmail);
 
@@ -127,8 +127,8 @@
         } else {
             if (account.getSenderName() != null) {
                 mName.setText(account.getSenderName());
-            } else if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
-                    && flowMode != SetupData.FLOW_MODE_EDIT) {
+            } else if (flowMode != SetupDataFragment.FLOW_MODE_FORCE_CREATE
+                    && flowMode != SetupDataFragment.FLOW_MODE_EDIT) {
                 // Attempt to prefill the name field from the profile if we don't have it,
                 prefillNameFromProfile();
             }
@@ -138,7 +138,7 @@
         validateFields();
 
         // Proceed immediately if in account creation mode
-        if (flowMode == SetupData.FLOW_MODE_FORCE_CREATE) {
+        if (flowMode == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             onNext();
         }
     }
@@ -189,9 +189,9 @@
     }
 
     private void finishActivity() {
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_NO_ACCOUNTS) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_NO_ACCOUNTS) {
             AccountSetupBasics.actionAccountCreateFinishedWithResult(this);
-        } else if (mSetupData.getFlowMode() != SetupData.FLOW_MODE_NORMAL) {
+        } else if (mSetupData.getFlowMode() != SetupDataFragment.FLOW_MODE_NORMAL) {
             AccountSetupBasics.actionAccountCreateFinishedAccountFlow(this);
         } else {
             final Account account = mSetupData.getAccount();
diff --git a/src/com/android/email/activity/setup/AccountSetupOptions.java b/src/com/android/email/activity/setup/AccountSetupOptions.java
index faf63ce..5c26ad2 100644
--- a/src/com/android/email/activity/setup/AccountSetupOptions.java
+++ b/src/com/android/email/activity/setup/AccountSetupOptions.java
@@ -76,9 +76,9 @@
     /** Default sync window for new EAS accounts */
     private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_1_WEEK;
 
-    public static void actionOptions(Activity fromActivity, SetupData setupData) {
+    public static void actionOptions(Activity fromActivity, SetupDataFragment setupData) {
         final Intent intent = new ForwardingIntent(fromActivity, AccountSetupOptions.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -149,7 +149,7 @@
         if (mIsProcessing) {
             // We are already processing, so just show the dialog until we finish
             showCreateAccountDialog();
-        } else if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
+        } else if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             // If we are just visiting here to fill in details, exit immediately
             onDone();
         }
diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoing.java b/src/com/android/email/activity/setup/AccountSetupOutgoing.java
index 52bfdf2..c7570cf 100644
--- a/src/com/android/email/activity/setup/AccountSetupOutgoing.java
+++ b/src/com/android/email/activity/setup/AccountSetupOutgoing.java
@@ -42,9 +42,9 @@
     private Button mNextButton;
     /* package */ boolean mNextButtonEnabled;
 
-    public static void actionOutgoingSettings(Activity fromActivity, SetupData setupData) {
+    public static void actionOutgoingSettings(Activity fromActivity, SetupDataFragment setupData) {
         Intent intent = new Intent(fromActivity, AccountSetupOutgoing.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -110,7 +110,7 @@
      * If the checked settings are OK, proceed to options screen
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             AccountSetupOptions.actionOptions(this, mSetupData);
diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
index a64f0ab..a8e7717 100644
--- a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
@@ -387,7 +387,7 @@
         sendAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
         sendAuth.mDomain = null;
 
-        mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this);
+        mCallback.onProceedNext(SetupDataFragment.CHECK_OUTGOING, this);
         clearButtonBounce();
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupType.java b/src/com/android/email/activity/setup/AccountSetupType.java
index c40dcb5..1b2a7ad 100644
--- a/src/com/android/email/activity/setup/AccountSetupType.java
+++ b/src/com/android/email/activity/setup/AccountSetupType.java
@@ -47,9 +47,9 @@
 
     private boolean mButtonPressed;
 
-    public static void actionSelectAccountType(Activity fromActivity, SetupData setupData) {
+    public static void actionSelectAccountType(Activity fromActivity, SetupDataFragment setupData) {
         final Intent i = new ForwardingIntent(fromActivity, AccountSetupType.class);
-        i.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(i);
     }
 
@@ -60,7 +60,7 @@
 
         final String accountType = mSetupData.getFlowAccountType();
         // If we're in account setup flow mode, see if there's just one protocol that matches
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_ACCOUNT_MANAGER) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_ACCOUNT_MANAGER) {
             int matches = 0;
             String protocol = null;
             for (EmailServiceInfo info: EmailServiceUtils.getServiceInfoList(this)) {
@@ -126,10 +126,11 @@
         final HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
         final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, recvAuth.mProtocol);
         if (info.usesAutodiscover) {
-            mSetupData.setCheckSettingsMode(SetupData.CHECK_AUTODISCOVER);
+            mSetupData.setCheckSettingsMode(SetupDataFragment.CHECK_AUTODISCOVER);
         } else {
             mSetupData.setCheckSettingsMode(
-                    SetupData.CHECK_INCOMING | (info.usesSmtp ? SetupData.CHECK_OUTGOING : 0));
+                    SetupDataFragment.CHECK_INCOMING |
+                            (info.usesSmtp ? SetupDataFragment.CHECK_OUTGOING : 0));
         }
         recvAuth.mLogin = recvAuth.mLogin + "@" + recvAuth.mAddress;
         AccountSetupBasics.setDefaultsForProtocol(this, account);
diff --git a/src/com/android/email/activity/setup/SetupData.java b/src/com/android/email/activity/setup/SetupData.java
deleted file mode 100644
index fc680db..0000000
--- a/src/com/android/email/activity/setup/SetupData.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.accounts.AccountAuthenticatorResponse;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
-
-public class SetupData implements Parcelable {
-    // The "extra" name for the Bundle saved with SetupData
-    public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
-
-    // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
-    // Settings -> Accounts
-    public static final int FLOW_MODE_UNSPECIFIED = -1;
-    public static final int FLOW_MODE_NORMAL = 0;
-    public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
-    public static final int FLOW_MODE_EDIT = 3;
-    public static final int FLOW_MODE_FORCE_CREATE = 4;
-    // The following two modes are used to "pop the stack" and return from the setup flow.  We
-    // either return to the caller (if we're in an account type flow) or go to the message list
-    public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
-    public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
-    public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
-    public static final int FLOW_MODE_NO_ACCOUNTS = 8;
-
-    // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
-    public static final int CHECK_INCOMING = 1;
-    public static final int CHECK_OUTGOING = 2;
-    public static final int CHECK_AUTODISCOVER = 4;
-
-    // All access will be through getters/setters
-    private int mFlowMode = FLOW_MODE_NORMAL;
-    private String mFlowAccountType;
-    private Account mAccount;
-    private String mUsername;
-    private String mPassword;
-    private int mCheckSettingsMode = 0;
-    private boolean mAllowAutodiscover = true;
-    private Policy mPolicy;
-    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
-
-    public interface SetupDataContainer {
-        public SetupData getSetupData();
-        public void setSetupData(SetupData setupData);
-    }
-
-    public SetupData() {
-        mPolicy = null;
-        mAllowAutodiscover = true;
-        mCheckSettingsMode = 0;
-        mAccount = new Account();
-        mUsername = null;
-        mPassword = null;
-        mAccountAuthenticatorResponse = null;
-    }
-
-    public SetupData(int flowMode) {
-        this();
-        mFlowMode = flowMode;
-    }
-
-    public SetupData(int flowMode, String accountType) {
-        this(flowMode);
-        mFlowAccountType = accountType;
-    }
-
-    public SetupData(int flowMode, Account account) {
-        this(flowMode);
-        mAccount = account;
-    }
-
-    public int getFlowMode() {
-        return mFlowMode;
-    }
-
-    public String getFlowAccountType() {
-        return mFlowAccountType;
-    }
-
-    public void setFlowMode(int flowMode) {
-        mFlowMode = flowMode;
-    }
-
-    public Account getAccount() {
-        return mAccount;
-    }
-
-    public void setAccount(Account account) {
-        mAccount = account;
-    }
-
-    public String getUsername() {
-        return mUsername;
-    }
-
-    public void setUsername(String username) {
-        mUsername = username;
-    }
-
-    public String getPassword() {
-        return mPassword;
-    }
-
-    public void setPassword(String password) {
-        mPassword = password;
-    }
-
-    public void setCheckSettingsMode(int checkSettingsMode) {
-        mCheckSettingsMode = checkSettingsMode;
-    }
-
-    public boolean isCheckIncoming() {
-        return (mCheckSettingsMode & CHECK_INCOMING) != 0;
-    }
-
-    public boolean isCheckOutgoing() {
-        return (mCheckSettingsMode & CHECK_OUTGOING) != 0;
-    }
-    public boolean isCheckAutodiscover() {
-        return (mCheckSettingsMode & CHECK_AUTODISCOVER) != 0;
-    }
-    public boolean isAllowAutodiscover() {
-        return mAllowAutodiscover;
-    }
-
-    public void setAllowAutodiscover(boolean mAllowAutodiscover) {
-        mAllowAutodiscover = mAllowAutodiscover;
-    }
-
-    public Policy getPolicy() {
-        return mPolicy;
-    }
-
-    public void setPolicy(Policy policy) {
-        mPolicy = policy;
-        mAccount.mPolicy = policy;
-    }
-
-    public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
-        return mAccountAuthenticatorResponse;
-    }
-
-    public void setAccountAuthenticatorResponse(AccountAuthenticatorResponse response) {
-        mAccountAuthenticatorResponse = response;
-    }
-
-    // Parcelable methods
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    public static final Parcelable.Creator<SetupData> CREATOR =
-            new Parcelable.Creator<SetupData>() {
-        @Override
-        public SetupData createFromParcel(Parcel in) {
-            return new SetupData(in);
-        }
-
-        @Override
-        public SetupData[] newArray(int size) {
-            return new SetupData[size];
-        }
-    };
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mFlowMode);
-        dest.writeParcelable(mAccount, 0);
-        dest.writeString(mUsername);
-        dest.writeString(mPassword);
-        dest.writeInt(mCheckSettingsMode);
-        dest.writeInt(mAllowAutodiscover ? 1 : 0);
-        dest.writeParcelable(mPolicy, 0);
-        dest.writeParcelable(mAccountAuthenticatorResponse, 0);
-    }
-
-    public SetupData(Parcel in) {
-        final ClassLoader loader = getClass().getClassLoader();
-        mFlowMode = in.readInt();
-        mAccount = in.readParcelable(loader);
-        mUsername = in.readString();
-        mPassword = in.readString();
-        mCheckSettingsMode = in.readInt();
-        mAllowAutodiscover = in.readInt() == 1;
-        mPolicy = in.readParcelable(loader);
-        mAccountAuthenticatorResponse = in.readParcelable(loader);
-    }
-
-    public String debugString() {
-        final StringBuilder sb = new StringBuilder("SetupData");
-        sb.append(":acct=");
-        sb.append(mAccount == null ? "none" :mAccount.mId);
-        if (mUsername != null) {
-            sb.append(":user=");
-            sb.append(mUsername);
-        }
-        if (mPassword != null) {
-            sb.append(":pass=");
-            sb.append(mPassword);
-        }
-        sb.append(":a/d=");
-        sb.append(mAllowAutodiscover);
-        sb.append(":check=");
-        if (isCheckIncoming()) sb.append("in+");
-        if (isCheckOutgoing()) sb.append("out+");
-        if (isCheckAutodiscover()) sb.append("a/d");
-        sb.append(":policy=");
-        sb.append(mPolicy == null ? "none" : "exists");
-        return sb.toString();
-    }
-}
diff --git a/src/com/android/email/activity/setup/SetupDataFragment.java b/src/com/android/email/activity/setup/SetupDataFragment.java
new file mode 100644
index 0000000..9dc2839
--- /dev/null
+++ b/src/com/android/email/activity/setup/SetupDataFragment.java
@@ -0,0 +1,265 @@
+package com.android.email.activity.setup;
+
+import android.accounts.AccountAuthenticatorResponse;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.Policy;
+
+/**
+ * Headless fragment to hold setup data for the account setup or settings flows
+ */
+public class SetupDataFragment extends Fragment implements Parcelable {
+    // The "extra" name for the Bundle saved with SetupData
+    public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
+
+    // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
+    // Settings -> Accounts
+    public static final int FLOW_MODE_UNSPECIFIED = -1;
+    public static final int FLOW_MODE_NORMAL = 0;
+    public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
+    public static final int FLOW_MODE_EDIT = 3;
+    public static final int FLOW_MODE_FORCE_CREATE = 4;
+    // The following two modes are used to "pop the stack" and return from the setup flow.  We
+    // either return to the caller (if we're in an account type flow) or go to the message list
+    public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
+    public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
+    public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
+    public static final int FLOW_MODE_NO_ACCOUNTS = 8;
+
+    // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
+    public static final int CHECK_INCOMING = 1;
+    public static final int CHECK_OUTGOING = 2;
+    public static final int CHECK_AUTODISCOVER = 4;
+
+    private static final String SAVESTATE_FLOWMODE = "flowMode";
+    private static final String SAVESTATE_FLOWACCOUNTTYPE = "flowAccountType";
+    private static final String SAVESTATE_ACCOUNT = "account";
+    private static final String SAVESTATE_USERNAME = "username";
+    private static final String SAVESTATE_PASSWORD = "password";
+    private static final String SAVESTATE_CHECKSETTINGSMODE = "checkSettingsMode";
+    private static final String SAVESTATE_ALLOWAUTODISCOVER = "allowAutoDiscover";
+    private static final String SAVESTATE_POLICY = "policy";
+    private static final String SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE =
+            "accountAuthenticatorResponse";
+
+    // All access will be through getters/setters
+    private int mFlowMode = FLOW_MODE_NORMAL;
+    private String mFlowAccountType;
+    private Account mAccount;
+    private String mUsername;
+    private String mPassword;
+    private int mCheckSettingsMode = 0;
+    private boolean mAllowAutodiscover = true;
+    private Policy mPolicy;
+    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
+
+    public interface SetupDataContainer {
+        public SetupDataFragment getSetupData();
+        public void setSetupData(SetupDataFragment setupData);
+    }
+
+    public SetupDataFragment() {
+        mPolicy = null;
+        mAllowAutodiscover = true;
+        mCheckSettingsMode = 0;
+        mAccount = new Account();
+        mUsername = null;
+        mPassword = null;
+        mAccountAuthenticatorResponse = null;
+    }
+
+    public SetupDataFragment(int flowMode) {
+        this();
+        mFlowMode = flowMode;
+    }
+
+    public SetupDataFragment(int flowMode, String accountType) {
+        this(flowMode);
+        mFlowAccountType = accountType;
+    }
+
+    public SetupDataFragment(int flowMode, Account account) {
+        this(flowMode);
+        mAccount = account;
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(SAVESTATE_FLOWMODE, mFlowMode);
+        outState.putString(SAVESTATE_FLOWACCOUNTTYPE, mFlowAccountType);
+        outState.putParcelable(SAVESTATE_ACCOUNT, mAccount);
+        outState.putString(SAVESTATE_USERNAME, mUsername);
+        outState.putString(SAVESTATE_PASSWORD, mPassword);
+        outState.putInt(SAVESTATE_CHECKSETTINGSMODE, mCheckSettingsMode);
+        outState.putBoolean(SAVESTATE_ALLOWAUTODISCOVER, mAllowAutodiscover);
+        outState.putParcelable(SAVESTATE_POLICY, mPolicy);
+        outState.putParcelable(SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE,
+                mAccountAuthenticatorResponse);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) {
+            mFlowMode = savedInstanceState.getInt(SAVESTATE_FLOWMODE);
+            mFlowAccountType = savedInstanceState.getString(SAVESTATE_FLOWACCOUNTTYPE);
+            mAccount = savedInstanceState.getParcelable(SAVESTATE_ACCOUNT);
+            mUsername = savedInstanceState.getString(SAVESTATE_USERNAME);
+            mPassword = savedInstanceState.getString(SAVESTATE_PASSWORD);
+            mCheckSettingsMode = savedInstanceState.getInt(SAVESTATE_CHECKSETTINGSMODE);
+            mAllowAutodiscover = savedInstanceState.getBoolean(SAVESTATE_ALLOWAUTODISCOVER);
+            mPolicy = savedInstanceState.getParcelable(SAVESTATE_POLICY);
+            mAccountAuthenticatorResponse =
+                    savedInstanceState.getParcelable(SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE);
+        }
+        setRetainInstance(true);
+    }
+
+    // Getters and setters
+    public int getFlowMode() {
+        return mFlowMode;
+    }
+
+    public void setFlowMode(int flowMode) {
+        mFlowMode = flowMode;
+    }
+
+    public String getFlowAccountType() {
+        return mFlowAccountType;
+    }
+
+    public void setFlowAccountType(String flowAccountType) {
+        mFlowAccountType = flowAccountType;
+    }
+
+    public Account getAccount() {
+        return mAccount;
+    }
+
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    public String getUsername() {
+        return mUsername;
+    }
+
+    public void setUsername(String username) {
+        mUsername = username;
+    }
+
+    public String getPassword() {
+        return mPassword;
+    }
+
+    public void setPassword(String password) {
+        mPassword = password;
+    }
+
+    public int getCheckSettingsMode() {
+        return mCheckSettingsMode;
+    }
+
+    public void setCheckSettingsMode(int checkSettingsMode) {
+        mCheckSettingsMode = checkSettingsMode;
+    }
+
+    public boolean isAllowAutodiscover() {
+        return mAllowAutodiscover;
+    }
+
+    public void setAllowAutodiscover(boolean allowAutodiscover) {
+        mAllowAutodiscover = allowAutodiscover;
+    }
+
+    public Policy getPolicy() {
+        return mPolicy;
+    }
+
+    public void setPolicy(Policy policy) {
+        mPolicy = policy;
+    }
+
+    public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
+        return mAccountAuthenticatorResponse;
+    }
+
+    public void setAccountAuthenticatorResponse(
+            AccountAuthenticatorResponse accountAuthenticatorResponse) {
+        mAccountAuthenticatorResponse = accountAuthenticatorResponse;
+    }
+
+    // Parcelable methods
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Parcelable.Creator<SetupDataFragment> CREATOR =
+            new Parcelable.Creator<SetupDataFragment>() {
+                @Override
+                public SetupDataFragment createFromParcel(Parcel in) {
+                    return new SetupDataFragment(in);
+                }
+
+                @Override
+                public SetupDataFragment[] newArray(int size) {
+                    return new SetupDataFragment[size];
+                }
+            };
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mFlowMode);
+        dest.writeString(mFlowAccountType);
+        dest.writeParcelable(mAccount, 0);
+        dest.writeString(mUsername);
+        dest.writeString(mPassword);
+        dest.writeInt(mCheckSettingsMode);
+        dest.writeInt(mAllowAutodiscover ? 1 : 0);
+        dest.writeParcelable(mPolicy, 0);
+        dest.writeParcelable(mAccountAuthenticatorResponse, 0);
+    }
+
+    public SetupDataFragment(Parcel in) {
+        final ClassLoader loader = getClass().getClassLoader();
+        mFlowMode = in.readInt();
+        mFlowAccountType = in.readString();
+        mAccount = in.readParcelable(loader);
+        mUsername = in.readString();
+        mPassword = in.readString();
+        mCheckSettingsMode = in.readInt();
+        mAllowAutodiscover = in.readInt() == 1;
+        mPolicy = in.readParcelable(loader);
+        mAccountAuthenticatorResponse = in.readParcelable(loader);
+    }
+
+    public String debugString() {
+        final StringBuilder sb = new StringBuilder("SetupData");
+        sb.append(":acct=");
+        sb.append(mAccount == null ? "none" :mAccount.mId);
+        if (mUsername != null) {
+            sb.append(":user=");
+            sb.append(mUsername);
+        }
+        if (mPassword != null) {
+            sb.append(":pass=");
+            sb.append(mPassword);
+        }
+        sb.append(":a/d=");
+        sb.append(mAllowAutodiscover);
+        sb.append(":check=");
+        if ((mCheckSettingsMode & CHECK_INCOMING) != 0) sb.append("in+");
+        if ((mCheckSettingsMode & CHECK_OUTGOING) != 0) sb.append("out+");
+        if ((mCheckSettingsMode & CHECK_AUTODISCOVER) != 0) sb.append("a/d");
+        sb.append(":policy=");
+        sb.append(mPolicy == null ? "none" : "exists");
+        return sb.toString();
+    }
+
+}
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
index fdcc630..9cd77af 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
@@ -27,7 +27,7 @@
 import com.android.email.R;
 import com.android.email.activity.setup.AccountSetupIncoming;
 import com.android.email.activity.setup.AccountSetupIncomingFragment;
-import com.android.email.activity.setup.SetupData;
+import com.android.email.activity.setup.SetupDataFragment;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.HostAuth;
 
@@ -190,18 +190,15 @@
      */
     private Intent getTestIntent(String storeUriString)
             throws URISyntaxException {
-        Account account = new Account();
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthRecv(context);
+        final Account account = new Account();
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthRecv(context);
         HostAuth.setHostAuthFromString(auth, storeUriString);
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(SetupData.EXTRA_SETUP_DATA, new SetupData(SetupData.FLOW_MODE_NORMAL, account));
-
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.putExtras(extras);
-
-        return intent;
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java b/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
index 745c19f..cd27d44 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
@@ -164,13 +164,16 @@
      */
     private Intent getTestIntent(String name, String storeUri)
             throws URISyntaxException {
-        Account account = new Account();
+        final Account account = new Account();
         account.setSenderName(name);
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthRecv(context);
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthRecv(context);
         HostAuth.setHostAuthFromString(auth, storeUri);
-        SetupData setupData = new SetupData(SetupData.FLOW_MODE_NORMAL, account);
-        return new Intent(Intent.ACTION_MAIN);
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
index e4f6b3a..985e8a4 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
@@ -26,7 +26,7 @@
 import com.android.email.R;
 import com.android.email.activity.setup.AccountSetupOutgoing;
 import com.android.email.activity.setup.AccountSetupOutgoingFragment;
-import com.android.email.activity.setup.SetupData;
+import com.android.email.activity.setup.SetupDataFragment;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.HostAuth;
 
@@ -185,13 +185,15 @@
      */
     private Intent getTestIntent(String senderUriString)
             throws URISyntaxException {
-        Account account = new Account();
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthSend(context);
+        final Account account = new Account();
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthSend(context);
         HostAuth.setHostAuthFromString(auth, senderUriString);
-        // TODO: we need to do something with this SetupData, add it as an extra in the intent?
-        SetupData setupData = new SetupData(SetupData.FLOW_MODE_NORMAL, account);
-        return new Intent(Intent.ACTION_MAIN);
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }