diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceEducationSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceAuthEducationSheet.kt
similarity index 97%
rename from app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceEducationSheet.kt
rename to app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceAuthEducationSheet.kt
index 02bda509ed..ae43bd7d3f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceEducationSheet.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceAuthEducationSheet.kt
@@ -27,7 +27,7 @@ import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment
/**
* Education sheet shown before biometrics when linking a device
*/
-class LinkDeviceEducationSheet : ComposeBottomSheetDialogFragment() {
+class LinkDeviceAuthEducationSheet : ComposeBottomSheetDialogFragment() {
override val peekHeightPercentage: Float = 0.67f
diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceFragment.kt
index 1cb9292a32..18ecc3477f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceFragment.kt
@@ -157,6 +157,15 @@ class LinkDeviceFragment : ComposeFragment() {
}
}
+ LaunchedEffect(state.seenBioAuthEducationSheet) {
+ if (state.seenBioAuthEducationSheet) {
+ if (!biometricAuth.authenticate(requireContext(), true) { biometricDeviceLockLauncher.launch(getString(R.string.LinkDeviceFragment__unlock_to_link)) }) {
+ navController.safeNavigate(R.id.action_linkDeviceFragment_to_addLinkDeviceFragment)
+ }
+ viewModel.markBioAuthEducationSheetSeen(false)
+ }
+ }
+
Scaffolds.Settings(
title = stringResource(id = R.string.preferences__linked_devices),
onNavigationClick = { navController.popOrFinish() },
@@ -167,7 +176,7 @@ class LinkDeviceFragment : ComposeFragment() {
state = state,
modifier = Modifier.padding(contentPadding),
onLearnMoreClicked = { navController.safeNavigate(R.id.action_linkDeviceFragment_to_linkDeviceLearnMoreBottomSheet) },
- onLinkNewDeviceClicked = { navController.navigateToQrScannerIfAuthed(state.seenBioAuthEducationSheet) },
+ onLinkNewDeviceClicked = { navController.navigateToQrScannerIfAuthed(!state.needsBioAuthEducationSheet) },
onDeviceSelectedForRemoval = { device -> viewModel.setDeviceToRemove(device) },
onDeviceRemovalConfirmed = { device -> viewModel.removeDevice(device) },
onSyncFailureRetryRequested = { viewModel.onSyncErrorRetryRequested() },
@@ -181,8 +190,10 @@ class LinkDeviceFragment : ComposeFragment() {
}
private fun NavController.navigateToQrScannerIfAuthed(seenEducation: Boolean) {
- if (seenEducation) {
- this.safeNavigate(R.id.action_linkDeviceFragment_to_addLinkDeviceFragment)
+ if (seenEducation && biometricAuth.canAuthenticate(requireContext())) {
+ if (!biometricAuth.authenticate(requireContext(), true) { biometricDeviceLockLauncher.launch(getString(R.string.LinkDeviceFragment__unlock_to_link)) }) {
+ this.safeNavigate(R.id.action_linkDeviceFragment_to_addLinkDeviceFragment)
+ }
} else if (biometricAuth.canAuthenticate(requireContext())) {
this.safeNavigate(R.id.action_linkDeviceFragment_to_linkDeviceEducationSheet)
} else {
@@ -290,7 +301,9 @@ fun DeviceListScreen(
Buttons.LargeTonal(
onClick = onLinkNewDeviceClicked,
- modifier = Modifier.defaultMinSize(300.dp).padding(bottom = 8.dp)
+ modifier = Modifier
+ .defaultMinSize(300.dp)
+ .padding(bottom = 8.dp)
) {
Text(stringResource(id = R.string.LinkDeviceFragment__link_a_new_device))
}
@@ -394,7 +407,10 @@ fun DeviceRow(device: Device, setDeviceToRemove: (Device) -> Unit, onEditDevice:
)
Column(
- modifier = Modifier.align(Alignment.CenterVertically).padding(start = 16.dp).weight(1f)
+ modifier = Modifier
+ .align(Alignment.CenterVertically)
+ .padding(start = 16.dp)
+ .weight(1f)
) {
Text(text = titleString, style = MaterialTheme.typography.bodyLarge)
Text(stringResource(R.string.DeviceListItem_linked_s, linkedDate), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant)
@@ -405,7 +421,9 @@ fun DeviceRow(device: Device, setDeviceToRemove: (Device) -> Unit, onEditDevice:
Icon(
painterResource(id = R.drawable.symbol_more_vertical),
contentDescription = null,
- modifier = Modifier.padding(top = 16.dp, end = 16.dp).clickable { menuController.show() }
+ modifier = Modifier
+ .padding(top = 16.dp, end = 16.dp)
+ .clickable { menuController.show() }
)
DropdownMenus.Menu(controller = menuController, offsetX = 16.dp, offsetY = 4.dp) { controller ->
diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceSettingsState.kt
index 0e7c3adc23..ecbf53a91c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceSettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceSettingsState.kt
@@ -18,7 +18,8 @@ data class LinkDeviceSettingsState(
val linkUri: Uri? = null,
val linkDeviceResult: LinkDeviceResult = LinkDeviceResult.None,
val seenQrEducationSheet: Boolean = SignalStore.uiHints.hasSeenLinkDeviceQrEducationSheet() || SignalStore.account.hasLinkedDevices,
- val seenBioAuthEducationSheet: Boolean = SignalStore.uiHints.hasSeenLinkDeviceAuthSheet() || SignalStore.account.hasLinkedDevices,
+ val seenBioAuthEducationSheet: Boolean = false,
+ val needsBioAuthEducationSheet: Boolean = !seenBioAuthEducationSheet && !SignalStore.uiHints.hasSeenLinkDeviceAuthSheet() && !SignalStore.account.hasLinkedDevices,
val bottomSheetVisible: Boolean = false,
val deviceToEdit: Device? = null
) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceViewModel.kt
index 522bcc97cb..c76f19dd12 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/linkdevice/LinkDeviceViewModel.kt
@@ -197,7 +197,10 @@ class LinkDeviceViewModel : ViewModel() {
fun markBioAuthEducationSheetSeen(seen: Boolean) {
SignalStore.uiHints.markHasSeenLinkDeviceAuthSheet()
_state.update {
- it.copy(seenBioAuthEducationSheet = seen)
+ it.copy(
+ seenBioAuthEducationSheet = seen,
+ needsBioAuthEducationSheet = false
+ )
}
}
diff --git a/app/src/main/res/navigation/app_settings_with_change_number.xml b/app/src/main/res/navigation/app_settings_with_change_number.xml
index 239b7c6951..b65253f301 100644
--- a/app/src/main/res/navigation/app_settings_with_change_number.xml
+++ b/app/src/main/res/navigation/app_settings_with_change_number.xml
@@ -269,7 +269,7 @@
android:name="org.thoughtcrime.securesms.linkdevice.LinkDeviceLearnMoreBottomSheetFragment" />
+ android:name="org.thoughtcrime.securesms.linkdevice.LinkDeviceAuthEducationSheet" />