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
import android.app.Application
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalView
import chat.simplex.common.platform.Log
import androidx.lifecycle.*
import androidx.work.*
@ -216,6 +218,17 @@ class SimplexApp: Application(), LifecycleEventObserver {
}
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.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.platform.*
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.TextStyle
@ -204,6 +203,7 @@ actual fun ActiveCallView() {
chatModel.callCommand.clear()
}
}
platform.AndroidKeepScreenOn()
}
@Composable

View File

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

View File

@ -4,6 +4,7 @@ import android.os.Build
import android.view.View
import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.*
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.viewinterop.AndroidView
import androidx.core.view.isVisible
import chat.simplex.common.helpers.toUri
import chat.simplex.common.platform.VideoPlayer
import chat.simplex.common.platform.platform
import chat.simplex.res.MR
import coil.ImageLoader
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.StyledPlayerView
import dev.icerock.moko.resources.compose.stringResource
import java.net.URI
@Composable
actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) {
@ -72,4 +72,7 @@ actual fun FullScreenVideoView(player: VideoPlayer, modifier: Modifier, close: (
},
modifier
)
if (remember { player.videoPlaying }.value) {
platform.AndroidKeepScreenOn()
}
}

View File

@ -1,5 +1,6 @@
package chat.simplex.common.platform
import androidx.compose.runtime.*
import chat.simplex.common.model.NotificationsMode
interface PlatformInterface {
@ -11,6 +12,8 @@ interface PlatformInterface {
fun androidChatInitializedAndStarted() {}
fun androidIsBackgroundCallAllowed(): 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.

View File

@ -22,6 +22,7 @@ import chat.simplex.common.model.durationText
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.platform.AudioPlayer
import chat.simplex.common.platform.platform
import chat.simplex.res.MR
import kotlinx.coroutines.flow.distinctUntilChanged
@ -68,6 +69,9 @@ fun ComposeVoiceView(
.size(36.dp),
tint = if (finishedRecording) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
)
if (audioPlaying.value) {
platform.AndroidKeepScreenOn()
}
}
val numberInText = remember(recordedDurationMs, progress.value) {
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.painterResource
import kotlinx.coroutines.*
import java.io.File
import java.net.URI
@Composable
@ -371,6 +370,9 @@ private fun RecordVoiceView(recState: MutableState<RecordingState>, stopRecOnNex
)
RecordVoiceButton(interactionSource)
}
if (recState.value is RecordingState.Started) {
platform.AndroidKeepScreenOn()
}
}
@Composable

View File

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