From 95901cc9da7ab4ab1f16d61718cecac053cd9e33 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Thu, 9 Feb 2023 11:40:20 +0100 Subject: [PATCH] Fix log view navigation in Android TV --- .../activities/LogviewActivity.java | 30 +++++++++++++++++++ .../fragments/LogviewFragment.java | 8 +++++ app/src/main/res/layout/logview_fragment.xml | 1 + 3 files changed, 39 insertions(+) diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/LogviewActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/LogviewActivity.java index 6488d991..0228750f 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/LogviewActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/LogviewActivity.java @@ -20,9 +20,11 @@ package com.emanuelef.remote_capture.activities; import android.os.Bundle; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import androidx.annotation.NonNull; import androidx.core.view.MenuProvider; @@ -35,6 +37,7 @@ import com.emanuelef.remote_capture.Log; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.fragments.LogviewFragment; +import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; public class LogviewActivity extends BaseActivity implements MenuProvider { @@ -107,6 +110,33 @@ public class LogviewActivity extends BaseActivity implements MenuProvider { } } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + // This is required to properly handle the DPAD down press on Android TV, to properly + // focus the tab content + if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { + View view = getCurrentFocus(); + + Log.d(TAG, "onKeyDown focus " + view.getClass().getName()); + + if (view instanceof TabLayout.TabView) { + int pos = mPager.getCurrentItem(); + View focusOverride = null; + + Log.d(TAG, "TabLayout.TabView focus pos " + pos); + + focusOverride = findViewById(R.id.scrollView); + + if (focusOverride != null) { + focusOverride.requestFocus(); + return true; + } + } + } + + return super.onKeyDown(keyCode, event); + } + @Override public void onCreateMenu(@NonNull Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.log_menu, menu); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/LogviewFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/LogviewFragment.java index 593e09af..0bf51e50 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/LogviewFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/LogviewFragment.java @@ -31,6 +31,7 @@ import androidx.fragment.app.Fragment; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.ReversedLinesFileReader; +import com.emanuelef.remote_capture.Utils; import java.io.File; import java.io.IOException; @@ -64,6 +65,13 @@ public class LogviewFragment extends Fragment { mLogPath = args.getString("path"); assert(mLogPath != null); + if(Utils.isTv(view.getContext())) { + // necessary to make scroll work on TV + // but disables ability to select and copy the textview contents + ViewGroup layout = view.findViewById(R.id.scrollView); + layout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + } + mLogView = view.findViewById(R.id.log); reloadLog(); } diff --git a/app/src/main/res/layout/logview_fragment.xml b/app/src/main/res/layout/logview_fragment.xml index 7cfc799a..450a2ca5 100644 --- a/app/src/main/res/layout/logview_fragment.xml +++ b/app/src/main/res/layout/logview_fragment.xml @@ -1,5 +1,6 @@