summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2014-03-03 21:55:01 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-03-03 21:55:02 +0000
commit882e6cde603de53532f219b7f7548ceea641bc26 (patch)
tree51b3c6021beedcbba0c6801d31ddc3149509113a /src
parent17d2124c1ccb1bd46393f70252d06d866646e97d (diff)
parent6d534a1da52667c6c41b723d4c203fe0d59a2676 (diff)
downloadpackages_apps_Settings-882e6cde603de53532f219b7f7548ceea641bc26.zip
packages_apps_Settings-882e6cde603de53532f219b7f7548ceea641bc26.tar.gz
packages_apps_Settings-882e6cde603de53532f219b7f7548ceea641bc26.tar.bz2
Merge "Fix Drawer selection and initial Header"
Diffstat (limited to 'src')
-rw-r--r--src/com/android/settings/SettingsActivity.java189
1 files changed, 89 insertions, 100 deletions
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index fd6c986..fa6f01a 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -199,6 +199,7 @@ public class SettingsActivity extends Activity
private Header mCurrentHeader;
private CharSequence mInitialTitle;
+ private Header mInitialHeader;
// Show only these settings for restricted users
private int[] SETTINGS_FOR_RESTRICTED = {
@@ -455,22 +456,18 @@ public class SettingsActivity extends Activity
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
- if (mDrawerToggle != null) {
- mDrawerToggle.syncState();
- }
+ mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- if (mDrawerToggle != null) {
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
+ mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
@@ -489,7 +486,7 @@ public class SettingsActivity extends Activity
DevicePolicyManager dpm =
(DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
- mHeaderAdapter= new HeaderAdapter(this, getHeaders(), mAuthenticatorHelper, dpm);
+ mHeaderAdapter= new HeaderAdapter(this, mHeaders, mAuthenticatorHelper, dpm);
mDevelopmentPreferences = getSharedPreferences(DevelopmentSettings.PREF_FILE,
Context.MODE_PRIVATE);
@@ -503,23 +500,17 @@ public class SettingsActivity extends Activity
getFragmentManager().addOnBackStackChangedListener(this);
mActionBar = getActionBar();
- if (mActionBar != null) {
- mActionBar.setDisplayHomeAsUpEnabled(true);
- mActionBar.setHomeButtonEnabled(true);
+ mActionBar.setDisplayHomeAsUpEnabled(true);
+ mActionBar.setHomeButtonEnabled(true);
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawer = (ListView) findViewById(R.id.headers_drawer);
+ mDrawer.setAdapter(mHeaderAdapter);
+ mDrawer.setOnItemClickListener(new DrawerItemClickListener());
+ mDrawer.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
- mDrawer = (ListView) findViewById(R.id.headers_drawer);
- mDrawer.setAdapter(mHeaderAdapter);
- mDrawer.setOnItemClickListener(new DrawerItemClickListener());
- mDrawer.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
-
- mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
- R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
- }
-
- String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
- Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+ R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
if (savedInstanceState != null) {
// We are restarting from a previous saved state; used that to
@@ -535,9 +526,16 @@ public class SettingsActivity extends Activity
(int) HEADER_ID_UNDEFINED);
if (curHeader >= 0 && curHeader < mHeaders.size()) {
setSelectedHeader(mHeaders.get(curHeader));
+ mInitialHeader = mCurrentHeader;
}
}
} else {
+ String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
+ Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+
+ // We need to build the Headers in all cases
+ onBuildHeaders(mHeaders);
+
if (initialFragment != null) {
// If we are just showing a fragment, we want to run in
// new fragment mode, but don't need to compute and show
@@ -546,17 +544,16 @@ public class SettingsActivity extends Activity
mInitialTitle = (initialTitleResId > 0) ? getText(initialTitleResId) : getTitle();
switchToHeader(initialFragment, initialArguments, true, mInitialTitle);
+ setSelectedHeaderByFragmentName(initialFragment);
+ mInitialHeader = mCurrentHeader;
} else {
- // We need to try to build the headers.
- onBuildHeaders(mHeaders);
-
// If there are headers, then at this point we need to show
// them and, depending on the screen, we may also show in-line
// the currently selected preference fragment.
if (mHeaders.size() > 0) {
- Header h = onGetInitialHeader();
- mInitialTitle = getHeaderTitle(h);
- switchToHeader(h, false, true);
+ mInitialHeader = onGetInitialHeader();
+ mInitialTitle = getHeaderTitle(mInitialHeader);
+ switchToHeader(mInitialHeader, false, true);
}
}
}
@@ -621,6 +618,19 @@ public class SettingsActivity extends Activity
}
}
+ public Header onGetInitialHeader() {
+ String fragmentClass = getStartingFragmentClass(super.getIntent());
+ if (fragmentClass != null) {
+ Header header = new Header();
+ header.fragment = fragmentClass;
+ header.title = getTitle();
+ header.fragmentArguments = getIntent().getExtras();
+ return header;
+ }
+
+ return mFirstHeader;
+ }
+
@Override
public void onBackStackChanged() {
setTitleFromBackStack();
@@ -649,13 +659,6 @@ public class SettingsActivity extends Activity
}
}
- /**
- * Returns the Header list
- */
- private List<Header> getHeaders() {
- return mHeaders;
- }
-
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
@@ -716,9 +719,6 @@ public class SettingsActivity extends Activity
}
}
- /**
- * @hide
- */
protected boolean isValidFragment(String fragmentName) {
// Almost all fragments are wrapped in this,
// except for a few that have their own activities.
@@ -728,41 +728,6 @@ public class SettingsActivity extends Activity
return false;
}
- /**
- * When in two-pane mode, switch to the fragment pane to show the given
- * preference fragment.
- *
- * @param header The new header to display.
- * @param validate true means that the fragment's Header needs to be validated.
- * @param initial true means that it is the initial Header.
- */
- private void switchToHeader(Header header, boolean validate, boolean initial) {
- if (header == null) {
- return;
- }
- if (header != null && mCurrentHeader != null && header.id == mCurrentHeader.id &&
- header.id != R.id.account_add &&
- !header.fragment.equals(ManageAccountsSettings.class.getName())) {
- // This is the header we are currently displaying (except "Add Account" or
- // "Corporate"/"Google" Account entries that share the same fragment). Just make sure
- // to pop the stack up to its root state.
- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- } else {
- if (header.fragment != null) {
- switchToHeaderInner(header.fragment, header.fragmentArguments, validate, !initial,
- getHeaderTitle(header));
- setSelectedHeader(header);
- } else if (header.intent != null) {
- setSelectedHeader(header);
- startActivity(header.intent);
- } else {
- throw new IllegalStateException(
- "Can't switch to header that has no Fragment nor Intent");
- }
- }
- }
-
private CharSequence getHeaderTitle(Header header) {
final CharSequence title;
if (header.fragment.equals(DashboardSummary.class.getName())) {
@@ -773,6 +738,18 @@ public class SettingsActivity extends Activity
return title;
}
+
+ private void setSelectedHeaderByFragmentName(String fragmentName) {
+ final int count = mHeaders.size();
+ for (int n = 0; n < count; n++) {
+ Header h = mHeaders.get(n);
+ if (h.fragment != null && h.fragment.equals(fragmentName)) {
+ setSelectedHeader(h);
+ return;
+ }
+ }
+ }
+
private void setSelectedHeader(Header header) {
if (header == null) {
mCurrentHeader = null;
@@ -785,34 +762,51 @@ public class SettingsActivity extends Activity
}
mCurrentHeader = header;
int index = mHeaders.indexOf(header);
- if (mDrawer != null) {
- if (index >= 0) {
- mDrawer.setItemChecked(index, true);
- } else {
- mDrawer.clearChoices();
- }
+ if (index >= 0) {
+ mDrawer.setItemChecked(index, true);
+ } else {
+ mDrawer.clearChoices();
}
}
- public Header onGetInitialHeader() {
- String fragmentClass = getStartingFragmentClass(super.getIntent());
- if (fragmentClass != null) {
- Header header = new Header();
- header.fragment = fragmentClass;
- header.title = getTitle();
- header.fragmentArguments = getIntent().getExtras();
- return header;
+ /**
+ * When in two-pane mode, switch to the fragment pane to show the given
+ * preference fragment.
+ *
+ * @param header The new header to display.
+ * @param validate true means that the fragment's Header needs to be validated.
+ * @param initial true means that it is the initial Header.
+ */
+ private void switchToHeader(Header header, boolean validate, boolean initial) {
+ if (header == null) {
+ return;
+ }
+ // For switching to another Header it should be a different one
+ if (mCurrentHeader == null || header.id != mCurrentHeader.id) {
+ if (header.fragment != null) {
+ boolean addToBackStack = !initial && header.id != mInitialHeader.id;
+ switchToHeaderInner(header.fragment, header.fragmentArguments, validate,
+ addToBackStack, getHeaderTitle(header));
+ setSelectedHeader(header);
+ } else if (header.intent != null) {
+ setSelectedHeader(header);
+ startActivity(header.intent);
+ } else {
+ throw new IllegalStateException(
+ "Can't switch to header that has no Fragment nor Intent");
+ }
}
-
- return mFirstHeader;
}
/**
* Switch the fragment pane to show the given preference fragment.
*
+ * (used for initial fragment)
+ *
* @param fragmentName The name of the fragment to display.
* @param args Optional arguments to supply to the fragment.
- * @param validate true means that the fragment's Header needs to be validated
+ * @param validate true means that the fragment's Header needs to be validated.
+ * @param title The title of the fragment to display.
*/
private void switchToHeader(String fragmentName, Bundle args, boolean validate,
CharSequence title) {
@@ -820,6 +814,9 @@ public class SettingsActivity extends Activity
switchToHeaderInner(fragmentName, args, validate, false, title);
}
+ /**
+ * Switch to a specific Header with taking care of validation, Title and BackStack
+ */
private void switchToHeaderInner(String fragmentName, Bundle args, boolean validate,
boolean addToBackStack, CharSequence title) {
getFragmentManager().popBackStack(BACK_STACK_PREFS,
@@ -1011,15 +1008,7 @@ public class SettingsActivity extends Activity
}
/**
- * Called when the activity needs its list of headers build. By
- * implementing this and adding at least one item to the list, you
- * will cause the activity to run in its modern fragment mode. Note
- * that this function may not always be called; for example, if the
- * activity has been asked to display a particular fragment without
- * the header list, there is no need to build the headers.
- *
- * <p>Typical implementations will use {@link #loadHeadersFromResource}
- * to fill in the list from a resource.
+ * Called when the activity needs its list of headers build.
*
* @param headers The list in which to place the headers.
*/