Rename WebPipApi to PipController

This commit is contained in:
Benoit Marty 2024-08-26 16:50:35 +02:00
parent cf650c5af2
commit d626362be1
8 changed files with 29 additions and 29 deletions

View file

@ -16,10 +16,10 @@
package io.element.android.features.call.impl.pip package io.element.android.features.call.impl.pip
import io.element.android.features.call.impl.utils.WebPipApi import io.element.android.features.call.impl.utils.PipController
sealed interface PictureInPictureEvents { sealed interface PictureInPictureEvents {
data class SetupWebPipApi(val webPipApi: WebPipApi) : PictureInPictureEvents data class SetPipController(val pipController: PipController) : PictureInPictureEvents
data object EnterPictureInPicture : PictureInPictureEvents data object EnterPictureInPicture : PictureInPictureEvents
data class OnPictureInPictureModeChanged(val isInPip: Boolean) : PictureInPictureEvents data class OnPictureInPictureModeChanged(val isInPip: Boolean) : PictureInPictureEvents
} }

View file

@ -22,7 +22,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import io.element.android.features.call.impl.utils.WebPipApi import io.element.android.features.call.impl.utils.PipController
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -41,25 +41,25 @@ class PictureInPicturePresenter @Inject constructor(
override fun present(): PictureInPictureState { override fun present(): PictureInPictureState {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
var isInPictureInPicture by remember { mutableStateOf(false) } var isInPictureInPicture by remember { mutableStateOf(false) }
var webPipApi by remember { mutableStateOf<WebPipApi?>(null) } var pipController by remember { mutableStateOf<PipController?>(null) }
fun handleEvent(event: PictureInPictureEvents) { fun handleEvent(event: PictureInPictureEvents) {
when (event) { when (event) {
is PictureInPictureEvents.SetupWebPipApi -> { is PictureInPictureEvents.SetPipController -> {
webPipApi = event.webPipApi pipController = event.pipController
} }
PictureInPictureEvents.EnterPictureInPicture -> { PictureInPictureEvents.EnterPictureInPicture -> {
coroutineScope.launch { coroutineScope.launch {
switchToPip(webPipApi) switchToPip(pipController)
} }
} }
is PictureInPictureEvents.OnPictureInPictureModeChanged -> { is PictureInPictureEvents.OnPictureInPictureModeChanged -> {
Timber.tag(loggerTag.value).d("onPictureInPictureModeChanged: ${event.isInPip}") Timber.tag(loggerTag.value).d("onPictureInPictureModeChanged: ${event.isInPip}")
isInPictureInPicture = event.isInPip isInPictureInPicture = event.isInPip
if (event.isInPip) { if (event.isInPip) {
webPipApi?.enterPip() pipController?.enterPip()
} else { } else {
webPipApi?.exitPip() pipController?.exitPip()
} }
} }
} }
@ -85,12 +85,12 @@ class PictureInPicturePresenter @Inject constructor(
/** /**
* Enters Picture-in-Picture mode, if allowed by Element Call. * Enters Picture-in-Picture mode, if allowed by Element Call.
*/ */
private suspend fun switchToPip(webPipApi: WebPipApi?) { private suspend fun switchToPip(pipController: PipController?) {
if (isPipSupported) { if (isPipSupported) {
if (webPipApi == null) { if (pipController == null) {
Timber.tag(loggerTag.value).w("webPipApi is not available") Timber.tag(loggerTag.value).w("webPipApi is not available")
} }
if (webPipApi == null || webPipApi.canEnterPip()) { if (pipController == null || pipController.canEnterPip()) {
Timber.tag(loggerTag.value).d("Switch to PiP mode") Timber.tag(loggerTag.value).d("Switch to PiP mode")
pipActivity?.enterPipMode() pipActivity?.enterPipMode()
?.also { Timber.tag(loggerTag.value).d("Switch to PiP mode result: $it") } ?.also { Timber.tag(loggerTag.value).d("Switch to PiP mode result: $it") }

View file

@ -40,7 +40,7 @@ import io.element.android.features.call.impl.pip.PictureInPictureEvents
import io.element.android.features.call.impl.pip.PictureInPictureState import io.element.android.features.call.impl.pip.PictureInPictureState
import io.element.android.features.call.impl.pip.PictureInPictureStateProvider import io.element.android.features.call.impl.pip.PictureInPictureStateProvider
import io.element.android.features.call.impl.pip.aPictureInPictureState import io.element.android.features.call.impl.pip.aPictureInPictureState
import io.element.android.features.call.impl.utils.WebViewWebPipApi import io.element.android.features.call.impl.utils.WebViewPipController
import io.element.android.features.call.impl.utils.WebViewWidgetMessageInterceptor import io.element.android.features.call.impl.utils.WebViewWidgetMessageInterceptor
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.ProgressDialog
@ -96,9 +96,9 @@ internal fun CallScreenView(
} }
CallWebView( CallWebView(
modifier = Modifier modifier = Modifier
.padding(padding) .padding(padding)
.consumeWindowInsets(padding) .consumeWindowInsets(padding)
.fillMaxSize(), .fillMaxSize(),
url = state.urlState, url = state.urlState,
userAgent = state.userAgent, userAgent = state.userAgent,
onPermissionsRequest = { request -> onPermissionsRequest = { request ->
@ -109,8 +109,8 @@ internal fun CallScreenView(
onWebViewCreate = { webView -> onWebViewCreate = { webView ->
val interceptor = WebViewWidgetMessageInterceptor(webView) val interceptor = WebViewWidgetMessageInterceptor(webView)
state.eventSink(CallScreenEvents.SetupMessageChannels(interceptor)) state.eventSink(CallScreenEvents.SetupMessageChannels(interceptor))
val webPipApi = WebViewWebPipApi(webView) val pipController = WebViewPipController(webView)
pipState.eventSink(PictureInPictureEvents.SetupWebPipApi(webPipApi)) pipState.eventSink(PictureInPictureEvents.SetPipController(pipController))
} }
) )
when (state.urlState) { when (state.urlState) {

View file

@ -16,7 +16,7 @@
package io.element.android.features.call.impl.utils package io.element.android.features.call.impl.utils
interface WebPipApi { interface PipController {
suspend fun canEnterPip(): Boolean suspend fun canEnterPip(): Boolean
fun enterPip() fun enterPip()
fun exitPip() fun exitPip()

View file

@ -20,9 +20,9 @@ import android.webkit.WebView
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
class WebViewWebPipApi( class WebViewPipController(
private val webView: WebView, private val webView: WebView,
) : WebPipApi { ) : PipController {
override suspend fun canEnterPip(): Boolean { override suspend fun canEnterPip(): Boolean {
return suspendCoroutine { continuation -> return suspendCoroutine { continuation ->
webView.evaluateJavascript("controls.canEnterPip()") { result -> webView.evaluateJavascript("controls.canEnterPip()") { result ->

View file

@ -16,14 +16,14 @@
package io.element.android.features.call.impl.pip package io.element.android.features.call.impl.pip
import io.element.android.features.call.impl.utils.WebPipApi import io.element.android.features.call.impl.utils.PipController
import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaError
class FakeWebPipApi( class FakePipController(
private val canEnterPipResult: () -> Boolean = { lambdaError() }, private val canEnterPipResult: () -> Boolean = { lambdaError() },
private val enterPipResult: () -> Unit = { lambdaError() }, private val enterPipResult: () -> Unit = { lambdaError() },
private val exitPipResult: () -> Unit = { lambdaError() }, private val exitPipResult: () -> Unit = { lambdaError() },
) : WebPipApi { ) : PipController {
override suspend fun canEnterPip(): Boolean = canEnterPipResult() override suspend fun canEnterPip(): Boolean = canEnterPipResult()
override fun enterPip() = enterPipResult() override fun enterPip() = enterPipResult()

View file

@ -92,7 +92,7 @@ class PictureInPicturePresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(PictureInPictureEvents.SetupWebPipApi(FakeWebPipApi(canEnterPipResult = { false }))) initialState.eventSink(PictureInPictureEvents.SetPipController(FakePipController(canEnterPipResult = { false })))
initialState.eventSink(PictureInPictureEvents.EnterPictureInPicture) initialState.eventSink(PictureInPictureEvents.EnterPictureInPicture)
handUpResult.assertions().isCalledOnce() handUpResult.assertions().isCalledOnce()
} }
@ -115,8 +115,8 @@ class PictureInPicturePresenterTest {
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink( initialState.eventSink(
PictureInPictureEvents.SetupWebPipApi( PictureInPictureEvents.SetPipController(
FakeWebPipApi( FakePipController(
canEnterPipResult = { true }, canEnterPipResult = { true },
enterPipResult = enterPipResult, enterPipResult = enterPipResult,
exitPipResult = exitPipResult, exitPipResult = exitPipResult,

View file

@ -52,7 +52,7 @@ class CallScreenViewTest {
eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels } eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels }
eventsRecorder.assertTrue(1) { it == CallScreenEvents.Hangup } eventsRecorder.assertTrue(1) { it == CallScreenEvents.Hangup }
pipEventsRecorder.assertSize(1) pipEventsRecorder.assertSize(1)
pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetupWebPipApi } pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetPipController }
} }
@Test @Test
@ -72,7 +72,7 @@ class CallScreenViewTest {
eventsRecorder.assertSize(1) eventsRecorder.assertSize(1)
eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels } eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels }
pipEventsRecorder.assertSize(2) pipEventsRecorder.assertSize(2)
pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetupWebPipApi } pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetPipController }
pipEventsRecorder.assertTrue(1) { it == PictureInPictureEvents.EnterPictureInPicture } pipEventsRecorder.assertTrue(1) { it == PictureInPictureEvents.EnterPictureInPicture }
} }
} }