Fix search highlighting items

Bug: 24576551
Change-Id: I0a6c251cc93eef9f49070f2b7e57780d4542dd03
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 34c773a..f79def9 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -27,8 +27,11 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceGroupAdapter;
 import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.util.Log;
@@ -38,7 +41,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
-
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.widget.FloatingActionButton;
 
@@ -50,7 +52,7 @@
 public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceFragment
         implements DialogCreatable {
 
-    private static final String TAG = "SettingsPreferenceFragment";
+    private static final String TAG = "SettingsPreference";
 
     private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600;
 
@@ -65,7 +67,6 @@
 
     private String mPreferenceKey;
     private boolean mPreferenceHighlighted = false;
-    private Drawable mHighlightDrawable;
 
     private RecyclerView.Adapter mCurrentRootAdapter;
     private boolean mIsDataSetObserverRegistered = false;
@@ -85,6 +86,8 @@
 
     private LayoutPreference mFooter;
     private View mEmptyView;
+    private LinearLayoutManager mLayoutManager;
+    private HighlightablePreferenceGroupAdapter mAdapter;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -216,13 +219,6 @@
         updateEmptyView();
     }
 
-    private Drawable getHighlightDrawable() {
-        if (mHighlightDrawable == null) {
-            mHighlightDrawable = getActivity().getDrawable(R.drawable.preference_highlight);
-        }
-        return mHighlightDrawable;
-    }
-
     public LayoutPreference getHeaderView() {
         return mHeader;
     }
@@ -314,41 +310,30 @@
         return -1;
     }
 
-    private void highlightPreference(String key) {
-        final Drawable highlight = getHighlightDrawable();
+    @Override
+    public RecyclerView.LayoutManager onCreateLayoutManager() {
+        mLayoutManager = new LinearLayoutManager(getContext());
+        return mLayoutManager;
+    }
 
+    @Override
+    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
+        mAdapter = new HighlightablePreferenceGroupAdapter(preferenceScreen);
+        return mAdapter;
+    }
+
+    private void highlightPreference(String key) {
         final int position = canUseListViewForHighLighting(key);
         if (position >= 0) {
             mPreferenceHighlighted = true;
+            mLayoutManager.scrollToPosition(position);
 
-            // TODO: Need to find a way to scroll to and highlight search items now
-            // that we are using RecyclerView instead.
-//            final RecyclerView listView = getListView();
-//            final RecyclerView.Adapter adapter = listView.getAdapter();
-//
-////            ((PreferenceGroupAdapter) adapter).setHighlightedDrawable(highlight);
-////            ((PreferenceGroupAdapter) adapter).setHighlighted(position);
-//
-//            listView.post(new Runnable() {
-//                @Override
-//                public void run() {
-//                    listView.setSelection(position);
-//                    listView.postDelayed(new Runnable() {
-//                        @Override
-//                        public void run() {
-//                            final int index = position - listView.getFirstVisiblePosition();
-//                            if (index >= 0 && index < listView.getChildCount()) {
-//                                final View v = listView.getChildAt(index);
-//                                final int centerX = v.getWidth() / 2;
-//                                final int centerY = v.getHeight() / 2;
-//                                highlight.setHotspot(centerX, centerY);
-//                                v.setPressed(true);
-//                                v.setPressed(false);
-//                            }
-//                        }
-//                    }, DELAY_HIGHLIGHT_DURATION_MILLIS);
-//                }
-//            });
+            getView().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    mAdapter.highlight(position);
+                }
+            }, DELAY_HIGHLIGHT_DURATION_MILLIS);
         }
     }
 
@@ -647,4 +632,34 @@
             return false;
         }
     }
+
+    public static class HighlightablePreferenceGroupAdapter extends PreferenceGroupAdapter {
+
+        private int mHighlightPosition = -1;
+
+        public HighlightablePreferenceGroupAdapter(PreferenceGroup preferenceGroup) {
+            super(preferenceGroup);
+        }
+
+        public void highlight(int position) {
+            mHighlightPosition = position;
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public void onBindViewHolder(PreferenceViewHolder holder, int position) {
+            super.onBindViewHolder(holder, position);
+            if (position == mHighlightPosition) {
+                View v = holder.itemView;
+                if (v.getBackground() != null) {
+                    final int centerX = v.getWidth() / 2;
+                    final int centerY = v.getHeight() / 2;
+                    v.getBackground().setHotspot(centerX, centerY);
+                }
+                v.setPressed(true);
+                v.setPressed(false);
+                mHighlightPosition = -1;
+            }
+        }
+    }
 }