Rename WebPipApi to PipController
This commit is contained in:
parent
cf650c5af2
commit
d626362be1
8 changed files with 29 additions and 29 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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") }
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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 ->
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue