Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.wire.kalium.logic.feature.asset.GetAssetSizeLimitUseCase
import com.wire.kalium.logic.feature.asset.GetAvatarAssetUseCase
import com.wire.kalium.logic.feature.client.FinalizeMLSClientAfterE2EIEnrollment
import com.wire.kalium.logic.feature.client.IsChatBubblesEnabledUseCase
import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase
import com.wire.kalium.logic.feature.client.IsWireCellsEnabledForConversationUseCase
import com.wire.kalium.logic.feature.client.IsWireCellsEnabledUseCase
import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversationUseCase
Expand Down Expand Up @@ -259,4 +260,9 @@ class UserModule {
@Provides
fun provideIsWireCellsEnabledForConversationUseCase(userScope: UserScope): IsWireCellsEnabledForConversationUseCase =
userScope.isWireCellsEnabledForConversation

@ViewModelScoped
@Provides
fun provideProfileQRCodeConfigUseCase(userScope: UserScope): IsProfileQRCodeEnabledUseCase =
userScope.isProfileQRCodeEnabled
}
14 changes: 12 additions & 2 deletions app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.appVersioning.ObserveIfAppUpdateRequiredUseCase
import com.wire.kalium.logic.feature.client.ClearNewClientsForUserUseCase
import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase
import com.wire.kalium.logic.feature.client.NewClientResult
import com.wire.kalium.logic.feature.client.ObserveNewClientsUseCase
import com.wire.kalium.logic.feature.conversation.CheckConversationInviteCodeUseCase
Expand Down Expand Up @@ -121,7 +122,8 @@
private val observeScreenshotCensoringConfigUseCaseProviderFactory: ObserveScreenshotCensoringConfigUseCaseProvider.Factory,
private val globalDataStore: Lazy<GlobalDataStore>,
private val observeIfE2EIRequiredDuringLoginUseCaseProviderFactory: ObserveIfE2EIRequiredDuringLoginUseCaseProvider.Factory,
private val workManager: Lazy<WorkManager>
private val workManager: Lazy<WorkManager>,
private val isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase,
) : ActionsViewModel<WireActivityViewAction>() {

var globalAppState: GlobalAppState by mutableStateOf(GlobalAppState())
Expand Down Expand Up @@ -327,7 +329,7 @@

is DeepLinkResult.MigrationLogin -> sendAction(OnMigrationLogin(result))
is DeepLinkResult.OpenConversation -> sendAction(OpenConversation(result))
is DeepLinkResult.OpenOtherUserProfile -> sendAction(OnOpenUserProfile(result))
is DeepLinkResult.OpenOtherUserProfile -> onOpenUserProfileDeepLink(result)

DeepLinkResult.SharingIntent -> sendAction(OnShowImportMediaScreen)
DeepLinkResult.Unknown -> {
Expand Down Expand Up @@ -514,6 +516,14 @@
}
}

private fun onOpenUserProfileDeepLink(result: DeepLinkResult.OpenOtherUserProfile) = viewModelScope.launch {
if (isProfileQRCodeEnabled()) {
sendAction(OnOpenUserProfile(result))
} else {
sendAction(ShowToast(R.string.profile_deeplink_feature_unavailable_title_alert))

Check warning on line 523 in app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt#L523

Added line #L523 was not covered by tests
}
}

/**
* Reset any unfinished registration process analytics where the user aborted and enabled the registration analytics.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class DebugFeatureFlagsViewModel @Inject constructor(
addFeature("Consumable Notifications", consumableNotificationsModel?.status)
addFeature("Allowed Global Operations", allowedGlobalOperationsModel?.status, allowedGlobalOperationsModel)
addFeature("Wire Cells", cellsModel?.status)
addFeature("User Profile QR code", enableUserProfileQRCodeConfigModel?.status)

add(
Feature(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

package com.wire.android.ui.userprofile.common

import android.annotation.SuppressLint
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.background
Expand Down Expand Up @@ -80,7 +79,6 @@ import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireDimensions
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.debug.FeatureVisibilityFlags.QRCodeEnabled
import com.wire.android.util.debug.LocalFeatureVisibilityFlags
import com.wire.android.util.ifNotEmpty
import com.wire.android.util.ui.PreviewMultipleThemes
Expand All @@ -98,7 +96,7 @@ import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes

@SuppressLint("ComposeParameterOrder")
@Suppress("ComposeParameterOrder", "CyclomaticComplexMethod")
@Composable
fun UserProfileInfo(
userId: UserId?,
Expand All @@ -117,7 +115,8 @@ fun UserProfileInfo(
isMLSVerified: Boolean = false,
expiresAt: Instant? = null,
onQrCodeClick: (() -> Unit)? = null,
accentId: Int = -1
accentId: Int = -1,
showQrCode: Boolean = true,
) {
Column(
horizontalAlignment = CenterHorizontally,
Expand Down Expand Up @@ -258,7 +257,7 @@ fun UserProfileInfo(
bottom.linkTo(displayName.bottom)
}
) {
if (QRCodeEnabled && isLoading.not()) {
if (showQrCode && isLoading.not()) {
onQrCodeClick?.let { QRCodeIcon(it) }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,8 @@ private fun SelfUserProfileContent(
onUserProfileClick = onChangeUserProfilePicture,
editableState = EditableState.IsEditable(onEditClick),
onQrCodeClick = onQrCodeClick,
accentId = accentId
accentId = accentId,
showQrCode = state.showQrCode,
)
}
if (state.legalHoldStatus != LegalHoldUIState.None) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,6 @@ data class SelfUserProfileState(
val isAbleToMigrateToTeamAccount: Boolean = false,
val isLoggingOut: Boolean = false,
val legalHoldStatus: LegalHoldUIState = LegalHoldUIState.None,
val accentId: Int = -1
val accentId: Int = -1,
val showQrCode: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import com.wire.kalium.logic.data.user.type.UserType
import com.wire.kalium.logic.feature.auth.LogoutUseCase
import com.wire.kalium.logic.feature.call.usecase.EndCallUseCase
import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase
import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase
import com.wire.kalium.logic.feature.legalhold.LegalHoldStateForSelfUser
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCase
import com.wire.kalium.logic.feature.personaltoteamaccount.CanMigrateFromPersonalToTeamUseCase
Expand Down Expand Up @@ -101,7 +102,8 @@ class SelfUserProfileViewModel @Inject constructor(
private val globalDataStore: GlobalDataStore,
private val qualifiedIdMapper: QualifiedIdMapper,
private val anonymousAnalyticsManager: AnonymousAnalyticsManager,
private val getTeamUrl: GetTeamUrlUseCase
private val getTeamUrl: GetTeamUrlUseCase,
private val isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase,
) : ViewModel() {

var userProfileState by mutableStateOf(SelfUserProfileState(userId = selfUserId, isAvatarLoading = true))
Expand All @@ -116,9 +118,15 @@ class SelfUserProfileViewModel @Inject constructor(
fetchIsReadOnlyAccount()
observeLegalHoldStatus()
markCreateTeamNoticeAsRead()
fetchProfileQRCodeState()
}
}

fun fetchProfileQRCodeState() = viewModelScope.launch {
val isEnabled = isProfileQRCodeEnabled()
userProfileState = userProfileState.copy(showQrCode = isEnabled)
}

suspend fun checkIfUserAbleToMigrateToTeamAccount() {
val canMigrate = canMigrateFromPersonalToTeam()
userProfileState = userProfileState.copy(isAbleToMigrateToTeamAccount = canMigrate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ object FeatureVisibilityFlags {
const val MessageEditIcon = true
const val SearchConversationMessages = true
const val DrawingIcon = true
const val QRCodeEnabled = true
}

val LocalFeatureVisibilityFlags = staticCompositionLocalOf { FeatureVisibilityFlags }
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1881,4 +1881,6 @@ In group conversations, the group admin can overwrite this setting.</string>
<string name="failed_attachment_remove">Remove</string>
<string name="content_description_apply_filter">Apply Filter</string>
<string name="content_description_filter_files">Filter files</string>

<string name="profile_deeplink_feature_unavailable_title_alert">This feature is not available. Please contact your administrator.</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.appVersioning.ObserveIfAppUpdateRequiredUseCase
import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase
import com.wire.kalium.logic.feature.client.ClearNewClientsForUserUseCase
import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase
import com.wire.kalium.logic.feature.client.NewClientResult
import com.wire.kalium.logic.feature.client.ObserveNewClientsUseCase
import com.wire.kalium.logic.feature.conversation.CheckConversationInviteCodeUseCase
Expand Down Expand Up @@ -335,6 +336,7 @@ class WireActivityViewModelTest {
val (_, viewModel) = Arrangement()
.withSomeCurrentSession()
.withDeepLinkResult(result)
.withProfileQRCodeEnabled()
.arrange()

viewModel.actions.test {
Expand Down Expand Up @@ -843,6 +845,9 @@ class WireActivityViewModelTest {
@MockK
lateinit var observeEstablishedCalls: ObserveEstablishedCallsUseCase

@MockK
lateinit var isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase

private val viewModel by lazy {
WireActivityViewModel(
coreLogic = { coreLogic },
Expand All @@ -862,7 +867,8 @@ class WireActivityViewModelTest {
observeScreenshotCensoringConfigUseCaseProviderFactory = observeScreenshotCensoringConfigUseCaseProviderFactory,
globalDataStore = { globalDataStore },
observeIfE2EIRequiredDuringLoginUseCaseProviderFactory = observeIfE2EIRequiredDuringLoginUseCaseProviderFactory,
workManager = { workManager }
workManager = { workManager },
isProfileQRCodeEnabled = isProfileQRCodeEnabled,
)
}

Expand Down Expand Up @@ -982,6 +988,10 @@ class WireActivityViewModelTest {
coEvery { globalDataStore.selectedThemeOptionFlow() } returns flowOf(themeOption)
}

suspend fun withProfileQRCodeEnabled(isEnabled: Boolean = true) = apply {
coEvery { isProfileQRCodeEnabled() } returns isEnabled
}

fun arrange() = this to viewModel
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,21 @@ import com.wire.android.framework.TestUser
import com.wire.android.mapper.OtherAccountMapper
import com.wire.android.notification.WireNotificationManager
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.common.functional.Either
import com.wire.kalium.logic.data.id.QualifiedIdMapper
import com.wire.kalium.logic.feature.auth.LogoutUseCase
import com.wire.kalium.logic.feature.call.usecase.EndCallUseCase
import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase
import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase
import com.wire.kalium.logic.feature.legalhold.LegalHoldStateForSelfUser
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCase
import com.wire.kalium.logic.feature.personaltoteamaccount.CanMigrateFromPersonalToTeamUseCase
import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.IsReadOnlyAccountUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveValidAccountsUseCase
import com.wire.kalium.logic.feature.user.UpdateSelfAvailabilityStatusUseCase
import com.wire.kalium.common.functional.Either
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.impl.annotations.MockK
Expand Down Expand Up @@ -105,6 +106,9 @@ class SelfUserProfileViewModelArrangement {
@MockK
lateinit var getTeamUrl: GetTeamUrlUseCase

@MockK
lateinit var profileQRCodeEnabledUseCase: IsProfileQRCodeEnabledUseCase

private val viewModel by lazy {
SelfUserProfileViewModel(
selfUserId = TestUser.SELF_USER.id,
Expand All @@ -126,7 +130,8 @@ class SelfUserProfileViewModelArrangement {
qualifiedIdMapper = qualifiedIdMapper,
anonymousAnalyticsManager = anonymousAnalyticsManager,
canMigrateFromPersonalToTeam = canMigrateFromPersonalToTeam,
getTeamUrl = getTeamUrl
getTeamUrl = getTeamUrl,
isProfileQRCodeEnabled = profileQRCodeEnabledUseCase,
)
}

Expand All @@ -142,6 +147,7 @@ class SelfUserProfileViewModelArrangement {
coEvery { observeEstablishedCalls.invoke() } returns flowOf(emptyList())
coEvery { canMigrateFromPersonalToTeam.invoke() } returns true
coEvery { getTeamUrl.invoke() } returns ""
coEvery { profileQRCodeEnabledUseCase.invoke() } returns true
}

fun withLegalHoldStatus(result: LegalHoldStateForSelfUser) = apply {
Expand Down