Skip to content

Commit 50174db

Browse files
authored
Updates to the playback debug overlay (#1290)
## Description Lots of minor changes to the debug overlay - Adjusts the size and layout - Smaller font size - Only shows selected tracks by default - Expanding tracks are scrollable and don't cover controls - Show (estimated) network bitrate - Show heap memory usage - Better controls/chapters/queue animations - Minor optimizations Dev note: There's lots of code reorganization too ### Related issues Related to #1216 Related to #528 ### Testing Emulator & nvidia shield ## Screenshots ### Selected tracks <img width="1280" height="720" alt="overlay1 Large" src="https://github.com/user-attachments/assets/e6ef71f5-73ef-4947-8b2a-0f41f64ef019" /> ### Expanded tracks, scrolled down <img width="1280" height="720" alt="overlay2 Large" src="https://github.com/user-attachments/assets/2e655f7e-7331-42dd-a572-0173b06563a8" /> ### Transcode info <img width="1280" height="720" alt="overlay3 Large" src="https://github.com/user-attachments/assets/3081e2ec-bb9e-422c-b833-c22785c649bf" /> ## AI or LLM usage None
1 parent 0f9d458 commit 50174db

26 files changed

Lines changed: 1589 additions & 1013 deletions
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.github.damontecres.wholphin.ui.components
2+
3+
import androidx.compose.foundation.focusable
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.height
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.remember
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.focus.FocusRequester
11+
import androidx.compose.ui.focus.focusRequester
12+
import androidx.compose.ui.focus.onFocusChanged
13+
import androidx.compose.ui.unit.dp
14+
15+
/**
16+
* An invisible, no size Box which can be focused.
17+
*
18+
* Used to allow for transitioning to restore hidden content
19+
*/
20+
@Composable
21+
fun HiddenFocusBox(
22+
focusRequester: FocusRequester = remember { FocusRequester() },
23+
onFocus: () -> Unit,
24+
) = Box(
25+
modifier =
26+
Modifier
27+
.fillMaxWidth()
28+
.height(1.dp)
29+
.focusRequester(focusRequester)
30+
.onFocusChanged {
31+
if (it.isFocused) onFocus.invoke()
32+
}.focusable(),
33+
)

app/src/main/java/com/github/damontecres/wholphin/ui/detail/collection/CollectionDetails.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import androidx.compose.animation.fadeIn
77
import androidx.compose.animation.fadeOut
88
import androidx.compose.animation.slideInVertically
99
import androidx.compose.animation.slideOutVertically
10-
import androidx.compose.foundation.focusable
1110
import androidx.compose.foundation.layout.Arrangement
1211
import androidx.compose.foundation.layout.Box
1312
import androidx.compose.foundation.layout.Column
@@ -50,6 +49,7 @@ import com.github.damontecres.wholphin.ui.components.DialogParams
5049
import com.github.damontecres.wholphin.ui.components.DialogPopup
5150
import com.github.damontecres.wholphin.ui.components.ErrorMessage
5251
import com.github.damontecres.wholphin.ui.components.HeaderUtils
52+
import com.github.damontecres.wholphin.ui.components.HiddenFocusBox
5353
import com.github.damontecres.wholphin.ui.components.LoadingPage
5454
import com.github.damontecres.wholphin.ui.components.Optional
5555
import com.github.damontecres.wholphin.ui.data.AddPlaylistViewModel
@@ -363,15 +363,9 @@ fun CollectionDetailsContent(
363363
) {
364364
// This box exists so that there is something focusable above the item content
365365
// allowing focus to move up to restore the collection's header
366-
Box(
367-
modifier =
368-
Modifier
369-
.fillMaxWidth()
370-
.height(0.dp)
371-
.onFocusChanged {
372-
if (it.isFocused) itemsContentHasFocus = false
373-
}.focusable(),
374-
)
366+
HiddenFocusBox {
367+
itemsContentHasFocus = false
368+
}
375369
if (state.viewOptions.cardViewOptions.showDetails) {
376370
HomePageHeader(
377371
item = focusedItem,

app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingButtons.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.damontecres.wholphin.ui.detail.music
22

33
import androidx.annotation.OptIn
4-
import androidx.compose.foundation.BorderStroke
54
import androidx.compose.foundation.background
65
import androidx.compose.foundation.focusGroup
76
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -12,7 +11,6 @@ import androidx.compose.foundation.layout.Column
1211
import androidx.compose.foundation.layout.PaddingValues
1312
import androidx.compose.foundation.layout.Row
1413
import androidx.compose.foundation.layout.fillMaxWidth
15-
import androidx.compose.foundation.layout.height
1614
import androidx.compose.foundation.layout.offset
1715
import androidx.compose.foundation.layout.size
1816
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -22,7 +20,6 @@ import androidx.compose.runtime.remember
2220
import androidx.compose.ui.Alignment
2321
import androidx.compose.ui.Modifier
2422
import androidx.compose.ui.focus.FocusRequester
25-
import androidx.compose.ui.focus.focusRequester
2623
import androidx.compose.ui.focus.onFocusChanged
2724
import androidx.compose.ui.res.stringResource
2825
import androidx.compose.ui.text.style.TextAlign
@@ -35,7 +32,6 @@ import androidx.media3.ui.compose.state.rememberPlayPauseButtonState
3532
import androidx.media3.ui.compose.state.rememberPreviousButtonState
3633
import androidx.media3.ui.compose.state.rememberRepeatButtonState
3734
import androidx.media3.ui.compose.state.rememberShuffleButtonState
38-
import androidx.tv.material3.Border
3935
import androidx.tv.material3.ClickableSurfaceDefaults
4036
import androidx.tv.material3.MaterialTheme
4137
import androidx.tv.material3.Text
@@ -45,11 +41,10 @@ import com.github.damontecres.wholphin.ui.FontAwesome
4541
import com.github.damontecres.wholphin.ui.PreviewTvSpec
4642
import com.github.damontecres.wholphin.ui.components.Button
4743
import com.github.damontecres.wholphin.ui.playback.ControllerViewState
48-
import com.github.damontecres.wholphin.ui.playback.PlaybackAction
49-
import com.github.damontecres.wholphin.ui.playback.PlaybackButton
50-
import com.github.damontecres.wholphin.ui.playback.PlaybackButtons
51-
import com.github.damontecres.wholphin.ui.playback.PlaybackDialogType
52-
import com.github.damontecres.wholphin.ui.playback.buttonSpacing
44+
import com.github.damontecres.wholphin.ui.playback.overlay.PlaybackAction
45+
import com.github.damontecres.wholphin.ui.playback.overlay.PlaybackButton
46+
import com.github.damontecres.wholphin.ui.playback.overlay.PlaybackButtons
47+
import com.github.damontecres.wholphin.ui.playback.overlay.buttonSpacing
5348
import com.github.damontecres.wholphin.ui.theme.PreviewInteractionSource
5449
import com.github.damontecres.wholphin.ui.theme.WholphinTheme
5550
import kotlin.time.Duration.Companion.seconds

app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingOverlay.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import com.github.damontecres.wholphin.ui.components.Button
5252
import com.github.damontecres.wholphin.ui.ifElse
5353
import com.github.damontecres.wholphin.ui.main.settings.MoveDirection
5454
import com.github.damontecres.wholphin.ui.playback.ControllerViewState
55-
import com.github.damontecres.wholphin.ui.playback.SeekBar
55+
import com.github.damontecres.wholphin.ui.playback.overlay.SeekBar
5656
import com.github.damontecres.wholphin.ui.preferences.MoveButton
5757
import com.github.damontecres.wholphin.ui.roundSeconds
5858
import com.github.damontecres.wholphin.ui.tryRequestFocus

app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingPage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ import com.github.damontecres.wholphin.ui.components.DialogPopup
6565
import com.github.damontecres.wholphin.ui.components.LoadingPage
6666
import com.github.damontecres.wholphin.ui.findActivity
6767
import com.github.damontecres.wholphin.ui.nav.Backdrop
68-
import com.github.damontecres.wholphin.ui.playback.BottomDialog
69-
import com.github.damontecres.wholphin.ui.playback.BottomDialogItem
7068
import com.github.damontecres.wholphin.ui.playback.PlaybackKeyHandler
7169
import com.github.damontecres.wholphin.ui.playback.isUp
70+
import com.github.damontecres.wholphin.ui.playback.overlay.BottomDialog
71+
import com.github.damontecres.wholphin.ui.playback.overlay.BottomDialogItem
7272
import com.github.damontecres.wholphin.ui.tryRequestFocus
7373
import com.github.damontecres.wholphin.util.LoadingState
7474
import org.jellyfin.sdk.model.extensions.ticks

app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDebugOverlay.kt

Lines changed: 0 additions & 144 deletions
This file was deleted.

app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ import com.github.damontecres.wholphin.data.model.TrackIndex
3636
import com.github.damontecres.wholphin.ui.AppColors
3737
import com.github.damontecres.wholphin.ui.components.SelectedLeadingContent
3838
import com.github.damontecres.wholphin.ui.indexOfFirstOrNull
39+
import com.github.damontecres.wholphin.ui.playback.overlay.BottomDialog
40+
import com.github.damontecres.wholphin.ui.playback.overlay.BottomDialogItem
41+
import com.github.damontecres.wholphin.ui.playback.overlay.PlaybackAction
3942
import com.github.damontecres.wholphin.ui.tryRequestFocus
4043
import kotlin.time.Duration
4144

@@ -65,10 +68,10 @@ data class PlaybackSettings(
6568
/**
6669
* Centralized UI component for displaying dialogs during playback
6770
*
68-
* Typically, the user will click something generating a [PlaybackAction] which translates into the
71+
* Typically, the user will click something generating a [com.github.damontecres.wholphin.ui.playback.overlay.PlaybackAction] which translates into the
6972
* [PlaybackDialogType] determining which dialog is shown by this component.
7073
*
71-
* @see PlaybackAction
74+
* @see com.github.damontecres.wholphin.ui.playback.overlay.PlaybackAction
7275
*/
7376
@Composable
7477
fun PlaybackDialog(

0 commit comments

Comments
 (0)