PIN : fix quality
This commit is contained in:
parent
a7c83a94d3
commit
ca6a30d6cc
49 changed files with 131 additions and 45 deletions
|
|
@ -20,6 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding
|
|||
import io.element.android.appconfig.LockScreenConfig
|
||||
import io.element.android.features.lockscreen.api.LockScreenLockState
|
||||
import io.element.android.features.lockscreen.api.LockScreenService
|
||||
import io.element.android.features.lockscreen.impl.pin.DefaultPinCodeManagerCallback
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.libraries.di.AppScope
|
||||
import io.element.android.libraries.di.SingleIn
|
||||
|
|
@ -53,7 +54,7 @@ class DefaultLockScreenService @Inject constructor(
|
|||
private var lockJob: Job? = null
|
||||
|
||||
init {
|
||||
pinCodeManager.addCallback(object : PinCodeManager.Callback {
|
||||
pinCodeManager.addCallback(object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeVerified() {
|
||||
_lockScreenState.value = LockScreenLockState.Unlocked
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ import dagger.assisted.Assisted
|
|||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.lockscreen.api.LockScreenEntryPoint
|
||||
import io.element.android.features.lockscreen.impl.pin.DefaultPinCodeManagerCallback
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.settings.LockScreenSettingsFlowNode
|
||||
import io.element.android.features.lockscreen.impl.setup.SetupPinNode
|
||||
|
|
@ -70,7 +71,7 @@ class LockScreenFlowNode @AssistedInject constructor(
|
|||
data object Settings : NavTarget
|
||||
}
|
||||
|
||||
private val pinCodeManagerCallback = object : PinCodeManager.Callback {
|
||||
private val pinCodeManagerCallback = object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeCreated() {
|
||||
plugins<LockScreenEntryPoint.Callback>().forEach {
|
||||
it.onSetupCompleted()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (c) 2023 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package io.element.android.features.lockscreen.impl.pin
|
||||
|
||||
open class DefaultPinCodeManagerCallback : PinCodeManager.Callback {
|
||||
override fun onPinCodeVerified() = Unit
|
||||
|
||||
override fun onPinCodeCreated() = Unit
|
||||
|
||||
override fun onPinCodeRemoved() = Unit
|
||||
}
|
||||
|
|
@ -29,17 +29,17 @@ interface PinCodeManager {
|
|||
/**
|
||||
* Called when the pin code is verified.
|
||||
*/
|
||||
fun onPinCodeVerified() = Unit
|
||||
fun onPinCodeVerified()
|
||||
|
||||
/**
|
||||
* Called when the pin code is created.
|
||||
*/
|
||||
fun onPinCodeCreated() = Unit
|
||||
fun onPinCodeCreated()
|
||||
|
||||
/**
|
||||
* Called when the pin code is removed.
|
||||
*/
|
||||
fun onPinCodeRemoved() = Unit
|
||||
fun onPinCodeRemoved()
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import com.bumble.appyx.navmodel.backstack.operation.push
|
|||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.lockscreen.impl.pin.DefaultPinCodeManagerCallback
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.setup.SetupPinNode
|
||||
import io.element.android.features.lockscreen.impl.unlock.PinUnlockNode
|
||||
|
|
@ -70,7 +71,7 @@ class LockScreenSettingsFlowNode @AssistedInject constructor(
|
|||
data object Settings : NavTarget
|
||||
}
|
||||
|
||||
private val pinCodeManagerCallback = object : PinCodeManager.Callback {
|
||||
private val pinCodeManagerCallback = object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeVerified() {
|
||||
backstack.newRoot(NavTarget.Settings)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,5 +27,8 @@ data class PinUnlockState(
|
|||
val signOutAction: Async<String?>,
|
||||
val eventSink: (PinUnlockEvents) -> Unit
|
||||
) {
|
||||
val isSignOutPromptCancellable = (remainingAttempts.dataOrNull() ?: 0) > 0
|
||||
val isSignOutPromptCancellable = when (remainingAttempts) {
|
||||
is Async.Success -> remainingAttempts.data > 0
|
||||
else -> true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Odhlašování…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Abmelden…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Cerrando sesión…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Déconnexion…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Uscita in corso…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Deconectare în curs…"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"Выполняется выход…"</string>
|
||||
</resources>
|
||||
|
|
@ -1,16 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<plurals name="screen_app_lock_subtitle">
|
||||
<item quantity="other">"Máte 3 pokusy na odomknutie"</item>
|
||||
</plurals>
|
||||
<plurals name="screen_app_lock_subtitle_wrong_pin">
|
||||
<item quantity="one">"Nesprávny PIN kód. Máte ešte %1$d pokus"</item>
|
||||
<item quantity="few">"Nesprávny PIN kód. Máte ešte %1$d pokusy"</item>
|
||||
<item quantity="other">"Nesprávny PIN kód. Máte ešte %1$d pokusov"</item>
|
||||
</plurals>
|
||||
<string name="screen_app_lock_biometric_authentication">"biometrické overenie"</string>
|
||||
<string name="screen_app_lock_biometric_unlock">"biometrické odomknutie"</string>
|
||||
<string name="screen_app_lock_forgot_pin">"Zabudli ste PIN?"</string>
|
||||
<string name="screen_app_lock_settings_change_pin">"Zmeniť PIN kód"</string>
|
||||
<string name="screen_app_lock_settings_enable_biometric_unlock">"Povoliť biometrické odomknutie"</string>
|
||||
<string name="screen_app_lock_settings_remove_pin">"Odstrániť PIN"</string>
|
||||
<string name="screen_app_lock_settings_remove_pin_alert_message">"Ste si istí, že chcete odstrániť PIN?"</string>
|
||||
<string name="screen_app_lock_settings_remove_pin_alert_title">"Odstrániť PIN?"</string>
|
||||
<string name="screen_app_lock_setup_biometric_unlock_allow_title">"Povoliť %1$s"</string>
|
||||
<string name="screen_app_lock_setup_biometric_unlock_skip">"Radšej použijem PIN"</string>
|
||||
<string name="screen_app_lock_setup_biometric_unlock_subtitle">"Ušetrite si čas a použite zakaždým %1$s na odomknutie aplikácie"</string>
|
||||
<string name="screen_app_lock_setup_choose_pin">"Vyberte PIN"</string>
|
||||
<string name="screen_app_lock_setup_confirm_pin">"Potvrdiť PIN"</string>
|
||||
<string name="screen_app_lock_setup_pin_blacklisted_dialog_content">"Z bezpečnostných dôvodov si nemôžete toto zvoliť ako svoj PIN kód."</string>
|
||||
|
|
@ -22,5 +30,5 @@ Vyberte si niečo zapamätateľné. Ak tento kód PIN zabudnete, budete z aplik
|
|||
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"PIN kódy sa nezhodujú"</string>
|
||||
<string name="screen_app_lock_signout_alert_message">"Ak chcete pokračovať, musíte sa znovu prihlásiť a vytvoriť nový PIN kód."</string>
|
||||
<string name="screen_app_lock_signout_alert_title">"Prebieha odhlasovanie"</string>
|
||||
<string name="screen_app_lock_subtitle">"Máte 3 pokusy na odomknutie"</string>
|
||||
<string name="screen_signout_in_progress_dialog_content">"Prebieha odhlasovanie…"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_signout_in_progress_dialog_content">"正在登出…"</string>
|
||||
</resources>
|
||||
|
|
@ -23,6 +23,7 @@ import com.google.common.truth.Truth.assertThat
|
|||
import io.element.android.appconfig.LockScreenConfig
|
||||
import io.element.android.features.lockscreen.impl.fixtures.aLockScreenConfig
|
||||
import io.element.android.features.lockscreen.impl.fixtures.aPinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.pin.DefaultPinCodeManagerCallback
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.pin.model.assertEmpty
|
||||
import io.element.android.features.lockscreen.impl.pin.model.assertText
|
||||
|
|
@ -45,7 +46,7 @@ class SetupPinPresenterTest {
|
|||
@Test
|
||||
fun `present - complete flow`() = runTest {
|
||||
val pinCodeCreated = CompletableDeferred<Unit>()
|
||||
val callback = object : PinCodeManager.Callback {
|
||||
val callback = object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeCreated() {
|
||||
pinCodeCreated.complete(Unit)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,9 @@ import app.cash.molecule.RecompositionMode
|
|||
import app.cash.molecule.moleculeFlow
|
||||
import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.fixtures.aPinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.pin.DefaultPinCodeManagerCallback
|
||||
import io.element.android.features.lockscreen.impl.pin.PinCodeManager
|
||||
import io.element.android.features.lockscreen.impl.pin.model.PinEntry
|
||||
import io.element.android.features.lockscreen.impl.pin.model.assertText
|
||||
import io.element.android.features.lockscreen.impl.unlock.keypad.PinKeypadModel
|
||||
|
|
@ -42,7 +43,7 @@ class PinUnlockPresenterTest {
|
|||
@Test
|
||||
fun `present - success verify flow`() = runTest {
|
||||
val pinCodeVerified = CompletableDeferred<Unit>()
|
||||
val callback = object : PinCodeManager.Callback {
|
||||
val callback = object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeCreated() {
|
||||
pinCodeVerified.complete(Unit)
|
||||
}
|
||||
|
|
@ -82,7 +83,7 @@ class PinUnlockPresenterTest {
|
|||
@Test
|
||||
fun `present - failure verify flow`() = runTest {
|
||||
val pinCodeVerified = CompletableDeferred<Unit>()
|
||||
val callback = object : PinCodeManager.Callback {
|
||||
val callback = object : DefaultPinCodeManagerCallback() {
|
||||
override fun onPinCodeCreated() {
|
||||
pinCodeVerified.complete(Unit)
|
||||
}
|
||||
|
|
@ -145,7 +146,7 @@ class PinUnlockPresenterTest {
|
|||
|
||||
private suspend fun createPinUnlockPresenter(
|
||||
scope: CoroutineScope,
|
||||
callback: PinCodeManager.Callback = object : PinCodeManager.Callback {},
|
||||
callback: PinCodeManager.Callback = DefaultPinCodeManagerCallback(),
|
||||
): PinUnlockPresenter {
|
||||
val pinCodeManager = aPinCodeManager().apply {
|
||||
addCallback(callback)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue