From be90a42c57d41480f2e612fd5e138a956b32f2d7 Mon Sep 17 00:00:00 2001
From: Ray <154766448+damontecres@users.noreply.github.com>
Date: Tue, 3 Mar 2026 13:46:55 -0500
Subject: [PATCH] Various fixes (#1030)
## Description
Fixes several small issues throughout the app
- Adds 1440p as a resolution option
- Removes the delay when d-pad seeking on the seek bar & reduces it
slightly when controls are hidden
- Fixes padding one home customize pages
- Adds a title to the search for dialog
### Related issues
Fixes #1017
### Testing
Emulator mostly
## Screenshots
N/A
## AI or LLM usage
None
---
.../wholphin/WholphinDreamService.kt | 23 +++++++++-------
.../wholphin/ui/components/AppScreensaver.kt | 1 +
.../wholphin/ui/components/Dialogs.kt | 3 +++
.../ui/detail/search/SearchForDialog.kt | 26 ++++++++++++-------
.../ui/main/settings/HomeSettingsPage.kt | 1 +
.../wholphin/ui/playback/SeekAcceleration.kt | 2 +-
.../wholphin/ui/playback/SeekBar.kt | 12 ++-------
.../wholphin/ui/util/StreamFormatting.kt | 24 ++++++++---------
app/src/main/jni/event.cpp | 1 +
app/src/main/res/values/strings.xml | 1 +
.../wholphin/test/FormattingTests.kt | 23 ++++++++++++++++
11 files changed, 75 insertions(+), 42 deletions(-)
create mode 100644 app/src/test/java/com/github/damontecres/wholphin/test/FormattingTests.kt
diff --git a/app/src/main/java/com/github/damontecres/wholphin/WholphinDreamService.kt b/app/src/main/java/com/github/damontecres/wholphin/WholphinDreamService.kt
index 1c0e4e0e..4d77c3a8 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/WholphinDreamService.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/WholphinDreamService.kt
@@ -23,6 +23,7 @@ import com.github.damontecres.wholphin.services.ScreensaverService
import com.github.damontecres.wholphin.services.UserPreferencesService
import com.github.damontecres.wholphin.ui.components.AppScreensaverContent
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
+import com.github.damontecres.wholphin.ui.util.ProvideLocalClock
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import javax.inject.Inject
@@ -69,16 +70,18 @@ class WholphinDreamService :
}
prefs?.let { prefs ->
WholphinTheme(appThemeColors = prefs.appPreferences.interfacePreferences.appThemeColors) {
- val screensaverPrefs =
- prefs.appPreferences.interfacePreferences.screensaverPreference
- val currentItem by itemFlow.collectAsState(null)
- AppScreensaverContent(
- currentItem = currentItem,
- showClock = screensaverPrefs.showClock,
- duration = screensaverPrefs.duration.milliseconds,
- animate = screensaverPrefs.animate,
- modifier = Modifier.fillMaxSize(),
- )
+ ProvideLocalClock {
+ val screensaverPrefs =
+ prefs.appPreferences.interfacePreferences.screensaverPreference
+ val currentItem by itemFlow.collectAsState(null)
+ AppScreensaverContent(
+ currentItem = currentItem,
+ showClock = screensaverPrefs.showClock,
+ duration = screensaverPrefs.duration.milliseconds,
+ animate = screensaverPrefs.animate,
+ modifier = Modifier.fillMaxSize(),
+ )
+ }
}
}
}
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/AppScreensaver.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/AppScreensaver.kt
index e55a2aa6..d26675b1 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/AppScreensaver.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/AppScreensaver.kt
@@ -165,6 +165,7 @@ fun AppScreensaverContent(
) {
Text(
text = currentItem?.title ?: "",
+ color = MaterialTheme.colorScheme.onSurface,
style = MaterialTheme.typography.displaySmall,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/Dialogs.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/Dialogs.kt
index a1f2362a..a96bc859 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/Dialogs.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/Dialogs.kt
@@ -656,6 +656,9 @@ fun chooseStream(
)
add(
DialogItem(
+ leadingContent = {
+ SelectedLeadingContent(currentIndex == TrackIndex.ONLY_FORCED)
+ },
headlineContent = {
Text(text = stringResource(R.string.only_forced_subtitles))
},
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/search/SearchForDialog.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/search/SearchForDialog.kt
index 6717527e..09df419c 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/search/SearchForDialog.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/search/SearchForDialog.kt
@@ -32,6 +32,7 @@ import androidx.compose.ui.input.key.type
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
@@ -91,10 +92,25 @@ fun SearchForContent(
}
}
}
+ val titleRes =
+ remember {
+ when (searchType) {
+ BaseItemKind.BOX_SET -> R.string.collections
+ BaseItemKind.PLAYLIST -> R.string.playlists
+ else -> null
+ }
+ }
+ val title = titleRes?.let { stringResource(it) } ?: ""
Column(
verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = modifier,
) {
+ Text(
+ text = stringResource(R.string.search_for, title),
+ style = MaterialTheme.typography.titleLarge,
+ textAlign = TextAlign.Center,
+ modifier = Modifier.fillMaxWidth(),
+ )
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxWidth(),
@@ -190,16 +206,8 @@ fun SearchForContent(
text = stringResource(R.string.no_results),
)
} else {
- val titleRes =
- remember {
- when (searchType) {
- BaseItemKind.BOX_SET -> R.string.collections
- BaseItemKind.PLAYLIST -> R.string.playlists
- else -> null
- }
- }
ItemRow(
- title = titleRes?.let { stringResource(it) } ?: "",
+ title = "",
items = st.items,
onClickItem = { _, item -> onClick.invoke(item) },
onLongClickItem = { _, _ -> },
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt
index 1185f719..fb025c02 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt
@@ -240,6 +240,7 @@ fun HomeSettingsPage(
onClick = { type ->
addRow { viewModel.addFavoriteRow(type) }
},
+ modifier = destModifier,
)
}
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekAcceleration.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekAcceleration.kt
index 1349a642..6925d5cc 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekAcceleration.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekAcceleration.kt
@@ -1,6 +1,6 @@
package com.github.damontecres.wholphin.ui.playback
-internal const val HOLD_TO_SEEK_REPEAT_START_COUNT = 12
+internal const val HOLD_TO_SEEK_REPEAT_START_COUNT = 8
/**
* Shared seek acceleration profile for hold-to-seek behavior.
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekBar.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekBar.kt
index e34d91af..92c6114b 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekBar.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SeekBar.kt
@@ -182,14 +182,10 @@ fun SeekBarDisplay(
KeyEventType.KeyDown -> {
val repeatCount = event.nativeKeyEvent.repeatCount
if (repeatCount > 0) {
- if (repeatCount < HOLD_TO_SEEK_REPEAT_START_COUNT) {
- leftHandledByRepeat = false
- return@onPreviewKeyEvent true
- }
leftHandledByRepeat = true
onLeft.invoke(
calculateSeekAccelerationMultiplier(
- repeatCount = repeatCount - HOLD_TO_SEEK_REPEAT_START_COUNT,
+ repeatCount = repeatCount,
durationMs = durationMs,
),
)
@@ -217,14 +213,10 @@ fun SeekBarDisplay(
KeyEventType.KeyDown -> {
val repeatCount = event.nativeKeyEvent.repeatCount
if (repeatCount > 0) {
- if (repeatCount < HOLD_TO_SEEK_REPEAT_START_COUNT) {
- rightHandledByRepeat = false
- return@onPreviewKeyEvent true
- }
rightHandledByRepeat = true
onRight.invoke(
calculateSeekAccelerationMultiplier(
- repeatCount = repeatCount - HOLD_TO_SEEK_REPEAT_START_COUNT,
+ repeatCount = repeatCount,
durationMs = durationMs,
),
)
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/util/StreamFormatting.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/util/StreamFormatting.kt
index ff4e62da..ca6e4027 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/util/StreamFormatting.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/util/StreamFormatting.kt
@@ -27,18 +27,18 @@ object StreamFormatting {
resolutionString(height, width, interlaced)
} else {
when {
- width <= 256 && height <= 144 -> "144" + interlaced(interlaced)
- width <= 426 && height <= 240 -> "240" + interlaced(interlaced)
- width <= 640 && height <= 360 -> "360" + interlaced(interlaced)
- width <= 682 && height <= 384 -> "384" + interlaced(interlaced)
- width <= 720 && height <= 404 -> "404" + interlaced(interlaced)
- width <= 854 && height <= 480 -> "480" + interlaced(interlaced)
- width <= 960 && height <= 544 -> "540" + interlaced(interlaced)
- width <= 1024 && height <= 576 -> "576" + interlaced(interlaced)
- width <= 1280 && height <= 962 -> "720" + interlaced(interlaced)
- width <= 2560 && height <= 1440 -> "1080" + interlaced(interlaced)
- width <= 4096 && height <= 3072 -> "4K"
- width <= 8192 && height <= 6144 -> "8K"
+ width > 5120 || height > 4320 -> "8K"
+ width > 2560 || height > 1440 -> "4K"
+ width > 1920 || height > 1080 -> "1440" + interlaced(interlaced)
+ width > 1280 || height > 962 -> "1080" + interlaced(interlaced)
+ width > 1024 || height > 576 -> "720" + interlaced(interlaced)
+ width > 960 || height > 544 -> "576" + interlaced(interlaced)
+ width > 845 || height > 480 -> "540" + interlaced(interlaced)
+ width > 720 || height > 404 -> "480" + interlaced(interlaced)
+ width > 682 || height > 384 -> "404" + interlaced(interlaced)
+ width > 640 || height > 360 -> "384" + interlaced(interlaced)
+ width > 426 || height > 240 -> "360" + interlaced(interlaced)
+ width > 256 || height > 144 -> "240" + interlaced(interlaced)
else -> height.toString() + interlaced(interlaced)
}
}
diff --git a/app/src/main/jni/event.cpp b/app/src/main/jni/event.cpp
index b092b661..26c69300 100644
--- a/app/src/main/jni/event.cpp
+++ b/app/src/main/jni/event.cpp
@@ -107,6 +107,7 @@ void *event_thread(void *arg)
case MPV_EVENT_END_FILE:
mp_end_file = (mpv_event_end_file*)mp_event->data;
sendEndFileEventToJava(env, mp_end_file);
+ break;
default:
ALOGV("event: %s\n", mpv_event_name(mp_event->event_id));
sendEventToJava(env, mp_event->event_id);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cc1ebf9d..c7a2fb92 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -718,5 +718,6 @@
Mixer
Creator
Artist
+ Search %s
diff --git a/app/src/test/java/com/github/damontecres/wholphin/test/FormattingTests.kt b/app/src/test/java/com/github/damontecres/wholphin/test/FormattingTests.kt
new file mode 100644
index 00000000..b0a8810f
--- /dev/null
+++ b/app/src/test/java/com/github/damontecres/wholphin/test/FormattingTests.kt
@@ -0,0 +1,23 @@
+package com.github.damontecres.wholphin.test
+
+import com.github.damontecres.wholphin.ui.util.StreamFormatting.resolutionString
+import org.junit.Assert
+import org.junit.Test
+
+class FormattingTests {
+ @Test
+ fun testResolutionStrings() {
+ Assert.assertEquals("4K", resolutionString(3840, 2160, false))
+ Assert.assertEquals("1080p", resolutionString(1920, 1080, false))
+ Assert.assertEquals("720p", resolutionString(1280, 720, false))
+ Assert.assertEquals("480i", resolutionString(640, 480, true))
+
+ Assert.assertEquals("576p", resolutionString(1024, 576, false))
+ Assert.assertEquals("576p", resolutionString(960, 576, false))
+
+ // 21:9
+ Assert.assertEquals("1080p", resolutionString(1920, 822, false))
+
+ Assert.assertEquals("1440p", resolutionString(2560, 1440, false))
+ }
+}