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
This commit is contained in:
@@ -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;
|
||||
|
||||
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;
|
||||
// TODO: Update Call Settings based on airplane mode state.
|
||||
|
||||
/**
|
||||
* 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());
|
||||
}
|
||||
}
|
||||
} 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();
|
||||
}
|
||||
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);
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user