Skip to content

Commit 289d4d0

Browse files
committed
[Link new device] Automatically rotate the QR Code - limit number of rotation to 10.
1 parent d56b278 commit 289d4d0

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewMobileHandler.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import dev.zacsweers.metro.SingleIn
1212
import io.element.android.libraries.core.log.logger.LoggerTag
1313
import io.element.android.libraries.di.SessionScope
1414
import io.element.android.libraries.matrix.api.MatrixClient
15+
import io.element.android.libraries.matrix.api.linknewdevice.ErrorType
1516
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler
1617
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep
1718
import io.element.android.libraries.matrix.api.logs.LoggerTags
@@ -69,4 +70,11 @@ class LinkNewMobileHandler(
6970
fun rotateQrCode() {
7071
createAndStartNewHandler()
7172
}
73+
74+
fun onTooManyRotation() {
75+
reset()
76+
sessionScope.launch {
77+
linkMobileStepFlow.emit(LinkMobileStep.Error(ErrorType.Expired("Too many QR code rotations")))
78+
}
79+
}
7280
}

features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenter.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ package io.element.android.features.linknewdevice.impl.screens.qrcode
99

1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.runtime.getValue
12+
import androidx.compose.runtime.mutableIntStateOf
1213
import androidx.compose.runtime.produceState
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.runtime.setValue
1316
import dev.zacsweers.metro.Assisted
1417
import dev.zacsweers.metro.AssistedFactory
1518
import dev.zacsweers.metro.AssistedInject
@@ -35,16 +38,22 @@ class ShowQrCodePresenter(
3538

3639
@Composable
3740
override fun present(): ShowQrCodeState {
41+
var qrCodeRotationCounter by remember { mutableIntStateOf(MAX_QR_CODE_ROTATION) }
3842
val data by produceState<AsyncData<String>>(AsyncData.Success(initialData)) {
3943
linkNewMobileHandler.stepFlow.collect { step ->
4044
when (step) {
4145
is LinkMobileStep.QrReady -> {
4246
value = AsyncData.Success(step.data)
4347
}
4448
is LinkMobileStep.QrRotating -> {
45-
Timber.tag(tag.value).d("Rotating QrCode")
46-
linkNewMobileHandler.rotateQrCode()
47-
value = AsyncData.Loading()
49+
if (qrCodeRotationCounter-- > 0) {
50+
Timber.tag(tag.value).d("Rotating QrCode")
51+
linkNewMobileHandler.rotateQrCode()
52+
value = AsyncData.Loading()
53+
} else {
54+
Timber.tag(tag.value).w("Max QR code rotation reached, not rotating anymore")
55+
linkNewMobileHandler.onTooManyRotation()
56+
}
4857
}
4958
else -> Unit
5059
}
@@ -55,4 +64,8 @@ class ShowQrCodePresenter(
5564
data = data,
5665
)
5766
}
67+
68+
companion object {
69+
const val MAX_QR_CODE_ROTATION = 10
70+
}
5871
}

0 commit comments

Comments
 (0)