Skip to content

Commit

Permalink
feat: Show e2ei certificate in device details screen - PART 1 (WPB-32…
Browse files Browse the repository at this point in the history
…14) (#2316)
  • Loading branch information
ohassine committed Oct 25, 2023
1 parent d939a9b commit 7320d6b
Show file tree
Hide file tree
Showing 18 changed files with 566 additions and 11 deletions.
Expand Up @@ -19,14 +19,13 @@ package com.wire.android.di.accountScoped

import com.wire.android.di.CurrentAccount
import com.wire.android.di.KaliumCoreLogic
import dagger.Module
import dagger.Provides
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.asset.DeleteAssetUseCase
import com.wire.kalium.logic.feature.asset.GetAssetSizeLimitUseCase
import com.wire.kalium.logic.feature.asset.GetAvatarAssetUseCase
import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversationUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.GetE2eiCertificateUseCase
import com.wire.kalium.logic.feature.publicuser.GetAllContactsUseCase
import com.wire.kalium.logic.feature.publicuser.GetKnownUserUseCase
import com.wire.kalium.logic.feature.publicuser.RefreshUsersWithoutMetadataUseCase
Expand All @@ -49,6 +48,8 @@ import com.wire.kalium.logic.feature.user.readReceipts.ObserveReadReceiptsEnable
import com.wire.kalium.logic.feature.user.readReceipts.PersistReadReceiptsStatusConfigUseCase
import com.wire.kalium.logic.feature.user.typingIndicator.ObserveTypingIndicatorEnabledUseCase
import com.wire.kalium.logic.feature.user.typingIndicator.PersistTypingIndicatorStatusConfigUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.scopes.ViewModelScoped
Expand Down Expand Up @@ -212,4 +213,9 @@ class UserModule {
@Provides
fun provideSetUserHandleUseCase(userScope: UserScope): SetUserHandleUseCase =
userScope.setUserHandle

@ViewModelScoped
@Provides
fun provideGetE2EICertificateUseCase(userScope: UserScope): GetE2eiCertificateUseCase =
userScope.getE2EICertificate
}
Expand Up @@ -34,6 +34,7 @@ import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootNavGraph
import com.wire.android.BuildConfig
import com.wire.android.R
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.Navigator
import com.wire.android.ui.authentication.devices.model.Device
import com.wire.android.ui.authentication.devices.model.lastActiveDescription
Expand All @@ -54,6 +55,7 @@ import com.wire.android.ui.common.dimensions
import com.wire.android.ui.common.scaffold.WireScaffold
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.topappbar.WireTopAppBarTitle
import com.wire.android.ui.destinations.E2eiCertificateDetailsScreenDestination
import com.wire.android.ui.home.conversationslist.common.FolderHeader
import com.wire.android.ui.settings.devices.model.DeviceDetailsState
import com.wire.android.ui.theme.wireColorScheme
Expand Down Expand Up @@ -86,7 +88,13 @@ fun DeviceDetailsScreen(
onDialogDismiss = viewModel::onDialogDismissed,
onErrorDialogDismiss = viewModel::clearDeleteClientError,
onNavigateBack = navigator::navigateBack,
onUpdateClientVerification = viewModel::onUpdateVerificationStatus
onUpdateClientVerification = viewModel::onUpdateVerificationStatus,
enrollE2eiCertificate = viewModel::enrollE2eiCertificate,
onNavigateToE2eiCertificateDetailsScreen = {
navigator.navigate(
NavigationCommand(E2eiCertificateDetailsScreenDestination(it))
)
}
)
}
}
Expand All @@ -96,10 +104,12 @@ fun DeviceDetailsContent(
state: DeviceDetailsState,
onDeleteDevice: () -> Unit = {},
onNavigateBack: () -> Unit = {},
onNavigateToE2eiCertificateDetailsScreen: (String) -> Unit = {},
onPasswordChange: (TextFieldValue) -> Unit = {},
onRemoveConfirm: () -> Unit = {},
onDialogDismiss: () -> Unit = {},
onErrorDialogDismiss: () -> Unit = {},
enrollE2eiCertificate: () -> Unit = {},
onUpdateClientVerification: (Boolean) -> Unit = {}
) {
val screenState = rememberConversationScreenState()
Expand Down Expand Up @@ -151,7 +161,17 @@ fun DeviceDetailsContent(
Divider(color = MaterialTheme.wireColorScheme.background)
}
}

item {
EndToEndIdentityCertificateItem(
isE2eiCertificateActivated = state.isE2eiCertificateActivated,
certificate = state.e2eiCertificate,
isSelfClient = state.isSelfClient,
enrollE2eiCertificate = enrollE2eiCertificate,
updateE2eiCertificate = {},
showCertificate = onNavigateToE2eiCertificateDetailsScreen
)
Divider(color = colorsScheme().background)
}
item {
FolderHeader(
name = stringResource(id = R.string.label_proteus_details).uppercase(),
Expand Down Expand Up @@ -366,7 +386,8 @@ private fun VerificationDescription(
text = stringResource(
id = R.string.label_client_verification_description,
userName ?: stringResource(id = R.string.unknown_user_name)
), leanMoreLink = stringResource(id = R.string.url_self_client_verification_learn_more)
),
leanMoreLink = stringResource(id = R.string.url_self_client_verification_learn_more)
)
}

Expand All @@ -382,7 +403,10 @@ private fun VerificationDescription(
leanMoreLink = stringResource(id = R.string.url_self_client_fingerprint_learn_more)
)
} else {
DescriptionText(text = stringResource(id = R.string.label_fingerprint_description), leanMoreLink = null)
DescriptionText(
text = stringResource(id = R.string.label_fingerprint_description),
leanMoreLink = null
)
}
}
}
Expand Down Expand Up @@ -426,7 +450,11 @@ private fun DescriptionText(

ClickableText(text = annotatedString, onClick = { offset ->
leanMoreLink?.let {
annotatedString.getStringAnnotations(tag = "learn_more", start = offset, end = offset).firstOrNull()?.let {
annotatedString.getStringAnnotations(
tag = "learn_more",
start = offset,
end = offset
).firstOrNull()?.let {
CustomTabsHelper.launchUrl(context, it.item)
}
}
Expand Down Expand Up @@ -492,6 +520,7 @@ fun PreviewDeviceDetailsScreen() {
isCurrentDevice = false
),
onPasswordChange = { },
enrollE2eiCertificate = { },
onRemoveConfirm = { },
onDialogDismiss = { },
onErrorDialogDismiss = { }
Expand Down
Expand Up @@ -23,13 +23,16 @@ import com.wire.kalium.logic.feature.client.DeleteClientUseCase
import com.wire.kalium.logic.feature.client.GetClientDetailsResult
import com.wire.kalium.logic.feature.client.ObserveClientDetailsUseCase
import com.wire.kalium.logic.feature.client.UpdateClientVerificationStatusUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.GetE2EICertificateUseCaseResult
import com.wire.kalium.logic.feature.e2ei.usecase.GetE2eiCertificateUseCase
import com.wire.kalium.logic.feature.user.GetUserInfoResult
import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase
import com.wire.kalium.logic.feature.user.ObserveUserInfoUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject

@Suppress("TooManyFunctions", "LongParameterList")
@HiltViewModel
class DeviceDetailsViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
Expand All @@ -40,7 +43,8 @@ class DeviceDetailsViewModel @Inject constructor(
private val isPasswordRequired: IsPasswordRequiredUseCase,
private val fingerprintUseCase: ClientFingerprintUseCase,
private val updateClientVerificationStatus: UpdateClientVerificationStatusUseCase,
private val observeUserInfo: ObserveUserInfoUseCase
private val observeUserInfo: ObserveUserInfoUseCase,
private val e2eiCertificate: GetE2eiCertificateUseCase
) : SavedStateViewModel(savedStateHandle) {

private val deviceDetailsNavArgs: DeviceDetailsNavArgs = savedStateHandle.navArgs()
Expand All @@ -54,6 +58,7 @@ class DeviceDetailsViewModel @Inject constructor(
observeDeviceDetails()
getClientFingerPrint()
observeUserName()
getE2eiCertificate()
}

private val isSelfClient: Boolean
Expand All @@ -74,6 +79,22 @@ class DeviceDetailsViewModel @Inject constructor(
}
}

private fun getE2eiCertificate() {
val certificate = e2eiCertificate(deviceId)
state = if (certificate is GetE2EICertificateUseCaseResult.Success) {
state.copy(
isE2eiCertificateActivated = true,
e2eiCertificate = certificate.certificate
)
} else {
state.copy(isE2eiCertificateActivated = false)
}
}

fun enrollE2eiCertificate() {
// TODO invoke correspondent use case
}

private fun getClientFingerPrint() {
viewModelScope.launch {
state = when (val result = fingerprintUseCase(userId, deviceId)) {
Expand Down

0 comments on commit 7320d6b

Please sign in to comment.