Ensure the UI which impelemts by TwoPanelSettingsLib can
enter corresponding fragment by mouse primary key
Bug: 230555866
Change-Id: I84b7b5ceb2dfd735d724101a2ef9a4c8922d67c7
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SettingsPreferenceFragment.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SettingsPreferenceFragment.java
index 58ceda8..ea76be9 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SettingsPreferenceFragment.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SettingsPreferenceFragment.java
@@ -30,9 +30,11 @@
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -116,6 +118,23 @@
PreferenceViewHolder vh = super.onCreateViewHolder(parent, viewType);
vh.itemView.setStateListAnimator(AnimatorInflater.loadStateListAnimator(
getContext(), R.animator.preference));
+ vh.itemView.setOnTouchListener((v, e) -> {
+ if (e.getActionMasked() == MotionEvent.ACTION_DOWN
+ && isPrimaryKey(e.getButtonState())) {
+ vh.itemView.requestFocus();
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ } else if (e.getActionMasked() == MotionEvent.ACTION_UP
+ && isPrimaryKey(e.getButtonState())) {
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ }
+ return false;
+ });
+ vh.itemView.setFocusable(true);
+ vh.itemView.setFocusableInTouchMode(true);
return vh;
}
};
@@ -204,4 +223,11 @@
protected int getPageId() {
return TvSettingsEnums.PAGE_CLASSIC_DEFAULT;
}
+
+ // check if such motion event should translate to key event DPAD_CENTER
+ private boolean isPrimaryKey(int buttonState) {
+ return buttonState == MotionEvent.BUTTON_PRIMARY
+ || buttonState == MotionEvent.BUTTON_STYLUS_PRIMARY
+ || buttonState == 0; // motion events which creates by UI Automator
+ }
}