diff --git a/core/java/android/app/FragmentBreadCrumbs.java b/core/java/android/app/FragmentBreadCrumbs.java index ab0fc6659e33f..d0aa0fd605bba 100644 --- a/core/java/android/app/FragmentBreadCrumbs.java +++ b/core/java/android/app/FragmentBreadCrumbs.java @@ -58,6 +58,8 @@ public class FragmentBreadCrumbs extends ViewGroup private OnBreadCrumbClickListener mOnBreadCrumbClickListener; private int mGravity; + private int mLayoutResId; + private int mTextColor; private static final int DEFAULT_GRAVITY = Gravity.START | Gravity.CENTER_VERTICAL; @@ -103,6 +105,12 @@ public class FragmentBreadCrumbs extends ViewGroup mGravity = a.getInt(com.android.internal.R.styleable.FragmentBreadCrumbs_gravity, DEFAULT_GRAVITY); + mLayoutResId = a.getResourceId( + com.android.internal.R.styleable.FragmentBreadCrumbs_itemLayout, + com.android.internal.R.layout.fragment_bread_crumb_item); + mTextColor = a.getColor( + com.android.internal.R.styleable.FragmentBreadCrumbs_itemColor, + 0); a.recycle(); } @@ -311,12 +319,11 @@ public class FragmentBreadCrumbs extends ViewGroup } } if (i >= numViews) { - final View item = mInflater.inflate( - com.android.internal.R.layout.fragment_bread_crumb_item, - this, false); + final View item = mInflater.inflate(mLayoutResId, this, false); final TextView text = (TextView) item.findViewById(com.android.internal.R.id.title); text.setText(bse.getBreadCrumbTitle()); text.setTag(bse); + text.setTextColor(mTextColor); if (i == 0) { item.findViewById(com.android.internal.R.id.left_icon).setVisibility(View.GONE); } diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java index 23b1e2c00022c..04cd7d502f6eb 100644 --- a/core/java/android/preference/PreferenceActivity.java +++ b/core/java/android/preference/PreferenceActivity.java @@ -212,6 +212,9 @@ public abstract class PreferenceActivity extends ListActivity implements private Button mNextButton; + private int mPreferenceHeaderItemResId = 0; + private boolean mPreferenceHeaderRemoveEmptyIcon = false; + /** * The starting request code given out to preference framework. */ @@ -258,10 +261,15 @@ public abstract class PreferenceActivity extends ListActivity implements } private LayoutInflater mInflater; + private int mLayoutResId; + private boolean mRemoveIconIfEmpty; - public HeaderAdapter(Context context, List
objects) { + public HeaderAdapter(Context context, List
objects, int layoutResId, + boolean removeIconBehavior) { super(context, 0, objects); mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mLayoutResId = layoutResId; + mRemoveIconIfEmpty = removeIconBehavior; } @Override @@ -270,8 +278,7 @@ public abstract class PreferenceActivity extends ListActivity implements View view; if (convertView == null) { - view = mInflater.inflate(com.android.internal.R.layout.preference_header_item, - parent, false); + view = mInflater.inflate(mLayoutResId, parent, false); holder = new HeaderViewHolder(); holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon); holder.title = (TextView) view.findViewById(com.android.internal.R.id.title); @@ -284,7 +291,16 @@ public abstract class PreferenceActivity extends ListActivity implements // All view fields must be updated every time, because the view may be recycled Header header = getItem(position); - holder.icon.setImageResource(header.iconRes); + if (mRemoveIconIfEmpty) { + if (header.iconRes == 0) { + holder.icon.setVisibility(View.GONE); + } else { + holder.icon.setVisibility(View.VISIBLE); + holder.icon.setImageResource(header.iconRes); + } + } else { + holder.icon.setImageResource(header.iconRes); + } holder.title.setText(header.getTitle(getContext().getResources())); CharSequence summary = header.getSummary(getContext().getResources()); if (!TextUtils.isEmpty(summary)) { @@ -512,7 +528,26 @@ public abstract class PreferenceActivity extends ListActivity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(com.android.internal.R.layout.preference_list_content); + // Theming for the PreferenceActivity layout and for the Preference Header(s) layout + TypedArray sa = obtainStyledAttributes(null, + com.android.internal.R.styleable.PreferenceActivity, + com.android.internal.R.attr.preferenceActivityStyle, + 0); + + final int layoutResId = sa.getResourceId( + com.android.internal.R.styleable.PreferenceActivity_layout, + com.android.internal.R.layout.preference_list_content); + + mPreferenceHeaderItemResId = sa.getResourceId( + com.android.internal.R.styleable.PreferenceActivity_headerLayout, + com.android.internal.R.layout.preference_header_item); + mPreferenceHeaderRemoveEmptyIcon = sa.getBoolean( + com.android.internal.R.styleable.PreferenceActivity_headerRemoveIconIfEmpty, + false); + + sa.recycle(); + + setContentView(layoutResId); mListFooter = (FrameLayout)findViewById(com.android.internal.R.id.list_footer); mPrefsContainer = (ViewGroup) findViewById(com.android.internal.R.id.prefs_frame); @@ -582,7 +617,8 @@ public abstract class PreferenceActivity extends ListActivity implements showBreadCrumbs(initialTitleStr, initialShortTitleStr); } } else if (mHeaders.size() > 0) { - setListAdapter(new HeaderAdapter(this, mHeaders)); + setListAdapter(new HeaderAdapter(this, mHeaders, mPreferenceHeaderItemResId, + mPreferenceHeaderRemoveEmptyIcon)); if (!mSinglePane) { // Multi-pane. getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); diff --git a/core/res/res/layout-xlarge/breadcrumbs_in_fragment_material.xml b/core/res/res/layout-xlarge/breadcrumbs_in_fragment_material.xml new file mode 100644 index 0000000000000..6fb6df56ffa07 --- /dev/null +++ b/core/res/res/layout-xlarge/breadcrumbs_in_fragment_material.xml @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/core/res/res/layout/fragment_bread_crumb_item_material.xml b/core/res/res/layout/fragment_bread_crumb_item_material.xml new file mode 100644 index 0000000000000..ee4344f25cd33 --- /dev/null +++ b/core/res/res/layout/fragment_bread_crumb_item_material.xml @@ -0,0 +1,41 @@ + + + + + + + \ No newline at end of file diff --git a/core/res/res/layout/preference_header_item_material.xml b/core/res/res/layout/preference_header_item_material.xml new file mode 100644 index 0000000000000..594189fa6517c --- /dev/null +++ b/core/res/res/layout/preference_header_item_material.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + diff --git a/core/res/res/layout/preference_list_content_material.xml b/core/res/res/layout/preference_list_content_material.xml new file mode 100644 index 0000000000000..78567999be13f --- /dev/null +++ b/core/res/res/layout/preference_list_content_material.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +