Fix some crashes and misbehavior with account settings screens
b/13954490 Change-Id: Ic81b342495a46573cb1fe78cad1f4888fffc4ae8
This commit is contained in:
parent
1400724647
commit
c83366c887
|
@ -51,6 +51,7 @@ import com.android.mail.providers.Folder;
|
||||||
import com.android.mail.providers.UIProvider.EditSettingsExtras;
|
import com.android.mail.providers.UIProvider.EditSettingsExtras;
|
||||||
import com.android.mail.utils.LogUtils;
|
import com.android.mail.utils.LogUtils;
|
||||||
import com.android.mail.utils.Utils;
|
import com.android.mail.utils.Utils;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -114,8 +115,9 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
private long mRequestedAccountId;
|
private long mRequestedAccountId;
|
||||||
private Header[] mAccountListHeaders;
|
private Header[] mAccountListHeaders;
|
||||||
private Header mAppPreferencesHeader;
|
private Header mAppPreferencesHeader;
|
||||||
private static final String CURRENT_FRAGMENT_TAG = "currentFragment";
|
private static final String CURRENT_SETTINGS_FRAGMENT_TAG = "currentSettingsFragment";
|
||||||
private Bundle mCurrentFragmentBundle = new Bundle(1);
|
private static final String CURRENT_SERVER_FRAGMENT_TAG = "currentServerFragment";
|
||||||
|
private Bundle mCurrentFragmentBundle = new Bundle(2);
|
||||||
private long mDeletingAccountId = -1;
|
private long mDeletingAccountId = -1;
|
||||||
private boolean mShowDebugMenu;
|
private boolean mShowDebugMenu;
|
||||||
private List<Header> mGeneratedHeaders;
|
private List<Header> mGeneratedHeaders;
|
||||||
|
@ -373,9 +375,9 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
final Fragment currentFragment = getCurrentFragment();
|
final AccountServerBaseFragment accountServerFragment = getAccountServerFragment();
|
||||||
if (currentFragment instanceof AccountServerBaseFragment) {
|
if (accountServerFragment != null) {
|
||||||
if (((AccountServerBaseFragment) currentFragment).haveSettingsChanged()) {
|
if (accountServerFragment.haveSettingsChanged()) {
|
||||||
UnsavedChangesDialogFragment dialogFragment =
|
UnsavedChangesDialogFragment dialogFragment =
|
||||||
UnsavedChangesDialogFragment.newInstanceForBack();
|
UnsavedChangesDialogFragment.newInstanceForBack();
|
||||||
dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
|
dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
|
||||||
|
@ -558,9 +560,8 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
@Override
|
@Override
|
||||||
public void onHeaderClick(Header header, int position) {
|
public void onHeaderClick(Header header, int position) {
|
||||||
// special case when exiting the server settings fragments
|
// special case when exiting the server settings fragments
|
||||||
final Fragment currentFragment = getCurrentFragment();
|
final AccountServerBaseFragment accountServerFragment = getAccountServerFragment();
|
||||||
if ((currentFragment instanceof AccountServerBaseFragment)
|
if ((accountServerFragment != null) && accountServerFragment.haveSettingsChanged()) {
|
||||||
&& (((AccountServerBaseFragment)currentFragment).haveSettingsChanged())) {
|
|
||||||
UnsavedChangesDialogFragment dialogFragment =
|
UnsavedChangesDialogFragment dialogFragment =
|
||||||
UnsavedChangesDialogFragment.newInstanceForHeader(position);
|
UnsavedChangesDialogFragment.newInstanceForHeader(position);
|
||||||
dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
|
dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
|
||||||
|
@ -605,24 +606,39 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
|
|
||||||
if (f instanceof AccountSettingsFragment) {
|
if (f instanceof AccountSettingsFragment) {
|
||||||
final AccountSettingsFragment asf = (AccountSettingsFragment) f;
|
final AccountSettingsFragment asf = (AccountSettingsFragment) f;
|
||||||
|
getFragmentManager()
|
||||||
|
.putFragment(mCurrentFragmentBundle, CURRENT_SETTINGS_FRAGMENT_TAG, f);
|
||||||
asf.setCallback(mAccountSettingsFragmentCallback);
|
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.
|
// Possibly uninteresting fragment, such as a dialog.
|
||||||
return;
|
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
|
// When we're changing fragments, enable/disable the add account button
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Fragment getCurrentFragment() {
|
@VisibleForTesting
|
||||||
|
protected AccountSettingsFragment getSettingsFragment() {
|
||||||
try {
|
try {
|
||||||
return getFragmentManager().getFragment(mCurrentFragmentBundle, CURRENT_FRAGMENT_TAG);
|
return (AccountSettingsFragment)
|
||||||
|
getFragmentManager().getFragment(mCurrentFragmentBundle,
|
||||||
|
CURRENT_SETTINGS_FRAGMENT_TAG);
|
||||||
} catch (final IllegalStateException e) {
|
} 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;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -681,8 +697,10 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
@Override
|
@Override
|
||||||
public void onCheckSettingsComplete() {
|
public void onCheckSettingsComplete() {
|
||||||
dismissCheckSettingsFragment();
|
dismissCheckSettingsFragment();
|
||||||
final AccountServerBaseFragment f = (AccountServerBaseFragment) getCurrentFragment();
|
final AccountServerBaseFragment f = getAccountServerFragment();
|
||||||
f.saveSettings();
|
if (f != null) {
|
||||||
|
f.saveSettings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -718,8 +736,10 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
@Override
|
@Override
|
||||||
public void onSecurityRequiredDialogResult(boolean ok) {
|
public void onSecurityRequiredDialogResult(boolean ok) {
|
||||||
if (ok) {
|
if (ok) {
|
||||||
final AccountServerBaseFragment f = (AccountServerBaseFragment) getCurrentFragment();
|
final AccountServerBaseFragment f = getAccountServerFragment();
|
||||||
f.saveSettings();
|
if (f != null) {
|
||||||
|
f.saveSettings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// else just stay here
|
// else just stay here
|
||||||
}
|
}
|
||||||
|
@ -731,7 +751,7 @@ public class AccountSettings extends PreferenceActivity implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCheckSettingsErrorDialogEditCertificate() {
|
public void onCheckSettingsErrorDialogEditCertificate() {
|
||||||
final Fragment f = getCurrentFragment();
|
final AccountServerBaseFragment f = getAccountServerFragment();
|
||||||
if (f instanceof AccountSetupIncomingFragment) {
|
if (f instanceof AccountSetupIncomingFragment) {
|
||||||
AccountSetupIncomingFragment asif = (AccountSetupIncomingFragment) f;
|
AccountSetupIncomingFragment asif = (AccountSetupIncomingFragment) f;
|
||||||
asif.onCertificateRequested();
|
asif.onCertificateRequested();
|
||||||
|
|
|
@ -449,6 +449,13 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment
|
||||||
onUseSslChanged(sslSelected);
|
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 static class SaveSettingsLoader extends MailAsyncTaskLoader<Boolean> {
|
||||||
private final SetupDataFragment mSetupData;
|
private final SetupDataFragment mSetupData;
|
||||||
private final boolean mSettingsMode;
|
private final boolean mSettingsMode;
|
||||||
|
|
|
@ -21,14 +21,11 @@ import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.PreferenceFragment;
|
|
||||||
import android.test.ActivityInstrumentationTestCase2;
|
import android.test.ActivityInstrumentationTestCase2;
|
||||||
import android.test.suitebuilder.annotation.MediumTest;
|
import android.test.suitebuilder.annotation.MediumTest;
|
||||||
import android.test.suitebuilder.annotation.Suppress;
|
import android.test.suitebuilder.annotation.Suppress;
|
||||||
|
|
||||||
import com.android.email.activity.setup.AccountSettings;
|
|
||||||
import com.android.emailcommon.provider.Account;
|
import com.android.emailcommon.provider.Account;
|
||||||
import com.android.emailcommon.provider.HostAuth;
|
|
||||||
|
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
@ -131,7 +128,7 @@ public class AccountSettingsTests extends ActivityInstrumentationTestCase2<Accou
|
||||||
|
|
||||||
runTestOnUiThread(new Runnable() {
|
runTestOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
PreferenceFragment f = (PreferenceFragment) theActivity.getCurrentFragment();
|
AccountSettingsFragment f = theActivity.getSettingsFragment();
|
||||||
mCheckFrequency =
|
mCheckFrequency =
|
||||||
(ListPreference) f.findPreference(PREFERENCE_FREQUENCY);
|
(ListPreference) f.findPreference(PREFERENCE_FREQUENCY);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue