android: keep screen on while playing/recording media

This commit is contained in:
Avently 2023-11-04 23:00:15 +08:00
parent 4816150b99
commit d291f006e9
8 changed files with 38 additions and 7 deletions

View File

@ -1,6 +1,8 @@
package chat.simplex.app package chat.simplex.app
import android.app.Application import android.app.Application
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalView
import chat.simplex.common.platform.Log import chat.simplex.common.platform.Log
import androidx.lifecycle.* import androidx.lifecycle.*
import androidx.work.* import androidx.work.*
@ -216,6 +218,17 @@ class SimplexApp: Application(), LifecycleEventObserver {
} }
return true return true
} }
@Composable
override fun AndroidKeepScreenOn() {
val view = LocalView.current
DisposableEffect(Unit) {
view.keepScreenOn = true
onDispose {
view.keepScreenOn = false
}
}
}
} }
} }
} }

View File

@ -23,8 +23,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.*
import androidx.compose.ui.platform.LocalLifecycleOwner
import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
@ -204,6 +203,7 @@ actual fun ActiveCallView() {
chatModel.callCommand.clear() chatModel.callCommand.clear()
} }
} }
platform.AndroidKeepScreenOn()
} }
@Composable @Composable

View File

@ -3,8 +3,7 @@ package chat.simplex.common.views.chat.item
import android.graphics.Rect import android.graphics.Rect
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable import androidx.compose.runtime.*
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
@ -12,6 +11,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import chat.simplex.common.platform.VideoPlayer import chat.simplex.common.platform.VideoPlayer
import chat.simplex.common.platform.platform
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH
import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.ui.StyledPlayerView
@ -32,6 +32,9 @@ actual fun PlayerView(player: VideoPlayer, width: Dp, onClick: () -> Unit, onLon
onClick = { if (player.player.playWhenReady) stop() else onClick() } onClick = { if (player.player.playWhenReady) stop() else onClick() }
) )
) )
if (remember { player.videoPlaying }.value) {
platform.AndroidKeepScreenOn()
}
} }
@Composable @Composable

View File

@ -4,6 +4,7 @@ import android.os.Build
import android.view.View import android.view.View
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.graphics.painter.BitmapPainter
@ -11,8 +12,8 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import chat.simplex.common.helpers.toUri
import chat.simplex.common.platform.VideoPlayer import chat.simplex.common.platform.VideoPlayer
import chat.simplex.common.platform.platform
import chat.simplex.res.MR import chat.simplex.res.MR
import coil.ImageLoader import coil.ImageLoader
import coil.compose.rememberAsyncImagePainter import coil.compose.rememberAsyncImagePainter
@ -23,7 +24,6 @@ import coil.size.Size
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.ui.StyledPlayerView
import dev.icerock.moko.resources.compose.stringResource import dev.icerock.moko.resources.compose.stringResource
import java.net.URI
@Composable @Composable
actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) { actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) {
@ -72,4 +72,7 @@ actual fun FullScreenVideoView(player: VideoPlayer, modifier: Modifier, close: (
}, },
modifier modifier
) )
if (remember { player.videoPlaying }.value) {
platform.AndroidKeepScreenOn()
}
} }

View File

@ -1,5 +1,6 @@
package chat.simplex.common.platform package chat.simplex.common.platform
import androidx.compose.runtime.*
import chat.simplex.common.model.NotificationsMode import chat.simplex.common.model.NotificationsMode
interface PlatformInterface { interface PlatformInterface {
@ -11,6 +12,8 @@ interface PlatformInterface {
fun androidChatInitializedAndStarted() {} fun androidChatInitializedAndStarted() {}
fun androidIsBackgroundCallAllowed(): Boolean = true fun androidIsBackgroundCallAllowed(): Boolean = true
suspend fun androidAskToAllowBackgroundCalls(): Boolean = true suspend fun androidAskToAllowBackgroundCalls(): Boolean = true
@Composable
fun AndroidKeepScreenOn() {}
} }
/** /**
* Multiplatform project has separate directories per platform + common directory that contains directories per platform + common for all of them. * Multiplatform project has separate directories per platform + common directory that contains directories per platform + common for all of them.

View File

@ -22,6 +22,7 @@ import chat.simplex.common.model.durationText
import chat.simplex.common.ui.theme.* import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.* import chat.simplex.common.views.helpers.*
import chat.simplex.common.platform.AudioPlayer import chat.simplex.common.platform.AudioPlayer
import chat.simplex.common.platform.platform
import chat.simplex.res.MR import chat.simplex.res.MR
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
@ -68,6 +69,9 @@ fun ComposeVoiceView(
.size(36.dp), .size(36.dp),
tint = if (finishedRecording) MaterialTheme.colors.primary else MaterialTheme.colors.secondary tint = if (finishedRecording) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
) )
if (audioPlaying.value) {
platform.AndroidKeepScreenOn()
}
} }
val numberInText = remember(recordedDurationMs, progress.value) { val numberInText = remember(recordedDurationMs, progress.value) {
derivedStateOf { derivedStateOf {

View File

@ -29,7 +29,6 @@ import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.stringResource import dev.icerock.moko.resources.compose.stringResource
import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.painterResource
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File
import java.net.URI import java.net.URI
@Composable @Composable
@ -371,6 +370,9 @@ private fun RecordVoiceView(recState: MutableState<RecordingState>, stopRecOnNex
) )
RecordVoiceButton(interactionSource) RecordVoiceButton(interactionSource)
} }
if (recState.value is RecordingState.Started) {
platform.AndroidKeepScreenOn()
}
} }
@Composable @Composable

View File

@ -70,6 +70,9 @@ fun CIVoiceView(
VoiceLayout(file, ci, text, audioPlaying, progress, duration, brokenAudio, sent, hasText, timedMessagesTTL, play, pause, longClick, receiveFile) { VoiceLayout(file, ci, text, audioPlaying, progress, duration, brokenAudio, sent, hasText, timedMessagesTTL, play, pause, longClick, receiveFile) {
AudioPlayer.seekTo(it, progress, fileSource?.filePath) AudioPlayer.seekTo(it, progress, fileSource?.filePath)
} }
if (audioPlaying.value) {
platform.AndroidKeepScreenOn()
}
} else { } else {
VoiceMsgIndicator(null, false, sent, hasText, null, null, false, {}, {}, longClick, receiveFile) VoiceMsgIndicator(null, false, sent, hasText, null, null, false, {}, {}, longClick, receiveFile)
val metaReserve = if (edited) val metaReserve = if (edited)