Fix bug #12991557 User taken to previously closed setting option

- fix behavior when we are closing the Drawer. Now will not trigger twice the same action
- fix selection in the Drawer for "Add Account": it basically should never be selected
as it is more like a button
- fix also Titles stack when launching an Intent
- remove some dead code

Change-Id: I196ad9fcd0599703f2abb902b088fbda9b4690a0
This commit is contained in:
Fabrice Di Meglio
2014-02-12 15:38:26 -08:00
parent de40d9ed2f
commit a7ad619af4

View File

@@ -405,8 +405,11 @@ public class SettingsActivity extends Activity
public void onDrawerClosed(View drawerView) {
mDrawerToggle.onDrawerClosed(drawerView);
// Cannot process clicks when the App is finishing
if (isFinishing()) return;
onHeaderClick(mSelectedHeader);
if (isFinishing() || mSelectedHeader == null) {
return;
}
switchToHeader(mSelectedHeader, false);
mSelectedHeader = null;
}
@Override
@@ -594,12 +597,8 @@ public class SettingsActivity extends Activity
// them and, depending on the screen, we may also show in-line
// the currently selected preference fragment.
if (mHeaders.size() > 0) {
if (initialFragment == null) {
Header h = onGetInitialHeader();
switchToHeader(h, false);
} else {
switchToHeader(initialFragment, initialArguments, false);
}
Header h = onGetInitialHeader();
switchToHeader(h, false);
}
}
}
@@ -785,31 +784,54 @@ public class SettingsActivity extends Activity
* @param validate true means that the fragment's Header needs to be validated
*/
private void switchToHeader(Header header, boolean validate) {
if (mCurrentHeader == header) {
// This is the header we are currently displaying. Just make sure
if (header == null) {
return;
}
if (header != null && mCurrentHeader != null && header.id == mCurrentHeader.id &&
header.id != R.id.account_add) {
// This is the header we are currently displaying (except "Add Account"). Just make sure
// to pop the stack up to its root state.
getFragmentManager().popBackStack(BACK_STACK_PREFS,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
mTitleStack.clear();
if (header.fragment == null) {
throw new IllegalStateException("can't switch to header that has no fragment");
}
switchToHeaderInner(header.fragment, header.fragmentArguments, validate);
setSelectedHeader(header);
final CharSequence title;
if (header.fragment.equals("com.android.settings.dashboard.DashboardSummary")) {
title = getResources().getString(R.string.settings_label);
if (header.fragment != null) {
mTitleStack.clear();
switchToHeaderInner(header.fragment, header.fragmentArguments, validate);
setSelectedHeader(header);
final TitlePair pair = new TitlePair(0, getHeaderTitle(header));
mTitleStack.add(pair);
setTitle(pair.second);
} else if (header.intent != null) {
setSelectedHeader(header);
mTitleStack.clear();
startActivity(header.intent);
} else {
title = header.getTitle(getResources());
throw new IllegalStateException(
"Can't switch to header that has no Fragment nor Intent");
}
final TitlePair pair = new TitlePair(0, title);
mTitleStack.add(pair);
setTitle(title);
}
}
private CharSequence getHeaderTitle(Header header) {
final CharSequence title;
if (header.fragment.equals(DashboardSummary.class.getName())) {
title = getResources().getString(R.string.settings_label);
} else {
title = header.getTitle(getResources());
}
return title;
}
private void setSelectedHeader(Header header) {
if (header == null) {
mCurrentHeader = null;
return;
}
// Update selected Header into Drawer only if it is not "Add Account"
if (header.id == R.id.account_add) {
mDrawer.clearChoices();
return;
}
mCurrentHeader = header;
int index = mHeaders.indexOf(header);
if (mDrawer != null) {
@@ -1623,24 +1645,6 @@ public class SettingsActivity extends Activity
}
}
/**
* Called when the user selects an item in the header list. The default
* implementation will call either
* {@link #startWithFragment(String, android.os.Bundle, android.app.Fragment, int, int, CharSequence)}
* or {@link #switchToHeader(com.android.settings.SettingsActivity.Header, boolean)}
* as appropriate.
*
* @param header The header that was selected.
*/
private void onHeaderClick(Header header) {
if (header == null) return;
if (header.fragment != null) {
switchToHeader(header, false);
} else if (header.intent != null) {
startActivity(header.intent);
}
}
@Override
public boolean shouldUpRecreateTask(Intent targetIntent) {
return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));