Merge "Focusing on item highlighted coming from search result" into main
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 278ede4..d7a276e 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -479,6 +479,7 @@
                 mDialogFragment.dismiss();
                 mDialogFragment = null;
             }
+            getListView().clearOnScrollListeners();
         }
         super.onDetach();
     }
diff --git a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
index a93a986..7145460 100644
--- a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
+++ b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
@@ -29,12 +29,14 @@
 import android.util.TypedValue;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceGroupAdapter;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.PreferenceViewHolder;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -159,15 +161,32 @@
         root.postDelayed(() -> {
             if (ensureHighlightPosition()) {
                 recyclerView.smoothScrollToPosition(mHighlightPosition);
+                highlightAndFocusTargetItem(recyclerView, mHighlightPosition);
             }
         }, DELAY_HIGHLIGHT_DURATION_MILLIS);
+    }
 
-        // Highlight preference after 900 milliseconds.
-        root.postDelayed(() -> {
-            if (ensureHighlightPosition()) {
-                notifyItemChanged(mHighlightPosition);
-            }
-        }, DELAY_COLLAPSE_DURATION_MILLIS + DELAY_HIGHLIGHT_DURATION_MILLIS);
+    private void highlightAndFocusTargetItem(RecyclerView recyclerView, int highlightPosition) {
+        ViewHolder target = recyclerView.findViewHolderForAdapterPosition(highlightPosition);
+        if (target != null) { // view already visible
+            notifyItemChanged(mHighlightPosition);
+            target.itemView.requestFocus();
+        } else { // otherwise we're about to scroll to that view (but we might not be scrolling yet)
+            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+                @Override
+                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                        notifyItemChanged(mHighlightPosition);
+                        ViewHolder target = recyclerView
+                                .findViewHolderForAdapterPosition(highlightPosition);
+                        if (target != null) {
+                            target.itemView.requestFocus();
+                        }
+                        recyclerView.removeOnScrollListener(this);
+                    }
+                }
+            });
+        }
     }
 
     /**