From c0c4ae1d239f30c8338f2b46ce0cacfb620f21b4 Mon Sep 17 00:00:00 2001 From: Miuzarte <982809597@qq.com> Date: Thu, 19 Mar 2026 10:16:38 +0800 Subject: [PATCH] feat: virtual button appearance control for fullscreen; building abi matrix control --- app/build.gradle.kts | 13 ++++++++++-- .../scrcpyforandroid/constants/AppDefaults.kt | 1 + .../constants/AppPreferenceKeys.kt | 1 + .../pages/FullscreenControlPage.kt | 19 ++++++++++------- .../scrcpyforandroid/pages/MainPage.kt | 10 +++++++++ .../scrcpyforandroid/pages/SettingsPage.kt | 21 +++++++++++++++++++ .../services/AppSettingsStore.kt | 6 ++++++ 7 files changed, 61 insertions(+), 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f92f8f1..44c1332 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,14 @@ plugins { alias(libs.plugins.compose.compiler) } +val defaultAbiList = listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") +val configuredAbiList = (project.findProperty("abiList") as String?) + ?.split(",") + ?.map { it.trim() } + ?.filter { it.isNotEmpty() } + ?.ifEmpty { null } + ?: defaultAbiList + android { namespace = "io.github.miuzarte.scrcpyforandroid" compileSdk { @@ -19,7 +27,8 @@ android { versionName = "0.0.1" ndk { - abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + abiFilters.clear() + abiFilters += configuredAbiList } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -29,7 +38,7 @@ android { abi { isEnable = true reset() - include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + include(*configuredAbiList.toTypedArray()) isUniversalApk = true } } diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppDefaults.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppDefaults.kt index 571f79d..c0f811f 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppDefaults.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppDefaults.kt @@ -63,6 +63,7 @@ object AppDefaults { const val DefaultMonetEnabled = false const val DefaultFullscreenDebugInfoEnabled = false + const val DefaultShowFullscreenVirtualButtons = true const val DefaultDevicePreviewCardHeightDp = 320 const val DefaultKeepScreenOnWhenStreamingEnabled = false const val DefaultVirtualButtonsOutside = "more,home,back" diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppPreferenceKeys.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppPreferenceKeys.kt index 7e5161d..4702b14 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppPreferenceKeys.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/constants/AppPreferenceKeys.kt @@ -7,6 +7,7 @@ object AppPreferenceKeys { const val ThemeBaseIndex = "theme_base_index" const val MonetEnabled = "monet_enabled" const val FullscreenDebugInfoEnabled = "fullscreen_debug_info_enabled" + const val ShowFullscreenVirtualButtons = "show_fullscreen_virtual_buttons" const val DevicePreviewCardHeightDp = "device_preview_card_height_dp" const val KeepScreenOnWhenStreamingEnabled = "keep_screen_on_when_streaming_enabled" const val VirtualButtonsOutside = "virtual_buttons_outside" diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/FullscreenControlPage.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/FullscreenControlPage.kt index defcd35..b96c365 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/FullscreenControlPage.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/FullscreenControlPage.kt @@ -41,6 +41,7 @@ fun FullscreenControlPage( virtualButtonsOutside: List, virtualButtonsInMore: List, showDebugInfo: Boolean, + showVirtualButtons: Boolean, onDismiss: () -> Unit, ) { val context = LocalContext.current @@ -150,14 +151,16 @@ fun FullscreenControlPage( }, ) - bar.Fullscreen( - modifier = Modifier.align(Alignment.BottomCenter), - onPressHaptic = { haptics.press() }, - onConfirmHaptic = { haptics.confirm() }, - onAction = { action -> - action.keycode?.let(::sendKeycode) - }, - ) + if (showVirtualButtons) { + bar.Fullscreen( + modifier = Modifier.align(Alignment.BottomCenter), + onPressHaptic = { haptics.press() }, + onConfirmHaptic = { haptics.confirm() }, + onAction = { action -> + action.keycode?.let(::sendKeycode) + }, + ) + } } } } diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/MainPage.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/MainPage.kt index a46ec25..c1f50ba 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/MainPage.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/MainPage.kt @@ -113,6 +113,9 @@ fun MainPage() { var themeBaseIndex by rememberSaveable { mutableIntStateOf(initialSettings.themeBaseIndex) } var monetEnabled by rememberSaveable { mutableStateOf(initialSettings.monetEnabled) } var fullscreenDebugInfoEnabled by rememberSaveable { mutableStateOf(initialSettings.fullscreenDebugInfoEnabled) } + var showFullscreenVirtualButtons by rememberSaveable { + mutableStateOf(initialSettings.showFullscreenVirtualButtons) + } var keepScreenOnWhenStreamingEnabled by rememberSaveable { mutableStateOf(initialSettings.keepScreenOnWhenStreamingEnabled) } @@ -178,6 +181,7 @@ fun MainPage() { themeBaseIndex, monetEnabled, fullscreenDebugInfoEnabled, + showFullscreenVirtualButtons, keepScreenOnWhenStreamingEnabled, virtualButtonsOutside, virtualButtonsInMore, @@ -195,6 +199,7 @@ fun MainPage() { themeBaseIndex = themeBaseIndex, monetEnabled = monetEnabled, fullscreenDebugInfoEnabled = fullscreenDebugInfoEnabled, + showFullscreenVirtualButtons = showFullscreenVirtualButtons, keepScreenOnWhenStreamingEnabled = keepScreenOnWhenStreamingEnabled, virtualButtonsOutside = VirtualButtonActions.encodeStoredIds(virtualButtonsOutside), virtualButtonsInMore = VirtualButtonActions.encodeStoredIds(virtualButtonsInMore), @@ -467,10 +472,14 @@ fun MainPage() { onMonetEnabledChange = { monetEnabled = it }, fullscreenDebugInfoEnabled = fullscreenDebugInfoEnabled, onFullscreenDebugInfoEnabledChange = { fullscreenDebugInfoEnabled = it }, + showFullscreenVirtualButtons = showFullscreenVirtualButtons, + onShowFullscreenVirtualButtonsChange = { showFullscreenVirtualButtons = it }, keepScreenOnWhenStreamingEnabled = keepScreenOnWhenStreamingEnabled, onKeepScreenOnWhenStreamingEnabledChange = { keepScreenOnWhenStreamingEnabled = it }, + onOpenReorderDevices = { openReorderDevicesAction?.invoke() }, + onOpenVirtualButtonOrder = { rootBackStack.add(RootScreen.VirtualButtonOrder) }, devicePreviewCardHeightDp = devicePreviewCardHeightDp, onDevicePreviewCardHeightDpChange = { devicePreviewCardHeightDp = it.coerceAtLeast(120) @@ -635,6 +644,7 @@ fun MainPage() { virtualButtonsOutside = virtualButtonsOutside, virtualButtonsInMore = virtualButtonsInMore, showDebugInfo = fullscreenDebugInfoEnabled, + showVirtualButtons = showFullscreenVirtualButtons, onDismiss = { popRoot() }, ) } diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/SettingsPage.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/SettingsPage.kt index d4d1980..9a3a181 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/SettingsPage.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/pages/SettingsPage.kt @@ -22,6 +22,7 @@ import top.yukonga.miuix.kmp.basic.IconButton import top.yukonga.miuix.kmp.basic.ScrollBehavior import top.yukonga.miuix.kmp.basic.Text import top.yukonga.miuix.kmp.basic.TextField +import top.yukonga.miuix.kmp.extra.SuperArrow import top.yukonga.miuix.kmp.extra.SuperDropdown import top.yukonga.miuix.kmp.extra.SuperSwitch import top.yukonga.miuix.kmp.theme.ColorSchemeMode @@ -60,8 +61,12 @@ fun SettingsScreen( onMonetEnabledChange: (Boolean) -> Unit, fullscreenDebugInfoEnabled: Boolean, onFullscreenDebugInfoEnabledChange: (Boolean) -> Unit, + showFullscreenVirtualButtons: Boolean, + onShowFullscreenVirtualButtonsChange: (Boolean) -> Unit, keepScreenOnWhenStreamingEnabled: Boolean, onKeepScreenOnWhenStreamingEnabledChange: (Boolean) -> Unit, + onOpenReorderDevices: () -> Unit, + onOpenVirtualButtonOrder: () -> Unit, devicePreviewCardHeightDp: Int, onDevicePreviewCardHeightDpChange: (Int) -> Unit, customServerUri: String?, @@ -106,6 +111,12 @@ fun SettingsScreen( checked = fullscreenDebugInfoEnabled, onCheckedChange = onFullscreenDebugInfoEnabledChange, ) + SuperSwitch( + title = "全屏显示虚拟按钮", + summary = "在全屏模式底部显示返回/主页等虚拟按钮", + checked = showFullscreenVirtualButtons, + onCheckedChange = onShowFullscreenVirtualButtonsChange, + ) SuperSwitch( title = "投屏时不允许息屏", summary = "Scrcpy 启动后保持本机常亮,避免锁屏导致 ADB 断开", @@ -128,6 +139,16 @@ fun SettingsScreen( raw.toIntOrNull()?.let { onDevicePreviewCardHeightDpChange(it.coerceAtLeast(120)) } }, ) + SuperArrow( + title = "调整设备排序", + summary = "调整设备页快捷设备列表顺序", + onClick = onOpenReorderDevices, + ) + SuperArrow( + title = "虚拟按钮排序", + summary = "调整底部虚拟按钮与更多菜单顺序", + onClick = onOpenVirtualButtonOrder, + ) } SectionSmallTitle(text = "scrcpy-server") diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/services/AppSettingsStore.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/services/AppSettingsStore.kt index 1d4fca2..ff478cd 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/services/AppSettingsStore.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/services/AppSettingsStore.kt @@ -9,6 +9,7 @@ internal data class MainSettings( val themeBaseIndex: Int = AppDefaults.DefaultThemeBaseIndex, val monetEnabled: Boolean = AppDefaults.DefaultMonetEnabled, val fullscreenDebugInfoEnabled: Boolean = AppDefaults.DefaultFullscreenDebugInfoEnabled, + val showFullscreenVirtualButtons: Boolean = AppDefaults.DefaultShowFullscreenVirtualButtons, val devicePreviewCardHeightDp: Int = AppDefaults.DefaultDevicePreviewCardHeightDp, val keepScreenOnWhenStreamingEnabled: Boolean = AppDefaults.DefaultKeepScreenOnWhenStreamingEnabled, val virtualButtonsOutside: String = AppDefaults.DefaultVirtualButtonsOutside, @@ -70,6 +71,10 @@ internal fun loadMainSettings(context: Context): MainSettings { AppPreferenceKeys.FullscreenDebugInfoEnabled, AppDefaults.DefaultFullscreenDebugInfoEnabled, ), + showFullscreenVirtualButtons = prefs.getBoolean( + AppPreferenceKeys.ShowFullscreenVirtualButtons, + AppDefaults.DefaultShowFullscreenVirtualButtons, + ), devicePreviewCardHeightDp = prefs.getInt( AppPreferenceKeys.DevicePreviewCardHeightDp, AppDefaults.DefaultDevicePreviewCardHeightDp, @@ -108,6 +113,7 @@ internal fun saveMainSettings(context: Context, settings: MainSettings) { putInt(AppPreferenceKeys.ThemeBaseIndex, settings.themeBaseIndex) .putBoolean(AppPreferenceKeys.MonetEnabled, settings.monetEnabled) .putBoolean(AppPreferenceKeys.FullscreenDebugInfoEnabled, settings.fullscreenDebugInfoEnabled) + .putBoolean(AppPreferenceKeys.ShowFullscreenVirtualButtons, settings.showFullscreenVirtualButtons) .putInt(AppPreferenceKeys.DevicePreviewCardHeightDp, settings.devicePreviewCardHeightDp.coerceAtLeast(120)) .putBoolean(AppPreferenceKeys.KeepScreenOnWhenStreamingEnabled, settings.keepScreenOnWhenStreamingEnabled) .putString(AppPreferenceKeys.VirtualButtonsOutside, settings.virtualButtonsOutside)