[Link new device] Automatically rotate the QR Code - limit number of rotation to 10.

This commit is contained in:
Benoit Marty 2026-05-19 09:24:21 +02:00 committed by Benoit Marty
parent 4e535a8a16
commit 1500c0fadd
2 changed files with 24 additions and 3 deletions

View file

@ -12,6 +12,7 @@ import dev.zacsweers.metro.SingleIn
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.linknewdevice.ErrorType
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep
import io.element.android.libraries.matrix.api.logs.LoggerTags import io.element.android.libraries.matrix.api.logs.LoggerTags
@ -69,4 +70,11 @@ class LinkNewMobileHandler(
fun rotateQrCode() { fun rotateQrCode() {
createAndStartNewHandler() createAndStartNewHandler()
} }
fun onTooManyRotation() {
reset()
sessionScope.launch {
linkMobileStepFlow.emit(LinkMobileStep.Error(ErrorType.Expired("Too many QR code rotations")))
}
}
} }

View file

@ -9,7 +9,10 @@ package io.element.android.features.linknewdevice.impl.screens.qrcode
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.produceState import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
@ -35,6 +38,7 @@ class ShowQrCodePresenter(
@Composable @Composable
override fun present(): ShowQrCodeState { override fun present(): ShowQrCodeState {
var qrCodeRotationCounter by remember { mutableIntStateOf(MAX_QR_CODE_ROTATION) }
val data by produceState<AsyncData<String>>(AsyncData.Success(initialData)) { val data by produceState<AsyncData<String>>(AsyncData.Success(initialData)) {
linkNewMobileHandler.stepFlow.collect { step -> linkNewMobileHandler.stepFlow.collect { step ->
when (step) { when (step) {
@ -42,9 +46,14 @@ class ShowQrCodePresenter(
value = AsyncData.Success(step.data) value = AsyncData.Success(step.data)
} }
is LinkMobileStep.QrRotating -> { is LinkMobileStep.QrRotating -> {
Timber.tag(tag.value).d("Rotating QrCode") if (qrCodeRotationCounter-- > 0) {
linkNewMobileHandler.rotateQrCode() Timber.tag(tag.value).d("Rotating QrCode")
value = AsyncData.Loading() linkNewMobileHandler.rotateQrCode()
value = AsyncData.Loading()
} else {
Timber.tag(tag.value).w("Max QR code rotation reached, not rotating anymore")
linkNewMobileHandler.onTooManyRotation()
}
} }
else -> Unit else -> Unit
} }
@ -55,4 +64,8 @@ class ShowQrCodePresenter(
data = data, data = data,
) )
} }
companion object {
const val MAX_QR_CODE_ROTATION = 10
}
} }