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);
+ }
+ }
+ });
+ }
}
/**