Skip to content

Commit b671a82

Browse files
committed
feat: disable PIN screen
1 parent 89a4a92 commit b671a82

File tree

4 files changed

+149
-13
lines changed

4 files changed

+149
-13
lines changed

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import to.bitkit.ui.settings.SecuritySettingsScreen
8080
import to.bitkit.ui.settings.SettingsScreen
8181
import to.bitkit.ui.settings.backups.BackupWalletScreen
8282
import to.bitkit.ui.settings.backups.RestoreWalletScreen
83+
import to.bitkit.ui.settings.pin.DisablePinScreen
8384
import to.bitkit.ui.utils.screenScaleIn
8485
import to.bitkit.ui.utils.screenScaleOut
8586
import to.bitkit.ui.utils.screenSlideIn
@@ -231,6 +232,7 @@ fun ContentView(
231232
nodeState(walletViewModel, navController)
232233
generalSettings(navController)
233234
securitySettings(navController)
235+
disablePin(navController)
234236
defaultUnitSettings(currencyViewModel, navController)
235237
localCurrencySettings(currencyViewModel, navController)
236238
backupSettings(navController)
@@ -483,6 +485,15 @@ private fun NavGraphBuilder.securitySettings(navController: NavHostController) {
483485
}
484486
}
485487

488+
private fun NavGraphBuilder.disablePin(navController: NavHostController) {
489+
composableWithDefaultTransitions<Routes.DisablePin> { backStackEntry ->
490+
DisablePinScreen(
491+
navController = navController,
492+
savedStateHandle = backStackEntry.savedStateHandle,
493+
)
494+
}
495+
}
496+
486497
private fun NavGraphBuilder.defaultUnitSettings(
487498
currencyViewModel: CurrencyViewModel,
488499
navController: NavHostController,
@@ -688,6 +699,10 @@ fun NavController.navigateToSecuritySettings() = navigate(
688699
route = Routes.SecuritySettings,
689700
)
690701

702+
fun NavController.navigateToDisablePin() = navigate(
703+
route = Routes.DisablePin,
704+
)
705+
691706
fun NavController.navigateToAuthCheck(
692707
showLogoOnPin: Boolean = false,
693708
requirePin: Boolean = false,
@@ -795,6 +810,9 @@ object Routes {
795810
@Serializable
796811
data object SecuritySettings
797812

813+
@Serializable
814+
data object DisablePin
815+
798816
@Serializable
799817
data class AuthCheck(
800818
val showLogoOnPin: Boolean = false,

app/src/main/java/to/bitkit/ui/components/AuthCheckScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ object AuthCheckAction {
3333
object Id {
3434
const val TOGGLE_PIN_ON_LAUNCH = "toggle_pin_on_launch"
3535
const val TOGGLE_BIOMETRICS = "toggle_biometrics"
36+
const val DISABLE_PIN = "disable_pin"
3637
}
3738
}

app/src/main/java/to/bitkit/ui/settings/SecuritySettingsScreen.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,23 @@ import androidx.compose.ui.unit.dp
1717
import androidx.lifecycle.SavedStateHandle
1818
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1919
import androidx.navigation.NavController
20+
import kotlinx.coroutines.flow.filterNotNull
2021
import to.bitkit.R
2122
import to.bitkit.ui.appViewModel
2223
import to.bitkit.ui.components.AuthCheckAction
2324
import to.bitkit.ui.components.BodyS
2425
import to.bitkit.ui.components.settings.SettingsButtonRow
2526
import to.bitkit.ui.components.settings.SettingsSwitchRow
2627
import to.bitkit.ui.navigateToAuthCheck
28+
import to.bitkit.ui.navigateToDisablePin
2729
import to.bitkit.ui.navigateToHome
2830
import to.bitkit.ui.scaffold.AppTopBar
2931
import to.bitkit.ui.scaffold.CloseNavIcon
3032
import to.bitkit.ui.scaffold.ScreenColumn
33+
import to.bitkit.ui.settings.pin.PinNavigationSheet
3134
import to.bitkit.ui.theme.AppThemeSurface
3235
import to.bitkit.ui.theme.Colors
3336
import to.bitkit.ui.utils.rememberBiometricAuthSupported
34-
import to.bitkit.ui.settings.pin.PinNavigationSheet
3537

3638
@Composable
3739
fun SecuritySettingsScreen(
@@ -47,19 +49,18 @@ fun SecuritySettingsScreen(
4749

4850
LaunchedEffect(savedStateHandle) {
4951
savedStateHandle.getStateFlow<String?>(AuthCheckAction.KEY, null)
52+
.filterNotNull()
5053
.collect { actionId ->
51-
if (actionId != null) {
52-
when (actionId) {
53-
AuthCheckAction.Id.TOGGLE_BIOMETRICS -> {
54-
app.setIsBiometricEnabled(!isBiometricEnabled)
55-
}
56-
AuthCheckAction.Id.TOGGLE_PIN_ON_LAUNCH -> {
57-
app.setIsPinOnLaunchEnabled(!isPinOnLaunchEnabled)
58-
}
54+
when (actionId) {
55+
AuthCheckAction.Id.TOGGLE_BIOMETRICS -> {
56+
app.setIsBiometricEnabled(!isBiometricEnabled)
57+
}
58+
59+
AuthCheckAction.Id.TOGGLE_PIN_ON_LAUNCH -> {
60+
app.setIsPinOnLaunchEnabled(!isPinOnLaunchEnabled)
5961
}
60-
// cleanup
61-
savedStateHandle.remove<String>(AuthCheckAction.KEY)
6262
}
63+
savedStateHandle.remove<String>(AuthCheckAction.KEY)
6364
}
6465
}
6566

@@ -77,8 +78,7 @@ fun SecuritySettingsScreen(
7778
if (!isPinEnabled) {
7879
showPinSheet = true
7980
} else {
80-
// TODO show Disable Pin screen
81-
app.removePin()
81+
navController.navigateToDisablePin()
8282
}
8383
},
8484
onPinOnLaunchClick = {
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package to.bitkit.ui.settings.pin
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.fillMaxWidth
8+
import androidx.compose.foundation.layout.height
9+
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.foundation.layout.size
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.LaunchedEffect
13+
import androidx.compose.ui.Alignment
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.res.painterResource
16+
import androidx.compose.ui.res.stringResource
17+
import androidx.compose.ui.tooling.preview.Preview
18+
import androidx.compose.ui.unit.dp
19+
import androidx.lifecycle.SavedStateHandle
20+
import androidx.navigation.NavController
21+
import kotlinx.coroutines.flow.filterNotNull
22+
import to.bitkit.R
23+
import to.bitkit.ui.appViewModel
24+
import to.bitkit.ui.components.AuthCheckAction
25+
import to.bitkit.ui.components.BodyM
26+
import to.bitkit.ui.components.PrimaryButton
27+
import to.bitkit.ui.navigateToAuthCheck
28+
import to.bitkit.ui.navigateToHome
29+
import to.bitkit.ui.scaffold.AppTopBar
30+
import to.bitkit.ui.scaffold.CloseNavIcon
31+
import to.bitkit.ui.scaffold.ScreenColumn
32+
import to.bitkit.ui.theme.AppThemeSurface
33+
import to.bitkit.ui.theme.Colors
34+
35+
@Composable
36+
fun DisablePinScreen(
37+
navController: NavController,
38+
savedStateHandle: SavedStateHandle,
39+
) {
40+
val app = appViewModel ?: return
41+
42+
LaunchedEffect(savedStateHandle) {
43+
savedStateHandle.getStateFlow<String?>(AuthCheckAction.KEY, null)
44+
.filterNotNull()
45+
.collect { actionId ->
46+
when (actionId) {
47+
AuthCheckAction.Id.DISABLE_PIN -> {
48+
app.removePin()
49+
navController.popBackStack()
50+
}
51+
}
52+
savedStateHandle.remove<String>(AuthCheckAction.KEY)
53+
}
54+
}
55+
56+
DisablePinContent(
57+
onDisableClick = {
58+
navController.navigateToAuthCheck(
59+
requirePin = true,
60+
onSuccessActionId = AuthCheckAction.Id.DISABLE_PIN,
61+
)
62+
},
63+
onBackClick = { navController.popBackStack() },
64+
onCloseClick = { navController.navigateToHome() },
65+
)
66+
}
67+
68+
@Composable
69+
private fun DisablePinContent(
70+
onDisableClick: () -> Unit = {},
71+
onBackClick: () -> Unit = {},
72+
onCloseClick: () -> Unit = {},
73+
) {
74+
ScreenColumn {
75+
AppTopBar(
76+
titleText = stringResource(R.string.security__pin_disable_title),
77+
onBackClick = onBackClick,
78+
actions = { CloseNavIcon(onClick = onCloseClick) },
79+
)
80+
Column(
81+
modifier = Modifier.padding(horizontal = 16.dp),
82+
) {
83+
84+
BodyM(
85+
text = stringResource(R.string.security__pin_disable_text),
86+
color = Colors.White64,
87+
)
88+
89+
Box(
90+
contentAlignment = Alignment.Center,
91+
modifier = Modifier
92+
.fillMaxWidth()
93+
.weight(1f)
94+
) {
95+
Image(
96+
painter = painterResource(R.drawable.shield),
97+
contentDescription = null,
98+
modifier = Modifier.size(256.dp)
99+
)
100+
}
101+
102+
PrimaryButton(
103+
text = stringResource(R.string.security__pin_disable_button),
104+
onClick = onDisableClick,
105+
)
106+
Spacer(modifier = Modifier.height(16.dp))
107+
}
108+
}
109+
}
110+
111+
@Preview
112+
@Composable
113+
private fun Preview() {
114+
AppThemeSurface {
115+
DisablePinContent()
116+
}
117+
}

0 commit comments

Comments
 (0)