summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorMichael Kwan <mkwan@google.com>2016-07-22 18:37:31 -0700
committerMichael Kwan <mkwan@google.com>2016-07-26 10:57:56 -0700
commit744be16ffa030cb62de13f633c124fc0e72d0181 (patch)
tree6c869f4d23383e27eb742be20733776e6f5df056 /core/java/android
parentad749416991e037fe6a875fa072c5bb8ed4c0a39 (diff)
Add titles to PreferenceFragments and PreferenceScreens for watches.
Preferences lack a title on watch type devices due to lack of ActionBar support. A custom ListView was added to use a custom wrapper adapter to add a persistent header view at the top of the ListView that developers would not be able to remove via the ListView API. Bug: 27962897 Change-Id: I6bccecf85592d9507e0c7a04c9a035617001e9ef
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/preference/PreferenceFragment.java16
-rw-r--r--core/java/android/preference/PreferenceScreen.java43
-rw-r--r--core/java/android/widget/ListView.java36
3 files changed, 83 insertions, 12 deletions
diff --git a/core/java/android/preference/PreferenceFragment.java b/core/java/android/preference/PreferenceFragment.java
index d4a3582cfbf6..73fa01e59201 100644
--- a/core/java/android/preference/PreferenceFragment.java
+++ b/core/java/android/preference/PreferenceFragment.java
@@ -27,12 +27,14 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.ListView;
+import android.widget.TextView;
/**
* Shows a hierarchy of {@link Preference} objects as
@@ -366,6 +368,20 @@ public abstract class PreferenceFragment extends Fragment implements
private void bindPreferences() {
final PreferenceScreen preferenceScreen = getPreferenceScreen();
if (preferenceScreen != null) {
+ View root = getView();
+ if (root != null) {
+ View titleView = root.findViewById(android.R.id.title);
+ if (titleView instanceof TextView) {
+ CharSequence title = preferenceScreen.getTitle();
+ if (TextUtils.isEmpty(title)) {
+ titleView.setVisibility(View.GONE);
+ } else {
+ ((TextView) titleView).setText(title);
+ titleView.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
preferenceScreen.bind(getListView());
}
onBindPreferences();
diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java
index b1317e656e3e..2305b0564e49 100644
--- a/core/java/android/preference/PreferenceScreen.java
+++ b/core/java/android/preference/PreferenceScreen.java
@@ -19,6 +19,8 @@ package android.preference;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -31,6 +33,7 @@ import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
+import android.widget.TextView;
/**
* Represents a top-level {@link Preference} that
@@ -91,13 +94,33 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi
private Dialog mDialog;
private ListView mListView;
-
+
+ private int mLayoutResId = com.android.internal.R.layout.preference_list_fragment;
+ private Drawable mDividerDrawable;
+ private boolean mDividerSpecified;
+
/**
* Do NOT use this constructor, use {@link PreferenceManager#createPreferenceScreen(Context)}.
* @hide-
*/
public PreferenceScreen(Context context, AttributeSet attrs) {
super(context, attrs, com.android.internal.R.attr.preferenceScreenStyle);
+
+ TypedArray a = context.obtainStyledAttributes(null,
+ com.android.internal.R.styleable.PreferenceScreen,
+ com.android.internal.R.attr.preferenceScreenStyle,
+ 0);
+
+ mLayoutResId = a.getResourceId(
+ com.android.internal.R.styleable.PreferenceScreen_screenLayout,
+ mLayoutResId);
+ if (a.hasValueOrEmpty(com.android.internal.R.styleable.PreferenceScreen_divider)) {
+ mDividerDrawable =
+ a.getDrawable(com.android.internal.R.styleable.PreferenceScreen_divider);
+ mDividerSpecified = true;
+ }
+
+ a.recycle();
}
/**
@@ -163,18 +186,30 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View childPrefScreen = inflater.inflate(
- com.android.internal.R.layout.preference_list_fragment, null);
+ View childPrefScreen = inflater.inflate(mLayoutResId, null);
+ View titleView = childPrefScreen.findViewById(android.R.id.title);
mListView = (ListView) childPrefScreen.findViewById(android.R.id.list);
+ if (mDividerSpecified) {
+ mListView.setDivider(mDividerDrawable);
+ }
+
bind(mListView);
// Set the title bar if title is available, else no title bar
final CharSequence title = getTitle();
Dialog dialog = mDialog = new Dialog(context, context.getThemeResId());
if (TextUtils.isEmpty(title)) {
+ if (titleView != null) {
+ titleView.setVisibility(View.GONE);
+ }
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
} else {
- dialog.setTitle(title);
+ if (titleView instanceof TextView) {
+ ((TextView) titleView).setText(title);
+ titleView.setVisibility(View.VISIBLE);
+ } else {
+ dialog.setTitle(title);
+ }
}
dialog.setContentView(childPrefScreen);
dialog.setOnDismissListener(this);
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 8f908fb85444..b0f19d7a0b49 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -112,8 +112,8 @@ public class ListView extends AbsListView {
public boolean isSelectable;
}
- private ArrayList<FixedViewInfo> mHeaderViewInfos = Lists.newArrayList();
- private ArrayList<FixedViewInfo> mFooterViewInfos = Lists.newArrayList();
+ ArrayList<FixedViewInfo> mHeaderViewInfos = Lists.newArrayList();
+ ArrayList<FixedViewInfo> mFooterViewInfos = Lists.newArrayList();
Drawable mDivider;
int mDividerHeight;
@@ -279,7 +279,7 @@ public class ListView extends AbsListView {
// Wrap the adapter if it wasn't already wrapped.
if (mAdapter != null) {
if (!(mAdapter instanceof HeaderViewListAdapter)) {
- mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
+ wrapHeaderListAdapterInternal();
}
// In the case of re-adding a header view, or adding one later on,
@@ -373,7 +373,7 @@ public class ListView extends AbsListView {
// Wrap the adapter if it wasn't already wrapped.
if (mAdapter != null) {
if (!(mAdapter instanceof HeaderViewListAdapter)) {
- mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
+ wrapHeaderListAdapterInternal();
}
// In the case of re-adding a footer view, or adding one later on,
@@ -476,7 +476,7 @@ public class ListView extends AbsListView {
mRecycler.clear();
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
- mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
+ mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}
@@ -2228,7 +2228,7 @@ public class ListView extends AbsListView {
* after the header views.
*/
public void setSelectionAfterHeaderView() {
- final int count = mHeaderViewInfos.size();
+ final int count = getHeaderViewsCount();
if (count > 0) {
mNextSelectedPosition = 0;
return;
@@ -3356,7 +3356,7 @@ public class ListView extends AbsListView {
bounds.right = mRight - mLeft - mPaddingRight;
final int count = getChildCount();
- final int headerCount = mHeaderViewInfos.size();
+ final int headerCount = getHeaderViewsCount();
final int itemCount = mItemCount;
final int footerLimit = (itemCount - mFooterViewInfos.size());
final boolean headerDividers = mHeaderDividersEnabled;
@@ -3940,7 +3940,7 @@ public class ListView extends AbsListView {
if (drawDividers) {
final boolean fillForMissingDividers = isOpaque() && !super.isOpaque();
final int itemCount = mItemCount;
- final int headerCount = mHeaderViewInfos.size();
+ final int headerCount = getHeaderViewsCount();
final int footerLimit = (itemCount - mFooterViewInfos.size());
final boolean isHeader = (itemIndex < headerCount);
final boolean isFooter = (itemIndex >= footerLimit);
@@ -4052,4 +4052,24 @@ public class ListView extends AbsListView {
encoder.addProperty("recycleOnMeasure", recycleOnMeasure());
}
+
+ /** @hide */
+ protected HeaderViewListAdapter wrapHeaderListAdapterInternal(
+ ArrayList<ListView.FixedViewInfo> headerViewInfos,
+ ArrayList<ListView.FixedViewInfo> footerViewInfos,
+ ListAdapter adapter) {
+ return new HeaderViewListAdapter(headerViewInfos, footerViewInfos, adapter);
+ }
+
+ /** @hide */
+ protected void wrapHeaderListAdapterInternal() {
+ mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, mAdapter);
+ }
+
+ /** @hide */
+ protected void dispatchDataSetObserverOnChangedInternal() {
+ if (mDataSetObserver != null) {
+ mDataSetObserver.onChanged();
+ }
+ }
}