Fix some crashes and misbehavior with account settings screens

b/13954490

Change-Id: Ic81b342495a46573cb1fe78cad1f4888fffc4ae8
This commit is contained in:
Tony Mantler 2014-04-10 15:28:15 -07:00
parent 1400724647
commit c83366c887
3 changed files with 49 additions and 25 deletions

View File

@ -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<Header> 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();

View File

@ -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<Boolean> {
private final SetupDataFragment mSetupData;
private final boolean mSettingsMode;

View File

@ -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<Accou
runTestOnUiThread(new Runnable() {
public void run() {
PreferenceFragment f = (PreferenceFragment) theActivity.getCurrentFragment();
AccountSettingsFragment f = theActivity.getSettingsFragment();
mCheckFrequency =
(ListPreference) f.findPreference(PREFERENCE_FREQUENCY);
}