Skip to content

Commit 5272b03

Browse files
committed
Merge branch 'develop' into fix/keyboard-navigation-conversations
2 parents 4b60fe6 + d7e2257 commit 5272b03

12 files changed

Lines changed: 167 additions & 17 deletions

File tree

app/src/main/kotlin/com/wire/android/di/accountScoped/DebugModule.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import com.wire.kalium.logic.feature.debug.GetDebugE2EICertificateExpirationUseC
2727
import com.wire.kalium.logic.feature.debug.GetFeatureConfigUseCase
2828
import com.wire.kalium.logic.feature.debug.GetConversationCryptoStatsUseCase
2929
import com.wire.kalium.logic.feature.debug.GetConversationEpochFromCCUseCase
30+
import com.wire.kalium.logic.feature.debug.ObserveDebugCRLExpirationAfterOneMinuteUseCase
3031
import com.wire.kalium.logic.feature.debug.RepairFaultyRemovalKeysUseCase
32+
import com.wire.kalium.logic.feature.debug.SetDebugCRLExpirationAfterOneMinuteUseCase
3133
import com.wire.kalium.logic.feature.debug.SetDebugE2EICertificateExpirationUseCase
3234
import dagger.Module
3335
import dagger.Provides
@@ -94,6 +96,20 @@ class DebugModule {
9496
fun provideSetDebugE2EICertificateExpirationUseCase(debugScope: DebugScope): SetDebugE2EICertificateExpirationUseCase =
9597
debugScope.setDebugE2EICertificateExpiration
9698

99+
@ViewModelScoped
100+
@Provides
101+
fun provideObserveDebugCRLExpirationAfterOneMinuteUseCase(
102+
debugScope: DebugScope
103+
): ObserveDebugCRLExpirationAfterOneMinuteUseCase =
104+
debugScope.observeDebugCRLExpirationAfterOneMinute
105+
106+
@ViewModelScoped
107+
@Provides
108+
fun provideSetDebugCRLExpirationAfterOneMinuteUseCase(
109+
debugScope: DebugScope
110+
): SetDebugCRLExpirationAfterOneMinuteUseCase =
111+
debugScope.setDebugCRLExpirationAfterOneMinute
112+
97113
@ViewModelScoped
98114
@Provides
99115
fun provideGetConversationEpochFromCCUseCase(debugScope: DebugScope): GetConversationEpochFromCCUseCase =

app/src/main/kotlin/com/wire/android/ui/debug/DebugDataOptions.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ fun DebugDataOptions(
8686
handleE2EIEnrollmentResult = viewModel::handleE2EIEnrollmentResult,
8787
dismissCertificateDialog = viewModel::dismissCertificateDialog,
8888
checkCrlRevocationList = viewModel::checkCrlRevocationList,
89+
forceCRLExpirationAfterOneMinute = viewModel.state.forceCRLExpirationAfterOneMinute,
90+
onForceCRLExpirationAfterOneMinuteChange = viewModel::forceCRLExpirationAfterOneMinute,
8991
onResendFCMToken = viewModel::forceSendFCMToken,
9092
onEnableAsyncNotificationsChange = viewModel::enableAsyncNotifications,
9193
onShowFeatureFlags = onShowFeatureFlags,
@@ -110,6 +112,8 @@ fun DebugDataOptionsContent(
110112
handleE2EIEnrollmentResult: (FinalizeEnrollmentResult) -> Unit,
111113
dismissCertificateDialog: () -> Unit,
112114
checkCrlRevocationList: () -> Unit,
115+
forceCRLExpirationAfterOneMinute: Boolean,
116+
onForceCRLExpirationAfterOneMinuteChange: (Boolean) -> Unit,
113117
onResendFCMToken: () -> Unit,
114118
onShowFeatureFlags: () -> Unit,
115119
onShowCryptoStats: () -> Unit,
@@ -248,6 +252,8 @@ fun DebugDataOptionsContent(
248252
onRestartSlowSyncForRecovery = onRestartSlowSyncForRecovery,
249253
onForceUpdateApiVersions = onForceUpdateApiVersions,
250254
checkCrlRevocationList = checkCrlRevocationList,
255+
forceCRLExpirationAfterOneMinute = forceCRLExpirationAfterOneMinute,
256+
onForceCRLExpirationAfterOneMinuteChange = onForceCRLExpirationAfterOneMinuteChange,
251257
onResendFCMToken = onResendFCMToken,
252258
isAsyncNotificationsEnabled = state.isAsyncNotificationsEnabled,
253259
onEnableAsyncNotificationsChange = onEnableAsyncNotificationsChange
@@ -408,6 +414,8 @@ fun PreviewOtherDebugOptions() = WireTheme {
408414
handleE2EIEnrollmentResult = {},
409415
dismissCertificateDialog = {},
410416
checkCrlRevocationList = {},
417+
forceCRLExpirationAfterOneMinute = false,
418+
onForceCRLExpirationAfterOneMinuteChange = {},
411419
onResendFCMToken = {},
412420
onEnableAsyncNotificationsChange = {},
413421
onShowFeatureFlags = {},

app/src/main/kotlin/com/wire/android/ui/debug/DebugDataOptionsState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ data class DebugDataOptionsState(
2626
val showCertificate: Boolean = false,
2727
val startGettingE2EICertificate: Boolean = false,
2828
val e2eiCertificateExpirationSeconds: Long = 360L,
29+
val forceCRLExpirationAfterOneMinute: Boolean = false,
2930
val analyticsTrackingId: String = "null",
3031
val isFederationEnabled: Boolean = false,
3132
val currentApiVersion: String = "null",

app/src/main/kotlin/com/wire/android/ui/debug/DebugDataOptionsViewModel.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ import com.wire.kalium.logic.feature.debug.StartUsingAsyncNotificationsResult
4545
import com.wire.kalium.logic.feature.debug.StartUsingAsyncNotificationsUseCase
4646
import com.wire.kalium.logic.feature.debug.GetDebugE2EICertificateExpirationUseCase
4747
import com.wire.kalium.logic.feature.debug.MIN_DEBUG_E2EI_CERTIFICATE_EXPIRATION_SECONDS
48+
import com.wire.kalium.logic.feature.debug.ObserveDebugCRLExpirationAfterOneMinuteUseCase
49+
import com.wire.kalium.logic.feature.debug.SetDebugCRLExpirationAfterOneMinuteUseCase
4850
import com.wire.kalium.logic.feature.debug.SetDebugE2EICertificateExpirationUseCase
4951
import com.wire.kalium.logic.feature.debug.TargetedRepairParam
5052
import com.wire.kalium.logic.feature.e2ei.CheckCrlRevocationListUseCase
@@ -79,6 +81,7 @@ interface DebugDataOptionsViewModel {
7981
val e2eiCertificateExpirationInputState: TextFieldState get() = TextFieldState("6")
8082
fun currentAccount(): UserId = UserId("value", "domain")
8183
fun checkCrlRevocationList() {}
84+
fun forceCRLExpirationAfterOneMinute(enabled: Boolean) {}
8285
fun restartSlowSyncForRecovery() {}
8386
fun enrollE2EICertificate() {}
8487
fun updateE2EICertificateExpiration(seconds: Long) {}
@@ -113,6 +116,8 @@ class DebugDataOptionsViewModelImpl
113116
private val repairFaultyRemovalKeys: RepairFaultyRemovalKeysUseCase,
114117
private val getDebugE2EICertificateExpiration: GetDebugE2EICertificateExpirationUseCase,
115118
private val setDebugE2EICertificateExpiration: SetDebugE2EICertificateExpirationUseCase,
119+
private val observeDebugCRLExpirationAfterOneMinute: ObserveDebugCRLExpirationAfterOneMinuteUseCase,
120+
private val setDebugCRLExpirationAfterOneMinute: SetDebugCRLExpirationAfterOneMinuteUseCase,
116121
) : ViewModel(), DebugDataOptionsViewModel {
117122
private companion object {
118123
val DEFAULT_DEBUG_E2EI_CERTIFICATE_EXPIRATION_SECONDS = 90.days.inWholeSeconds
@@ -133,6 +138,7 @@ class DebugDataOptionsViewModelImpl
133138
init {
134139
observeAsyncNotificationsEnabledData()
135140
observeMlsMetadata()
141+
observeDebugCRLExpiration()
136142
observeE2EICertificateExpirationInput()
137143
setGitHashAndDeviceId()
138144
setAnalyticsTrackingId()
@@ -205,6 +211,15 @@ class DebugDataOptionsViewModelImpl
205211
}
206212
}
207213

214+
override fun forceCRLExpirationAfterOneMinute(enabled: Boolean) {
215+
viewModelScope.launch {
216+
setDebugCRLExpirationAfterOneMinute(enabled)
217+
if (enabled) {
218+
checkCrlRevocationList(forceUpdate = true)
219+
}
220+
}
221+
}
222+
208223
override fun restartSlowSyncForRecovery() {
209224
viewModelScope.launch {
210225
restartSlowSyncProcessForRecovery()
@@ -373,6 +388,14 @@ class DebugDataOptionsViewModelImpl
373388
}
374389
}
375390

391+
private fun observeDebugCRLExpiration() {
392+
viewModelScope.launch {
393+
observeDebugCRLExpirationAfterOneMinute().collect { enabled ->
394+
state = state.copy(forceCRLExpirationAfterOneMinute = enabled)
395+
}
396+
}
397+
}
398+
376399
private fun loadDebugE2EICertificateExpiration() {
377400
viewModelScope.launch {
378401
val currentExpiration = getDebugE2EICertificateExpiration()

app/src/main/kotlin/com/wire/android/ui/debug/DebugToolsOptions.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ private fun DebugToolsOptionsPreview() {
4949
onRestartSlowSyncForRecovery = {},
5050
onForceUpdateApiVersions = {},
5151
checkCrlRevocationList = {},
52+
forceCRLExpirationAfterOneMinute = false,
53+
onForceCRLExpirationAfterOneMinuteChange = {},
5254
onResendFCMToken = {},
5355
isAsyncNotificationsEnabled = true,
5456
onEnableAsyncNotificationsChange = {}
@@ -63,6 +65,8 @@ internal fun DebugToolsOptions(
6365
onRestartSlowSyncForRecovery: () -> Unit,
6466
onForceUpdateApiVersions: () -> Unit,
6567
checkCrlRevocationList: () -> Unit,
68+
forceCRLExpirationAfterOneMinute: Boolean,
69+
onForceCRLExpirationAfterOneMinuteChange: (Boolean) -> Unit,
6670
onResendFCMToken: () -> Unit,
6771
isAsyncNotificationsEnabled: Boolean,
6872
onEnableAsyncNotificationsChange: (Boolean) -> Unit,
@@ -76,6 +80,8 @@ internal fun DebugToolsOptions(
7680
onRestartSlowSyncForRecovery = onRestartSlowSyncForRecovery,
7781
onForceUpdateApiVersions = onForceUpdateApiVersions,
7882
checkCrlRevocationList = checkCrlRevocationList,
83+
forceCRLExpirationAfterOneMinute = forceCRLExpirationAfterOneMinute,
84+
onForceCRLExpirationAfterOneMinuteChange = onForceCRLExpirationAfterOneMinuteChange,
7985
isAsyncNotificationsEnabled = isAsyncNotificationsEnabled,
8086
onEnableAsyncNotificationsChange = onEnableAsyncNotificationsChange
8187
)
@@ -91,6 +97,8 @@ private fun PrivateBuildDebugToolsOptions(
9197
onRestartSlowSyncForRecovery: () -> Unit,
9298
onForceUpdateApiVersions: () -> Unit,
9399
checkCrlRevocationList: () -> Unit,
100+
forceCRLExpirationAfterOneMinute: Boolean,
101+
onForceCRLExpirationAfterOneMinuteChange: (Boolean) -> Unit,
94102
isAsyncNotificationsEnabled: Boolean,
95103
onEnableAsyncNotificationsChange: (Boolean) -> Unit,
96104
) {
@@ -100,6 +108,10 @@ private fun PrivateBuildDebugToolsOptions(
100108
onCheckedChange = onDisableEventProcessingChange
101109
)
102110
RestartSlowSyncButton(onClick = onRestartSlowSyncForRecovery)
111+
ForceCRLExpirationAfterOneMinuteSwitch(
112+
isEnabled = forceCRLExpirationAfterOneMinute,
113+
onCheckedChange = onForceCRLExpirationAfterOneMinuteChange
114+
)
103115
CheckCrlRevocationButton(onClick = checkCrlRevocationList)
104116
ForceUpdateApiVersionsButton(onClick = onForceUpdateApiVersions)
105117
EnableAsyncNotifications(isAsyncNotificationsEnabled, onEnableAsyncNotificationsChange)
@@ -142,6 +154,35 @@ private fun DisableEventProcessingSwitch(
142154
)
143155
}
144156

157+
@Composable
158+
private fun ForceCRLExpirationAfterOneMinuteSwitch(
159+
isEnabled: Boolean = false,
160+
onCheckedChange: ((Boolean) -> Unit)?,
161+
) {
162+
RowItemTemplate(
163+
title = {
164+
Text(
165+
style = MaterialTheme.wireTypography.body01,
166+
color = MaterialTheme.wireColorScheme.onBackground,
167+
text = "Force CRL expiry after 1 minute",
168+
modifier = Modifier.padding(start = dimensions().spacing8x)
169+
)
170+
},
171+
actions = {
172+
WireSwitch(
173+
checked = isEnabled,
174+
onCheckedChange = onCheckedChange,
175+
modifier = Modifier
176+
.padding(end = dimensions().spacing8x)
177+
.size(
178+
width = dimensions().buttonSmallMinSize.width,
179+
height = dimensions().buttonSmallMinSize.height
180+
)
181+
)
182+
}
183+
)
184+
}
185+
145186
@Composable
146187
private fun RestartSlowSyncButton(
147188
onClick: () -> Unit,

app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ import androidx.lifecycle.ViewModel
2121
import androidx.lifecycle.viewModelScope
2222
import com.wire.android.appLogger
2323
import com.wire.android.util.dispatchers.DispatcherProvider
24+
import com.wire.kalium.logic.feature.debug.ObserveDebugCRLExpirationAfterOneMinuteUseCase
2425
import com.wire.kalium.logic.sync.ForegroundActionsUseCase
2526
import dagger.hilt.android.lifecycle.HiltViewModel
2627
import kotlinx.coroutines.Job
28+
import kotlinx.coroutines.flow.launchIn
29+
import kotlinx.coroutines.flow.onEach
2730
import kotlinx.coroutines.launch
2831
import kotlinx.datetime.Clock
2932
import kotlinx.datetime.Instant
@@ -34,14 +37,27 @@ import kotlin.time.Duration.Companion.minutes
3437
@HiltViewModel
3538
class AppSyncViewModel @Inject constructor(
3639
private val foregroundActionsUseCase: ForegroundActionsUseCase,
40+
observeDebugCRLExpirationAfterOneMinute: ObserveDebugCRLExpirationAfterOneMinuteUseCase,
3741
private val dispatcher: DispatcherProvider,
3842
) : ViewModel() {
3943

40-
private val minIntervalBetweenPulls: Duration = MIN_INTERVAL_BETWEEN_PULLS
44+
private var minIntervalBetweenPulls: Duration = MIN_INTERVAL_BETWEEN_PULLS
4145

4246
private var lastPullInstant: Instant? = null
4347
private var syncDataJob: Job? = null
4448

49+
init {
50+
observeDebugCRLExpirationAfterOneMinute()
51+
.onEach { isForced ->
52+
minIntervalBetweenPulls = if (isForced) {
53+
MIN_INTERVAL_BETWEEN_FORCED_CRL_PULLS
54+
} else {
55+
MIN_INTERVAL_BETWEEN_PULLS
56+
}
57+
}
58+
.launchIn(viewModelScope)
59+
}
60+
4561
fun startSyncingAppConfig() {
4662
if (isSyncing()) return
4763

@@ -75,5 +91,6 @@ class AppSyncViewModel @Inject constructor(
7591

7692
companion object {
7793
val MIN_INTERVAL_BETWEEN_PULLS = 60.minutes
94+
val MIN_INTERVAL_BETWEEN_FORCED_CRL_PULLS = 1.minutes
7895
}
7996
}

app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,11 @@ fun HomeContent(
334334
onOpenConversationFilter = {
335335
homeStateHolder.conversationsFilterBottomSheetState.show(Unit)
336336
},
337-
searchFocusRequester = searchFocusRequester,
338-
fabFocusRequester = if (currentNavigationItem.fab != null) fabFocusRequester else null,
337+
nextFocusRequester = if (currentNavigationItem.fab != null) {
338+
fabFocusRequester
339+
} else {
340+
searchFocusRequester
341+
},
339342
)
340343
}
341344
},

app/src/main/kotlin/com/wire/android/ui/home/HomeTopBar.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ fun HomeTopBar(
5656
onNavigateToSelfUserProfile: () -> Unit,
5757
onOpenConversationFilter: () -> Unit,
5858
modifier: Modifier = Modifier,
59-
searchFocusRequester: FocusRequester? = null,
60-
fabFocusRequester: FocusRequester? = null,
59+
nextFocusRequester: FocusRequester? = null,
6160
) {
6261
WireCenterAlignedTopAppBar(
6362
title = title,
@@ -90,10 +89,7 @@ fun HomeTopBar(
9089
UserProfileAvatar(
9190
avatarData = userAvatarData,
9291
modifier = Modifier.focusProperties {
93-
when {
94-
fabFocusRequester != null -> next = fabFocusRequester
95-
searchFocusRequester != null -> next = searchFocusRequester
96-
}
92+
nextFocusRequester?.let { next = it }
9793
},
9894
clickable = remember(openLabel, onNavigateToSelfUserProfile) {
9995
Clickable(

app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationsScreenContent.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import androidx.compose.runtime.getValue
2626
import androidx.compose.runtime.mutableStateOf
2727
import androidx.compose.runtime.remember
2828
import androidx.compose.runtime.setValue
29+
import androidx.compose.ui.Modifier
2930
import androidx.compose.ui.focus.FocusRequester
31+
import androidx.compose.ui.focus.focusRequester
3032
import androidx.compose.ui.platform.LocalContext
3133
import androidx.compose.ui.platform.LocalInspectionMode
3234
import androidx.hilt.navigation.compose.hiltViewModel
@@ -105,6 +107,9 @@ fun ConversationsScreenContent(
105107
val permissionPermanentlyDeniedDialogState = rememberVisibilityState<PermissionPermanentlyDeniedDialogState>()
106108

107109
val context = LocalContext.current
110+
val emptySearchResultModifier = emptySearchResultFocusRequester?.let {
111+
Modifier.focusRequester(it)
112+
} ?: Modifier
108113

109114
LaunchedEffect(searchBarState.isSearchActive) {
110115
if (searchBarState.isSearchActive) {
@@ -198,7 +203,7 @@ fun ConversationsScreenContent(
198203
// when there is no conversation in any folder
199204
searchBarState.isSearchActive -> SearchConversationsEmptyContent(
200205
onNewConversationClicked = onNewConversationClicked,
201-
newConversationFocusRequester = emptySearchResultFocusRequester
206+
modifier = emptySearchResultModifier
202207
)
203208
else -> emptyListContent(state.domain)
204209
}
@@ -232,7 +237,7 @@ fun ConversationsScreenContent(
232237
// when there is no conversation in any folder
233238
searchBarState.isSearchActive -> SearchConversationsEmptyContent(
234239
onNewConversationClicked = onNewConversationClicked,
235-
newConversationFocusRequester = emptySearchResultFocusRequester
240+
modifier = emptySearchResultModifier
236241
)
237242
else -> emptyListContent(state.domain)
238243
}

app/src/main/kotlin/com/wire/android/ui/home/conversationslist/search/SearchConversationsEmptyContent.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ import androidx.compose.material3.Text
2727
import androidx.compose.runtime.Composable
2828
import androidx.compose.ui.Alignment
2929
import androidx.compose.ui.Modifier
30-
import androidx.compose.ui.focus.FocusRequester
31-
import androidx.compose.ui.focus.focusRequester
3230
import androidx.compose.ui.res.stringResource
3331
import androidx.compose.ui.text.style.TextAlign
3432
import com.wire.android.R
@@ -44,12 +42,11 @@ import com.wire.android.util.ui.PreviewMultipleThemes
4442
fun SearchConversationsEmptyContent(
4543
onNewConversationClicked: () -> Unit,
4644
modifier: Modifier = Modifier,
47-
newConversationFocusRequester: FocusRequester? = null,
4845
) {
4946
Column(
5047
horizontalAlignment = Alignment.CenterHorizontally,
5148
verticalArrangement = Arrangement.Center,
52-
modifier = modifier.fillMaxSize()
49+
modifier = Modifier.fillMaxSize()
5350
) {
5451
VerticalSpace.x8()
5552
Column(
@@ -78,7 +75,7 @@ fun SearchConversationsEmptyContent(
7875
fillMaxWidth = false,
7976
minSize = dimensions().buttonSmallMinSize,
8077
minClickableSize = dimensions().buttonMinClickableSize,
81-
modifier = newConversationFocusRequester?.let { Modifier.focusRequester(it) } ?: Modifier,
78+
modifier = modifier,
8279
onClick = onNewConversationClicked
8380
)
8481
}

0 commit comments

Comments
 (0)