From 369c0b74597599a4d85c61c39ba118d2dc560f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E4=BF=8A?= <215613905@qq.com> Date: Mon, 21 Apr 2025 16:46:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=83=A8=E5=88=86=E7=9B=92?= =?UTF-8?q?=E5=AD=90=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E7=9A=84=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../osc/player/controller/VodController.java | 3 + .../tvbox/osc/ui/dialog/GridFilterDialog.java | 68 ++++++++++++++++--- gradle.properties | 2 +- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index 78aaafa2..4b684a91 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.ActivityInfo; +import android.graphics.Color; import android.os.Build; import android.os.Handler; import android.os.Message; @@ -665,6 +666,7 @@ public class VodController extends BaseController { int disPlay = Hawk.get(HawkConfig.SCREEN_DISPLAY, GONE); seekTime.setVisibility(disPlay); mPlayPauseTime.setVisibility(disPlay); + mScreenDisplay.setTextColor(disPlay==VISIBLE?getResources().getColor(R.color.color_02F8E1): Color.WHITE); mScreenDisplay.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -672,6 +674,7 @@ public class VodController extends BaseController { seekTime.setVisibility(disPlay); if(disPlay==VISIBLE)mPlayPauseTime.setVisibility(disPlay); Hawk.put(HawkConfig.SCREEN_DISPLAY, disPlay); + mScreenDisplay.setTextColor(disPlay==VISIBLE?getResources().getColor(R.color.color_02F8E1): Color.WHITE); hideBottom(); } }); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/dialog/GridFilterDialog.java b/app/src/main/java/com/github/tvbox/osc/ui/dialog/GridFilterDialog.java index e741f01a..ec870b52 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/dialog/GridFilterDialog.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/dialog/GridFilterDialog.java @@ -7,6 +7,9 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.os.Build; import android.view.Gravity; +import android.view.InputDevice; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -36,15 +39,8 @@ public class GridFilterDialog extends BaseDialog { setCancelable(true); setContentView(R.layout.dialog_grid_filter); filterRoot = findViewById(R.id.filterRoot); - UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE); - // 检查是否为电视设备 - boolean isTv = uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION - || context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION) - || !context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ - isTv=isTv || context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); - } - if(!isTv){ + + if(!isTvOrBox(context)){ View rootView = findViewById(R.id.root); rootView.setOnClickListener(new View.OnClickListener() { @Override @@ -128,4 +124,58 @@ public class GridFilterDialog extends BaseDialog { getWindow().getDecorView().setPadding(0, 0, 0, 0); getWindow().setAttributes(layoutParams); } + + public static boolean isTvOrBox(Context context) { + // SDK > Android 11 直接认为不是 TV / 机顶盒 + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + return false; + } + + PackageManager pm = context.getPackageManager(); + UiModeManager uiMode = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE); + + // 1. UiMode 判断 + if (uiMode.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { + return true; + } + + // 2. Android TV / Leanback 特性判断 + if (pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK) + || pm.hasSystemFeature("android.software.leanback_only") // Strict leanback + || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION) + // Amazon Fire TV + || pm.hasSystemFeature("amazon.hardware.fire_tv") + // Google TV (part of Android TV 家族) + || pm.hasSystemFeature("com.google.android.tv")) { + return true; + } + + // 3. 没有触摸屏:大多数机顶盒、电视不带触摸 + if (!pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { + return true; + } + + // 4. 物理遥控器 / D‑pad 键存在判断 兼容一些既有触摸也支持遥控的设备 + if (KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_UP) + && KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_DOWN) + && KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_LEFT) + && KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_RIGHT) + && KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_CENTER)) { + return true; + } + + // 5. 输入设备源中有 DPAD + int[] deviceIds = InputDevice.getDeviceIds(); + for (int id : deviceIds) { + InputDevice dev = InputDevice.getDevice(id); + if (dev == null) continue; + int sources = dev.getSources(); + if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) { + return true; + } + } + + return false; + } + } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 306a3be4..848e153d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,4 @@ android.useAndroidX=true android.enableJetifier=true IsDebug=true #build on off -org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED \ No newline at end of file +#org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED \ No newline at end of file