Skip to content

Commit

Permalink
feat: Use enroll mls use case (WPB-5756) (#2514)
Browse files Browse the repository at this point in the history
  • Loading branch information
borichellow committed Dec 13, 2023
1 parent d11140e commit 2050462
Show file tree
Hide file tree
Showing 11 changed files with 327 additions and 89 deletions.
Expand Up @@ -26,7 +26,6 @@ import com.wire.kalium.logic.feature.e2ei.usecase.E2EIEnrollmentResult
import com.wire.kalium.logic.feature.e2ei.usecase.EnrollE2EIUseCase
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.fold
import com.wire.kalium.logic.functional.map
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -62,10 +61,10 @@ class GetE2EICertificateUseCase @Inject constructor(
scope.launch {
when (oAuthResult) {
is OAuthUseCase.OAuthResult.Success -> {
enrollE2EI.finalizeEnrollment(
enrollmentResultHandler(enrollE2EI.finalizeEnrollment(
oAuthResult.idToken,
initialEnrollmentResult
).map { enrollmentResultHandler(Either.Right(it)) }
))
}

is OAuthUseCase.OAuthResult.Failed -> {
Expand Down
20 changes: 18 additions & 2 deletions app/src/main/kotlin/com/wire/android/ui/WireActivity.kt
Expand Up @@ -45,6 +45,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
Expand All @@ -70,6 +71,7 @@ import com.wire.android.ui.common.snackbar.LocalSnackbarHostState
import com.wire.android.ui.common.topappbar.CommonTopAppBar
import com.wire.android.ui.common.topappbar.CommonTopAppBarViewModel
import com.wire.android.ui.destinations.ConversationScreenDestination
import com.wire.android.ui.destinations.E2eiCertificateDetailsScreenDestination
import com.wire.android.ui.destinations.HomeScreenDestination
import com.wire.android.ui.destinations.ImportMediaScreenDestination
import com.wire.android.ui.destinations.IncomingCallScreenDestination
Expand All @@ -81,6 +83,7 @@ import com.wire.android.ui.destinations.SelfDevicesScreenDestination
import com.wire.android.ui.destinations.SelfUserProfileScreenDestination
import com.wire.android.ui.destinations.WelcomeScreenDestination
import com.wire.android.ui.home.E2EIRequiredDialog
import com.wire.android.ui.home.E2EIResultDialog
import com.wire.android.ui.home.E2EISnoozeDialog
import com.wire.android.ui.home.appLock.LockCodeTimeManager
import com.wire.android.ui.home.sync.FeatureFlagNotificationViewModel
Expand Down Expand Up @@ -273,6 +276,7 @@ class WireActivity : AppCompatActivity() {
LaunchedEffect(userId) {
featureFlagNotificationViewModel.loadInitialSync()
}
val context = LocalContext.current
with(featureFlagNotificationViewModel.featureFlagState) {
if (shouldShowTeamAppLockDialog) {
TeamAppLockFeatureFlagDialog(
Expand Down Expand Up @@ -339,8 +343,9 @@ class WireActivity : AppCompatActivity() {

e2EIRequired?.let {
E2EIRequiredDialog(
result = e2EIRequired,
getCertificate = featureFlagNotificationViewModel::getE2EICertificate,
e2EIRequired = e2EIRequired,
isE2EILoading = isE2EILoading,
getCertificate = { featureFlagNotificationViewModel.getE2EICertificate(it, context) },
snoozeDialog = featureFlagNotificationViewModel::snoozeE2EIdRequiredDialog
)
}
Expand All @@ -352,6 +357,17 @@ class WireActivity : AppCompatActivity() {
)
}

e2EIResult?.let {
E2EIResultDialog(
result = e2EIResult,
updateCertificate = { featureFlagNotificationViewModel.getE2EICertificate(it, context) },
snoozeDialog = featureFlagNotificationViewModel::snoozeE2EIdRequiredDialog,
openCertificateDetails = { navigate(NavigationCommand(E2eiCertificateDetailsScreenDestination(it))) },
dismissSuccessDialog = featureFlagNotificationViewModel::dismissSuccessE2EIdDialog,
isE2EILoading = isE2EILoading
)
}

UpdateAppDialog(viewModel.globalAppState.updateAppDialog, ::updateTheApp)
JoinConversationDialog(
viewModel.globalAppState.conversationJoinedDialog,
Expand Down
125 changes: 101 additions & 24 deletions app/src/main/kotlin/com/wire/android/ui/home/E2EIDialogs.kt
Expand Up @@ -50,36 +50,77 @@ import kotlin.time.Duration.Companion.seconds

@Composable
fun E2EIRequiredDialog(
result: FeatureFlagState.E2EIRequired,
getCertificate: () -> Unit,
e2EIRequired: FeatureFlagState.E2EIRequired,
isE2EILoading: Boolean,
getCertificate: (FeatureFlagState.E2EIRequired) -> Unit,
snoozeDialog: (FeatureFlagState.E2EIRequired.WithGracePeriod) -> Unit,
) {
when (result) {
FeatureFlagState.E2EIRequired.NoGracePeriod.Create -> E2EIRequiredNoSnoozeDialog(getCertificate = getCertificate)
FeatureFlagState.E2EIRequired.NoGracePeriod.Renew -> E2EIRenewNoSnoozeDialog(updateCertificate = getCertificate)
when (e2EIRequired) {
FeatureFlagState.E2EIRequired.NoGracePeriod.Create -> E2EIRequiredNoSnoozeDialog(
isLoading = isE2EILoading,
getCertificate = { getCertificate(e2EIRequired) }
)

FeatureFlagState.E2EIRequired.NoGracePeriod.Renew -> E2EIRenewNoSnoozeDialog(
isLoading = isE2EILoading,
updateCertificate = { getCertificate(e2EIRequired) }
)

is FeatureFlagState.E2EIRequired.WithGracePeriod.Create -> E2EIRequiredWithSnoozeDialog(
getCertificate = getCertificate,
snoozeDialog = { snoozeDialog(result) }
isLoading = isE2EILoading,
getCertificate = { getCertificate(e2EIRequired) },
snoozeDialog = { snoozeDialog(e2EIRequired) }
)

is FeatureFlagState.E2EIRequired.WithGracePeriod.Renew -> E2EIRenewWithSnoozeDialog(
updateCertificate = getCertificate,
snoozeDialog = { snoozeDialog(result) }
isLoading = isE2EILoading,
updateCertificate = { getCertificate(e2EIRequired) },
snoozeDialog = { snoozeDialog(e2EIRequired) }
)
}
}

@Composable
fun E2EIResultDialog(
result: FeatureFlagState.E2EIResult,
isE2EILoading: Boolean,
updateCertificate: (FeatureFlagState.E2EIRequired) -> Unit,
snoozeDialog: (FeatureFlagState.E2EIRequired.WithGracePeriod) -> Unit,
openCertificateDetails: (String) -> Unit,
dismissSuccessDialog: () -> Unit
) {
when (result) {
is FeatureFlagState.E2EIResult.Failure -> E2EIRenewErrorDialog(
e2EIRequired = result.e2EIRequired,
isE2EILoading = isE2EILoading,
updateCertificate = { updateCertificate(result.e2EIRequired) },
snoozeDialog = snoozeDialog
)

is FeatureFlagState.E2EIResult.Success -> E2EISuccessDialog(
openCertificateDetails = { openCertificateDetails(result.certificate) },
dismissDialog = dismissSuccessDialog
)
}
}

@Composable
fun E2EIRenewErrorDialog(
result: FeatureFlagState.E2EIRequired,
e2EIRequired: FeatureFlagState.E2EIRequired,
isE2EILoading: Boolean,
updateCertificate: () -> Unit,
snoozeDialog: (FeatureFlagState.E2EIRequired.WithGracePeriod) -> Unit,
) {
when (result) {
is FeatureFlagState.E2EIRequired.NoGracePeriod -> E2EIErrorNoSnoozeDialog(updateCertificate = updateCertificate)
when (e2EIRequired) {
is FeatureFlagState.E2EIRequired.NoGracePeriod -> E2EIErrorNoSnoozeDialog(
isE2EILoading = isE2EILoading,
updateCertificate = updateCertificate
)

is FeatureFlagState.E2EIRequired.WithGracePeriod -> E2EIErrorWithSnoozeDialog(
updateCertificate = updateCertificate,
snoozeDialog = { snoozeDialog(result) }
isE2EILoading = isE2EILoading,
snoozeDialog = { snoozeDialog(e2EIRequired) }
)
}
}
Expand Down Expand Up @@ -151,19 +192,47 @@ fun E2EISuccessDialog(
)
}

@Composable
fun E2EIErrorWithDismissDialog(
isE2EILoading: Boolean,
updateCertificate: () -> Unit,
onDismiss: () -> Unit
) {
WireDialog(
title = stringResource(id = R.string.end_to_end_identity_renew_error_dialog_title),
text = stringResource(id = R.string.end_to_end_identity_renew_error_dialog_text),
onDismiss = onDismiss,
optionButton1Properties = WireDialogButtonProperties(
onClick = updateCertificate,
text = stringResource(id = R.string.label_retry),
type = WireDialogButtonType.Primary,
loading = isE2EILoading
),
optionButton2Properties = WireDialogButtonProperties(
onClick = onDismiss,
text = stringResource(id = R.string.label_cancel),
type = WireDialogButtonType.Secondary,
),
buttonsHorizontalAlignment = false,
properties = DialogProperties(usePlatformDefaultWidth = false)
)
}

@Composable
private fun E2EIErrorWithSnoozeDialog(
isE2EILoading: Boolean,
updateCertificate: () -> Unit,
snoozeDialog: () -> Unit
) {
WireDialog(
title = stringResource(id = R.string.end_to_end_identity_renew_error_dialog_title),
text = stringResource(id = R.string.end_to_end_identity_renew_error_dialog_text),
onDismiss = updateCertificate,
onDismiss = snoozeDialog,
optionButton1Properties = WireDialogButtonProperties(
onClick = updateCertificate,
text = stringResource(id = R.string.label_retry),
type = WireDialogButtonType.Primary,
loading = isE2EILoading
),
optionButton2Properties = WireDialogButtonProperties(
onClick = snoozeDialog,
Expand All @@ -177,6 +246,7 @@ private fun E2EIErrorWithSnoozeDialog(

@Composable
private fun E2EIErrorNoSnoozeDialog(
isE2EILoading: Boolean,
updateCertificate: () -> Unit
) {
WireDialog(
Expand All @@ -187,6 +257,7 @@ private fun E2EIErrorNoSnoozeDialog(
onClick = updateCertificate,
text = stringResource(id = R.string.label_retry),
type = WireDialogButtonType.Primary,
loading = isE2EILoading
),
properties = DialogProperties(
usePlatformDefaultWidth = false,
Expand All @@ -198,6 +269,7 @@ private fun E2EIErrorNoSnoozeDialog(

@Composable
private fun E2EIRequiredWithSnoozeDialog(
isLoading: Boolean,
getCertificate: () -> Unit,
snoozeDialog: () -> Unit
) {
Expand All @@ -209,6 +281,7 @@ private fun E2EIRequiredWithSnoozeDialog(
onClick = getCertificate,
text = stringResource(id = R.string.end_to_end_identity_required_dialog_positive_button),
type = WireDialogButtonType.Primary,
loading = isLoading
),
optionButton2Properties = WireDialogButtonProperties(
onClick = snoozeDialog,
Expand All @@ -221,7 +294,7 @@ private fun E2EIRequiredWithSnoozeDialog(
}

@Composable
private fun E2EIRequiredNoSnoozeDialog(getCertificate: () -> Unit) {
private fun E2EIRequiredNoSnoozeDialog(isLoading: Boolean, getCertificate: () -> Unit) {
WireDialog(
title = stringResource(id = R.string.end_to_end_identity_required_dialog_title),
text = stringResource(id = R.string.end_to_end_identity_required_dialog_text_no_snooze),
Expand All @@ -230,6 +303,7 @@ private fun E2EIRequiredNoSnoozeDialog(getCertificate: () -> Unit) {
onClick = getCertificate,
text = stringResource(id = R.string.end_to_end_identity_required_dialog_positive_button),
type = WireDialogButtonType.Primary,
loading = isLoading
),
buttonsHorizontalAlignment = false,
properties = DialogProperties(
Expand All @@ -242,6 +316,7 @@ private fun E2EIRequiredNoSnoozeDialog(getCertificate: () -> Unit) {

@Composable
private fun E2EIRenewWithSnoozeDialog(
isLoading: Boolean,
updateCertificate: () -> Unit,
snoozeDialog: () -> Unit
) {
Expand All @@ -253,6 +328,7 @@ private fun E2EIRenewWithSnoozeDialog(
onClick = updateCertificate,
text = stringResource(id = R.string.end_to_end_identity_renew_dialog_positive_button),
type = WireDialogButtonType.Primary,
loading = isLoading
),
optionButton2Properties = WireDialogButtonProperties(
onClick = snoozeDialog,
Expand All @@ -265,7 +341,7 @@ private fun E2EIRenewWithSnoozeDialog(
}

@Composable
private fun E2EIRenewNoSnoozeDialog(updateCertificate: () -> Unit) {
private fun E2EIRenewNoSnoozeDialog(isLoading: Boolean, updateCertificate: () -> Unit) {
WireDialog(
title = stringResource(id = R.string.end_to_end_identity_renew_dialog_title),
text = stringResource(id = R.string.end_to_end_identity_renew_dialog_text_no_snooze),
Expand All @@ -274,6 +350,7 @@ private fun E2EIRenewNoSnoozeDialog(updateCertificate: () -> Unit) {
onClick = updateCertificate,
text = stringResource(id = R.string.end_to_end_identity_renew_dialog_positive_button),
type = WireDialogButtonType.Primary,
loading = isLoading
),
buttonsHorizontalAlignment = false,
properties = DialogProperties(
Expand All @@ -288,31 +365,31 @@ private fun E2EIRenewNoSnoozeDialog(updateCertificate: () -> Unit) {
@Composable
fun previewE2EIdRequiredWithSnoozeDialog() {
WireTheme {
E2EIRequiredWithSnoozeDialog({}) {}
E2EIRequiredWithSnoozeDialog(false, {}) {}
}
}

@PreviewMultipleThemes
@Composable
fun previewE2EIdRequiredNoSnoozeDialog() {
WireTheme {
E2EIRequiredNoSnoozeDialog {}
E2EIRequiredNoSnoozeDialog(false) {}
}
}

@PreviewMultipleThemes
@Composable
fun previewE2EIdRenewRequiredWithSnoozeDialog() {
WireTheme {
E2EIRenewWithSnoozeDialog({}) {}
E2EIRenewWithSnoozeDialog(false, {}) {}
}
}

@PreviewMultipleThemes
@Composable
fun previewE2EIdRenewRequiredNoSnoozeDialog() {
WireTheme {
E2EIRenewNoSnoozeDialog {}
E2EIRenewNoSnoozeDialog(false) {}
}
}

Expand All @@ -328,15 +405,15 @@ fun previewE2EIdSnoozeDialog() {
@Composable
fun previewE2EIRenewErrorDialogNoGracePeriod() {
WireTheme {
E2EIRenewErrorDialog(FeatureFlagState.E2EIRequired.NoGracePeriod.Renew, { }) {}
E2EIRenewErrorDialog(FeatureFlagState.E2EIRequired.NoGracePeriod.Renew, false, { }) {}
}
}

@PreviewMultipleThemes
@Composable
fun previewE2EIRenewErrorDialogWithGracePeriod() {
WireTheme {
E2EIRenewErrorDialog(FeatureFlagState.E2EIRequired.WithGracePeriod.Renew(2.days), { }) {}
E2EIRenewErrorDialog(FeatureFlagState.E2EIRequired.WithGracePeriod.Renew(2.days), false, { }) {}
}
}

Expand All @@ -352,14 +429,14 @@ fun previewE2EISuccessDialog() {
@Composable
fun previewE2EIRenewErrorNoSnoozeDialog() {
WireTheme {
E2EIErrorNoSnoozeDialog { }
E2EIErrorNoSnoozeDialog(false) { }
}
}

@PreviewMultipleThemes
@Composable
fun previewE2EIRenewErrorWithSnoozeDialog() {
WireTheme {
E2EIErrorWithSnoozeDialog(updateCertificate = {}) { }
E2EIErrorWithSnoozeDialog(isE2EILoading = false, updateCertificate = {}) { }
}
}
Expand Up @@ -36,6 +36,8 @@ data class FeatureFlagState(
val areSelfDeletedMessagesEnabled: Boolean = true,
val e2EIRequired: E2EIRequired? = null,
val e2EISnoozeInfo: E2EISnooze? = null,
val e2EIResult: E2EIResult? = null,
val isE2EILoading: Boolean = false,
val showCallEndedBecauseOfConversationDegraded: Boolean = false
) {
enum class SharingRestrictedState {
Expand All @@ -56,4 +58,9 @@ data class FeatureFlagState(
data object Renew : NoGracePeriod()
}
}

sealed class E2EIResult {
data class Failure(val e2EIRequired: E2EIRequired) : E2EIResult()
data class Success(val certificate: String) : E2EIResult()
}
}

0 comments on commit 2050462

Please sign in to comment.