Move in-app screensaver cancellation into compose

This commit is contained in:
Niels van Velzen
2026-04-02 22:00:37 +02:00
committed by Niels van Velzen
parent c7d8790e17
commit 8415802188
2 changed files with 13 additions and 48 deletions

View File

@@ -3,7 +3,6 @@ package org.jellyfin.androidtv.ui.browsing
import android.content.Intent
import android.os.Bundle
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import androidx.activity.compose.setContent
@@ -31,7 +30,6 @@ import org.jellyfin.androidtv.ui.screensaver.InAppScreensaver
import org.jellyfin.androidtv.ui.settings.compat.MainActivitySettings
import org.jellyfin.androidtv.ui.startup.StartupActivity
import org.jellyfin.androidtv.util.applyTheme
import org.jellyfin.androidtv.util.isMediaSessionKeyEvent
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
@@ -119,22 +117,15 @@ class MainActivity : FragmentActivity() {
}
// Forward key events to fragments
private fun Fragment.onKeyEvent(keyCode: Int, event: KeyEvent?): Boolean {
var result = childFragmentManager.fragments.any { it.onKeyEvent(keyCode, event) }
if (!result && this is View.OnKeyListener) result = onKey(currentFocus, keyCode, event)
return result
}
private fun onKeyEvent(keyCode: Int, event: KeyEvent?): Boolean {
// Ignore the key event that closes the screensaver
if (interactionTrackerViewModel.visible.value) {
interactionTrackerViewModel.notifyInteraction(canCancel = event?.action == KeyEvent.ACTION_UP, userInitiated = true)
return true
}
return supportFragmentManager.fragments
.any { it.onKeyEvent(keyCode, event) }
}
private fun onKeyEvent(keyCode: Int, event: KeyEvent?): Boolean = supportFragmentManager.fragments
.any { it.onKeyEvent(keyCode, event) }
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean =
onKeyEvent(keyCode, event) || super.onKeyDown(keyCode, event)
@@ -144,38 +135,4 @@ class MainActivity : FragmentActivity() {
override fun onKeyLongPress(keyCode: Int, event: KeyEvent?): Boolean =
onKeyEvent(keyCode, event) || super.onKeyUp(keyCode, event)
@Suppress("RestrictedApi") // False positive
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
// Ignore the key event that closes the screensaver
if (!event.isMediaSessionKeyEvent() && interactionTrackerViewModel.visible.value) {
interactionTrackerViewModel.notifyInteraction(canCancel = event.action == KeyEvent.ACTION_UP, userInitiated = true)
return true
}
@Suppress("RestrictedApi") // False positive
return super.dispatchKeyEvent(event)
}
@Suppress("RestrictedApi") // False positive
override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
// Ignore the key event that closes the screensaver
if (!event.isMediaSessionKeyEvent() && interactionTrackerViewModel.visible.value) {
interactionTrackerViewModel.notifyInteraction(canCancel = event.action == KeyEvent.ACTION_UP, userInitiated = true)
return true
}
@Suppress("RestrictedApi") // False positive
return super.dispatchKeyShortcutEvent(event)
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
// Ignore the touch event that closes the screensaver
if (interactionTrackerViewModel.visible.value) {
interactionTrackerViewModel.notifyInteraction(canCancel = true, userInitiated = true)
return true
}
return super.dispatchTouchEvent(ev)
}
}

View File

@@ -12,10 +12,13 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.type
import org.jellyfin.androidtv.integration.dream.composable.DreamHost
import org.jellyfin.androidtv.ui.InteractionTrackerViewModel
import org.jellyfin.androidtv.ui.base.dialog.DialogBase
import org.jellyfin.androidtv.util.isMediaSessionKeyEvent
import org.koin.androidx.compose.koinViewModel
@Composable
@@ -39,8 +42,13 @@ fun InAppScreensaver() {
) {
interactionTrackerViewModel.notifyInteraction(canCancel = true, userInitiated = false)
}
.onKeyEvent {
interactionTrackerViewModel.notifyInteraction(canCancel = true, userInitiated = true)
.onKeyEvent { event ->
if (!event.nativeKeyEvent.isMediaSessionKeyEvent()) {
interactionTrackerViewModel.notifyInteraction(
canCancel = event.type == KeyEventType.KeyUp,
userInitiated = true,
)
}
false
}
) {