diff --git a/src/com/android/email/activity/setup/AccountSettings.java b/src/com/android/email/activity/setup/AccountSettings.java index 21be482be..ddd2de64a 100644 --- a/src/com/android/email/activity/setup/AccountSettings.java +++ b/src/com/android/email/activity/setup/AccountSettings.java @@ -51,6 +51,7 @@ import com.android.mail.providers.Folder; import com.android.mail.providers.UIProvider.EditSettingsExtras; import com.android.mail.utils.LogUtils; import com.android.mail.utils.Utils; +import com.google.common.annotations.VisibleForTesting; import java.util.List; @@ -114,8 +115,9 @@ public class AccountSettings extends PreferenceActivity implements private long mRequestedAccountId; private Header[] mAccountListHeaders; private Header mAppPreferencesHeader; - private static final String CURRENT_FRAGMENT_TAG = "currentFragment"; - private Bundle mCurrentFragmentBundle = new Bundle(1); + private static final String CURRENT_SETTINGS_FRAGMENT_TAG = "currentSettingsFragment"; + private static final String CURRENT_SERVER_FRAGMENT_TAG = "currentServerFragment"; + private Bundle mCurrentFragmentBundle = new Bundle(2); private long mDeletingAccountId = -1; private boolean mShowDebugMenu; private List
mGeneratedHeaders; @@ -373,9 +375,9 @@ public class AccountSettings extends PreferenceActivity implements */ @Override public void onBackPressed() { - final Fragment currentFragment = getCurrentFragment(); - if (currentFragment instanceof AccountServerBaseFragment) { - if (((AccountServerBaseFragment) currentFragment).haveSettingsChanged()) { + final AccountServerBaseFragment accountServerFragment = getAccountServerFragment(); + if (accountServerFragment != null) { + if (accountServerFragment.haveSettingsChanged()) { UnsavedChangesDialogFragment dialogFragment = UnsavedChangesDialogFragment.newInstanceForBack(); dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG); @@ -558,9 +560,8 @@ public class AccountSettings extends PreferenceActivity implements @Override public void onHeaderClick(Header header, int position) { // special case when exiting the server settings fragments - final Fragment currentFragment = getCurrentFragment(); - if ((currentFragment instanceof AccountServerBaseFragment) - && (((AccountServerBaseFragment)currentFragment).haveSettingsChanged())) { + final AccountServerBaseFragment accountServerFragment = getAccountServerFragment(); + if ((accountServerFragment != null) && accountServerFragment.haveSettingsChanged()) { UnsavedChangesDialogFragment dialogFragment = UnsavedChangesDialogFragment.newInstanceForHeader(position); dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG); @@ -605,24 +606,39 @@ public class AccountSettings extends PreferenceActivity implements if (f instanceof AccountSettingsFragment) { final AccountSettingsFragment asf = (AccountSettingsFragment) f; + getFragmentManager() + .putFragment(mCurrentFragmentBundle, CURRENT_SETTINGS_FRAGMENT_TAG, f); asf.setCallback(mAccountSettingsFragmentCallback); - } else if (!(f instanceof AccountServerBaseFragment)) { + } else if (f instanceof AccountServerBaseFragment) { + getFragmentManager() + .putFragment(mCurrentFragmentBundle, CURRENT_SERVER_FRAGMENT_TAG, f); + } else { // Possibly uninteresting fragment, such as a dialog. return; } - // By some internal witchcraft, this will persist a reference to this fragment across - // configuration changes - getFragmentManager().putFragment(mCurrentFragmentBundle, CURRENT_FRAGMENT_TAG, f); - // When we're changing fragments, enable/disable the add account button invalidateOptionsMenu(); } - public Fragment getCurrentFragment() { + @VisibleForTesting + protected AccountSettingsFragment getSettingsFragment() { try { - return getFragmentManager().getFragment(mCurrentFragmentBundle, CURRENT_FRAGMENT_TAG); + return (AccountSettingsFragment) + getFragmentManager().getFragment(mCurrentFragmentBundle, + CURRENT_SETTINGS_FRAGMENT_TAG); } catch (final IllegalStateException e) { - LogUtils.d(LogUtils.TAG, e, "Could not find current fragment, returning null"); + LogUtils.d(LogUtils.TAG, e, "Could not find current settings fragment, returning null"); + return null; + } + } + + protected AccountServerBaseFragment getAccountServerFragment() { + try { + return (AccountServerBaseFragment) + getFragmentManager().getFragment(mCurrentFragmentBundle, + CURRENT_SERVER_FRAGMENT_TAG); + } catch (final IllegalStateException e) { + LogUtils.d(LogUtils.TAG, e, "Could not find current server fragment, returning null"); return null; } } @@ -681,8 +697,10 @@ public class AccountSettings extends PreferenceActivity implements @Override public void onCheckSettingsComplete() { dismissCheckSettingsFragment(); - final AccountServerBaseFragment f = (AccountServerBaseFragment) getCurrentFragment(); - f.saveSettings(); + final AccountServerBaseFragment f = getAccountServerFragment(); + if (f != null) { + f.saveSettings(); + } } @Override @@ -718,8 +736,10 @@ public class AccountSettings extends PreferenceActivity implements @Override public void onSecurityRequiredDialogResult(boolean ok) { if (ok) { - final AccountServerBaseFragment f = (AccountServerBaseFragment) getCurrentFragment(); - f.saveSettings(); + final AccountServerBaseFragment f = getAccountServerFragment(); + if (f != null) { + f.saveSettings(); + } } // else just stay here } @@ -731,7 +751,7 @@ public class AccountSettings extends PreferenceActivity implements @Override public void onCheckSettingsErrorDialogEditCertificate() { - final Fragment f = getCurrentFragment(); + final AccountServerBaseFragment f = getAccountServerFragment(); if (f instanceof AccountSetupIncomingFragment) { AccountSetupIncomingFragment asif = (AccountSetupIncomingFragment) f; asif.onCertificateRequested(); diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java index 1a5d46de6..75432ec47 100644 --- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java @@ -449,6 +449,13 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment onUseSslChanged(sslSelected); } + @Override + public void saveSettings() { + // Reset this here so we don't get stuck on this screen + mLoadedDeletePolicy = mSetupData.getAccount().getDeletePolicy(); + super.saveSettings(); + } + private static class SaveSettingsLoader extends MailAsyncTaskLoader { private final SetupDataFragment mSetupData; private final boolean mSettingsMode; diff --git a/tests/src/com/android/email/activity/setup/AccountSettingsTests.java b/tests/src/com/android/email/activity/setup/AccountSettingsTests.java index 6735b94f9..b40514e05 100644 --- a/tests/src/com/android/email/activity/setup/AccountSettingsTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSettingsTests.java @@ -21,14 +21,11 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.preference.ListPreference; -import android.preference.PreferenceFragment; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.Suppress; -import com.android.email.activity.setup.AccountSettings; import com.android.emailcommon.provider.Account; -import com.android.emailcommon.provider.HostAuth; import java.net.URISyntaxException; @@ -131,7 +128,7 @@ public class AccountSettingsTests extends ActivityInstrumentationTestCase2