Skip to content
3 changes: 3 additions & 0 deletions app/src/main/java/to/bitkit/ui/Locals.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ val LocalBalances = compositionLocalOf { BalanceState() }
val LocalCurrencies = compositionLocalOf { CurrencyState() }
val LocalIs24HourFormat = compositionLocalOf { false }

/** True while the PIN screen covers the wallet; dialogs owning their own window must not render. */
val LocalIsAppLocked = compositionLocalOf { false }

// Statics
val LocalDrawerState = staticCompositionLocalOf<DrawerState?> { null }
val LocalBottomSheetOverlayState = staticCompositionLocalOf<BottomSheetOverlayState?> { null }
Expand Down
53 changes: 35 additions & 18 deletions app/src/main/java/to/bitkit/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@ import android.os.Looper
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.fadeOut
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTagsAsResourceId
import androidx.core.content.IntentCompat
Expand Down Expand Up @@ -129,6 +132,9 @@ class MainActivity : FragmentActivity() {
val hazeState = rememberHazeState(blurEnabled = true)
val bottomSheetOverlayState = remember { BottomSheetOverlayState() }
val authSheetOverlayState = remember { BottomSheetOverlayState() }
val isAuthenticated by appViewModel.isAuthenticated.collectAsState()
val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current

LaunchedEffect(
walletExists,
Expand All @@ -155,26 +161,32 @@ class MainActivity : FragmentActivity() {
walletViewModel = walletViewModel,
)
} else {
val isAuthenticated by appViewModel.isAuthenticated.collectAsStateWithLifecycle()

IsOnlineTracker(appViewModel)
ContentView(
appViewModel = appViewModel,
walletViewModel = walletViewModel,
blocktankViewModel = blocktankViewModel,
currencyViewModel = currencyViewModel,
activityListViewModel = activityListViewModel,
transferViewModel = transferViewModel,
settingsViewModel = settingsViewModel,
backupsViewModel = backupsViewModel,
hazeState = hazeState,
bottomSheetOverlayState = bottomSheetOverlayState,
modifier = Modifier.hazeSource(hazeState, zIndex = 0f),
)
LaunchedEffect(isAuthenticated) {
if (!isAuthenticated) {
focusManager.clearFocus(force = true)
keyboardController?.hide()
}
}
CompositionLocalProvider(LocalIsAppLocked provides !isAuthenticated) {
ContentView(
appViewModel = appViewModel,
walletViewModel = walletViewModel,
blocktankViewModel = blocktankViewModel,
currencyViewModel = currencyViewModel,
activityListViewModel = activityListViewModel,
transferViewModel = transferViewModel,
settingsViewModel = settingsViewModel,
backupsViewModel = backupsViewModel,
hazeState = hazeState,
bottomSheetOverlayState = bottomSheetOverlayState,
modifier = Modifier.hazeSource(hazeState, zIndex = 0f),
)
}

AnimatedVisibility(
visible = !isAuthenticated,
enter = fadeIn(),
enter = EnterTransition.None,
exit = fadeOut(),
) {
AuthCheckView(
Expand Down Expand Up @@ -208,7 +220,7 @@ class MainActivity : FragmentActivity() {
}

val transactionSheetDetails by appViewModel.transactionSheet.collectAsStateWithLifecycle()
if (transactionSheetDetails != NewTransactionSheetDetails.EMPTY) {
if (isAuthenticated && transactionSheetDetails != NewTransactionSheetDetails.EMPTY) {
NewTransactionSheet(
appViewModel = appViewModel,
bottomSheetOverlayState = bottomSheetOverlayState,
Expand Down Expand Up @@ -299,6 +311,11 @@ class MainActivity : FragmentActivity() {
intent.launchKey()?.let { outState.putString(KEY_CONSUMED_LAUNCH_INTENT, it) }
}

override fun onStop() {
super.onStop()
if (!isChangingConfigurations) appViewModel.lockOnBackground()
}

override fun onDestroy() {
super.onDestroy()
if (!settingsViewModel.notificationsGranted.value) {
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/ui/scaffold/AppAlertDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.compose.ui.semantics.testTagsAsResourceId
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.DialogProperties
import to.bitkit.R
import to.bitkit.ui.LocalIsAppLocked
import to.bitkit.ui.components.BodyM
import to.bitkit.ui.components.BodyMSB
import to.bitkit.ui.components.Title
Expand Down Expand Up @@ -71,6 +72,7 @@ fun AppAlertDialog(
),
textContent: @Composable () -> Unit,
) {
if (LocalIsAppLocked.current) return
AlertDialog(
onDismissRequest = onDismissRequest,
confirmButton = {
Expand Down
Loading
Loading