Use PreferenceActivity and FragmentBreadCrumbs as they offer the same capabilities now.
Also fix: 2997438 and a similar bug in Tether Settings
Show + menu item for User Dictionary
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 224aa53..738acc3 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,354 +16,61 @@
package com.android.settings;
-import android.app.Activity;
import android.app.Fragment;
-import android.content.Context;
-import android.content.Intent;
import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceScreen;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.LinearLayout;
-import android.widget.TextView;
+import android.preference.PreferenceActivity;
-import java.util.ArrayList;
+import java.util.List;
/**
* Top-level settings activity to handle single pane and double pane UI layout.
*/
-public class Settings extends Activity
- implements PreferenceFragment.OnPreferenceStartFragmentCallback,
- SettingsPreferenceFragment.OnStateListener,
+public class Settings extends PreferenceActivity implements
SettingsPreferenceFragment.FragmentStarter {
- private static final boolean DBG = false;
+ // TODO: Update Call Settings based on airplane mode state.
- private static final String TAG = "Settings";
-
- private static final String KEY_PARENT = "parent";
- private static final String KEY_CALL_SETTINGS = "call_settings";
- private static final String KEY_SYNC_SETTINGS = "sync_settings";
- private static final String KEY_SEARCH_SETTINGS = "search_settings";
- private static final String KEY_DOCK_SETTINGS = "dock_settings";
-
- private static final String KEY_OPERATOR_SETTINGS = "operator_settings";
- private static final String KEY_MANUFACTURER_SETTINGS = "manufacturer_settings";
-
- public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
-
- public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
-
- private static final String BACK_STACK_PREFS = ":settings:prefs";
-
- private View mPrefsPane;
- private View mMainPane;
- private boolean mSinglePane;
-
- private BreadCrumbs mBreadCrumbs;
-
+ /**
+ * Populate the activity with the top-level headers.
+ */
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.settings_top_level);
- mPrefsPane = findViewById(R.id.prefs);
- mMainPane = findViewById(R.id.top_level);
- mSinglePane = mMainPane == null;
- if (mSinglePane) mMainPane = mPrefsPane;
+ public void onBuildHeaders(List<Header> target) {
+ loadHeadersFromResource(R.xml.settings_headers, target);
- final Intent intent = getIntent();
- String initialFragment = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
- Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ updateHeaderList(target);
+ }
- createActionBar();
-
- if (mSinglePane) {
- if (initialFragment != null) {
- showFragment(initialFragment, initialArguments);
- } else {
- // Intent#getCompontent() lets us get Fragment name, even when the Intent is
- // given via <activity-alias>.
- //
- // e.g. When we reach here via "ChildSetting" activity-alias,
- // we should get the name here instead of targetActivity ("Settings").
- if (intent.getComponent().getClassName().equals(this.getClass().getName())) {
- showFragment(TopLevelSettings.class.getName(), null);
- } else {
- showFragment(intent.getComponent().getClassName(), intent.getExtras());
- }
+ private void updateHeaderList(List<Header> target) {
+ int i = 0;
+ while (i < target.size()) {
+ Header header = target.get(i);
+ long id = header.id;
+ if (id == R.id.dock_settings) {
+ if (!needsDockSettings())
+ target.remove(header);
+ } else if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
+ Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);
+ } else if (id == R.id.call_settings) {
+ if (!Utils.isVoiceCapable(this))
+ target.remove(header);
}
- } else {
- if (!intent.getComponent().getClassName().equals(this.getClass().getName())) {
- if (showFragment(intent.getComponent().getClassName(), intent.getExtras())) {
- mMainPane.setVisibility(View.GONE);
- }
- } else {
- Fragment topLevel = getFragmentManager().findFragmentById(R.id.top_level);
- if (topLevel != null) {
- ((TopLevelSettings) topLevel).selectFirst();
- }
- }
+ if (target.get(i) == header)
+ i++;
}
}
- private void createActionBar() {
- LayoutInflater inflater = (LayoutInflater)
- getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View customNavBar = inflater.inflate(R.layout.settings_actionbar, null, false);
- getActionBar().setCustomNavigationMode(customNavBar);
- mBreadCrumbs = (BreadCrumbs) customNavBar.findViewById(R.id.bread_crumbs);
- mBreadCrumbs.setActivity(this);
+ private boolean needsDockSettings() {
+ return getResources().getBoolean(R.bool.has_dock_settings);
}
- boolean showFragment(Preference preference) {
- if (mSinglePane) {
- startWithFragment(preference.getFragment(), preference.getExtras());
- return false;
- } else {
- mBreadCrumbs.clear();
- return showFragment(preference.getFragment(), preference.getExtras());
- }
- }
-
- private void startWithFragment(String fragmentName, Bundle args) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setClass(this, getClass());
- intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
- startActivity(intent);
- }
-
- private boolean showFragment(String fragmentClass, Bundle extras) {
- if (DBG) Log.d(TAG, "showFragment");
- Fragment f = Fragment.instantiate(this, fragmentClass, extras);
- if (f instanceof SettingsPreferenceFragment) {
- SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
- spf.setOnStateListener(this);
- spf.setFragmentStarter(this);
- }
- mBreadCrumbs.clear();
- getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
- getFragmentManager().openTransaction().replace(R.id.prefs, f).commit();
- return true;
- }
-
- private void addToBreadCrumbs(Fragment fragment) {
- final CharSequence title = ((PreferenceFragment) fragment)
- .getPreferenceScreen().getTitle();
- if (mSinglePane) {
- mBreadCrumbs.clear();
- }
- mBreadCrumbs.push(title);
- }
-
- private void removeFromBreadCrumbs(Fragment fragment) {
- mBreadCrumbs.pop(((PreferenceFragment) fragment).getPreferenceScreen().getTitle());
- mBreadCrumbs.update();
- }
-
- public void onCreated(SettingsPreferenceFragment fragment) {
- if (DBG) Log.d(TAG, "Fragment created " + fragment);
- addToBreadCrumbs(fragment);
- }
-
- public void onDestroyed(SettingsPreferenceFragment fragment) {
- Log.d(TAG, "Fragment destroyed " + fragment + " (name: " + fragment.getClass() + ")");
- }
-
- public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
- if (DBG) Log.d(TAG, "onPreferenceStartFragment");
- return startFragment(caller, pref.getFragment(), -1, pref.getExtras());
- }
-
- public boolean startFragment(
- Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
+ public boolean startFragment(Fragment caller, String fragmentClass, int requestCode,
+ Bundle extras) {
Fragment f = Fragment.instantiate(this, fragmentClass, extras);
caller.setTargetFragment(f, requestCode);
if (f instanceof SettingsPreferenceFragment) {
SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
- spf.setOnStateListener(this);
spf.setFragmentStarter(this);
}
- getFragmentManager().openTransaction().replace(R.id.prefs, f)
- .addToBackStack(BACK_STACK_PREFS).commit();
return true;
}
-
- @Override
- public void onBackPressed() {
- mBreadCrumbs.pop();
- mBreadCrumbs.update();
- super.onBackPressed();
- }
-
- public static class TopLevelSettings extends PreferenceFragment {
-
- private IconPreferenceScreen mHighlightedPreference;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.settings);
-
- updatePreferenceList();
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- updateCallSettings();
- }
-
- private void updateCallSettings() {
- Preference callSettings = findPreference(KEY_CALL_SETTINGS);
- // Might have been removed in non-voice-capable devices
- if (callSettings != null) {
- callSettings.setEnabled(!AirplaneModeEnabler.isAirplaneModeOn(getActivity()));
- }
- }
-
- private void updatePreferenceList() {
- final Activity activity = getActivity();
- PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
- Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
- if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
- && dockSettings != null) {
- parent.removePreference(dockSettings);
- }
-
- Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
- KEY_OPERATOR_SETTINGS);
- Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
- KEY_MANUFACTURER_SETTINGS);
-
- Preference callSettings = parent.findPreference(KEY_CALL_SETTINGS);
- if (!Utils.isVoiceCapable(activity) && callSettings != null) {
- parent.removePreference(callSettings);
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
- // If it is a fragment preference, replace the prefs pane in the 2 pane UI.
- final String fragmentClass = preference.getFragment();
- if (fragmentClass != null) {
- boolean showed = ((Settings) getActivity()).showFragment(preference);
- if (showed) {
- highlight(preference);
- }
- return showed;
- }
- return false;
- }
-
- void highlight(Preference preference) {
- if (mHighlightedPreference != null) {
- mHighlightedPreference.setHighlighted(false);
- }
- mHighlightedPreference = (IconPreferenceScreen) preference;
- mHighlightedPreference.setHighlighted(true);
- }
-
- void selectFirst() {
- Preference first = getPreferenceScreen().getPreference(0);
- onPreferenceTreeClick(getPreferenceScreen(), first);
- }
- }
-
- public static class BreadCrumbs extends LinearLayout implements OnClickListener {
-
- private ArrayList<CharSequence> mTitles = new ArrayList<CharSequence>();
- private TextView mLevelUpTitle;
- private TextView mCurrentLevelTitle;
- private View mDivider;
- private Activity mActivity;
-
- public BreadCrumbs(Context context) {
- this(context, null);
- }
-
- public BreadCrumbs(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public void push(CharSequence title) {
- if (mTitles.size() == 0
- || !TextUtils.equals(title, mTitles.get(mTitles.size() - 1))) {
- mTitles.add(title);
- update();
- }
- }
-
- public void pop() {
- if (mTitles.size() > 0) {
- mTitles.remove(mTitles.size() - 1);
- }
- }
-
- public void pop(CharSequence title) {
- if (mTitles.size() > 1) {
- mTitles.remove(title);
- }
- }
-
- public void clear() {
- mTitles.clear();
- }
-
- private void initNavViews() {
- if (mLevelUpTitle == null) {
- mLevelUpTitle = (TextView) findViewById(R.id.level_up_title);
- mCurrentLevelTitle = (TextView) findViewById(R.id.level_current_title);
- mDivider = findViewById(R.id.level_divider);
- if (mLevelUpTitle != null) {
- mLevelUpTitle.setOnClickListener(this);
- }
- if (mCurrentLevelTitle != null) {
- mCurrentLevelTitle.setOnClickListener(this);
- }
- }
- }
-
- public void update() {
- initNavViews();
- if (mLevelUpTitle == null) return;
-
- final int titleCount = mTitles.size();
- if (titleCount > 1) {
- mLevelUpTitle.setText(mTitles.get(titleCount - 2));
- mLevelUpTitle.setVisibility(VISIBLE);
- mDivider.setVisibility(VISIBLE);
- } else {
- mLevelUpTitle.setVisibility(GONE);
- mDivider.setVisibility(GONE);
- }
- if (titleCount > 0) {
- mCurrentLevelTitle.setText(mTitles.get(titleCount - 1));
- } else {
- mCurrentLevelTitle.setText("");
- }
- }
-
- public void setActivity(Activity activity) {
- mActivity = activity;
- }
-
- public void onClick(View v) {
- if (mActivity == null)
- return;
- if (v == mLevelUpTitle) {
- mActivity.onBackPressed();
- }
- }
- }
}