fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25 (#4273)
* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25 * Adapt to SDK changes: - Remove logic related to sliding sync proxy, leaving just the minimum needed to detect its usage on the current session data. - Remove code associated with the opt-in migration to native sliding sync, since it's now mandatory. - Remove toggle between proxy/native sliding sync. - Some fixes to session verification API breaks. * Update forced logout dialog message, remove `NativeSlidingSyncMigrationBanner` * Update screenshots * Update all strings * Remove `SuccessfulLogoutPendingAction` --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín <jorgem@element.io> Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
@@ -75,7 +75,6 @@ import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.permalink.PermalinkData
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerificationRequestDetails
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerificationServiceListener
|
||||
import io.element.android.libraries.preferences.api.store.EnableNativeSlidingSyncUseCase
|
||||
import io.element.android.services.appnavstate.api.AppNavigationStateService
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
@@ -105,7 +104,6 @@ class LoggedInFlowNode @AssistedInject constructor(
|
||||
private val sendingQueue: SendQueues,
|
||||
private val logoutEntryPoint: LogoutEntryPoint,
|
||||
private val incomingVerificationEntryPoint: IncomingVerificationEntryPoint,
|
||||
private val enableNativeSlidingSyncUseCase: EnableNativeSlidingSyncUseCase,
|
||||
snackbarDispatcher: SnackbarDispatcher,
|
||||
) : BaseFlowNode<LoggedInFlowNode.NavTarget>(
|
||||
backstack = BackStack(
|
||||
@@ -420,9 +418,6 @@ class LoggedInFlowNode @AssistedInject constructor(
|
||||
}
|
||||
|
||||
logoutEntryPoint.nodeBuilder(this, buildContext)
|
||||
.onSuccessfulLogoutPendingAction {
|
||||
enableNativeSlidingSyncUseCase()
|
||||
}
|
||||
.callback(callback)
|
||||
.build()
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import im.vector.app.features.analytics.plan.UserProperties
|
||||
import io.element.android.libraries.architecture.AsyncData
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.core.log.logger.LoggerTag
|
||||
import io.element.android.libraries.core.meta.BuildMeta
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
import io.element.android.libraries.matrix.api.encryption.EncryptionService
|
||||
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
||||
@@ -31,7 +32,6 @@ import io.element.android.libraries.matrix.api.sync.SyncService
|
||||
import io.element.android.libraries.matrix.api.sync.isOnline
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus
|
||||
import io.element.android.libraries.preferences.api.store.EnableNativeSlidingSyncUseCase
|
||||
import io.element.android.libraries.push.api.PushService
|
||||
import io.element.android.libraries.pushproviders.api.RegistrationFailure
|
||||
import io.element.android.services.analytics.api.AnalyticsService
|
||||
@@ -51,7 +51,7 @@ class LoggedInPresenter @Inject constructor(
|
||||
private val sessionVerificationService: SessionVerificationService,
|
||||
private val analyticsService: AnalyticsService,
|
||||
private val encryptionService: EncryptionService,
|
||||
private val enableNativeSlidingSyncUseCase: EnableNativeSlidingSyncUseCase,
|
||||
private val buildMeta: BuildMeta,
|
||||
) : Presenter<LoggedInState> {
|
||||
@Composable
|
||||
override fun present(): LoggedInState {
|
||||
@@ -103,12 +103,10 @@ class LoggedInPresenter @Inject constructor(
|
||||
}
|
||||
}
|
||||
LoggedInEvents.CheckSlidingSyncProxyAvailability -> coroutineScope.launch {
|
||||
forceNativeSlidingSyncMigration = matrixClient.forceNativeSlidingSyncMigration().getOrDefault(false)
|
||||
forceNativeSlidingSyncMigration = matrixClient.needsForcedNativeSlidingSyncMigration().getOrDefault(false)
|
||||
}
|
||||
LoggedInEvents.LogoutAndMigrateToNativeSlidingSync -> coroutineScope.launch {
|
||||
// Enable native sliding sync if it wasn't already the case
|
||||
enableNativeSlidingSyncUseCase()
|
||||
// Then force the logout
|
||||
// Force the logout since Native Sliding Sync is already enforced by the SDK
|
||||
matrixClient.logout(userInitiated = true, ignoreSdkError = true)
|
||||
}
|
||||
}
|
||||
@@ -119,20 +117,15 @@ class LoggedInPresenter @Inject constructor(
|
||||
pusherRegistrationState = pusherRegistrationState.value,
|
||||
ignoreRegistrationError = ignoreRegistrationError,
|
||||
forceNativeSlidingSyncMigration = forceNativeSlidingSyncMigration,
|
||||
appName = buildMeta.applicationName,
|
||||
eventSink = ::handleEvent
|
||||
)
|
||||
}
|
||||
|
||||
// Force the user to log out if they were using the proxy sliding sync and it's no longer available, but native sliding sync is.
|
||||
private suspend fun MatrixClient.forceNativeSlidingSyncMigration(): Result<Boolean> = runCatching {
|
||||
// Force the user to log out if they were using the proxy sliding sync as it's no longer supported by the SDK
|
||||
private suspend fun MatrixClient.needsForcedNativeSlidingSyncMigration(): Result<Boolean> = runCatching {
|
||||
val currentSlidingSyncVersion = currentSlidingSyncVersion().getOrThrow()
|
||||
if (currentSlidingSyncVersion == SlidingSyncVersion.Proxy) {
|
||||
val availableSlidingSyncVersions = availableSlidingSyncVersions().getOrThrow()
|
||||
availableSlidingSyncVersions.contains(SlidingSyncVersion.Native) &&
|
||||
!availableSlidingSyncVersions.contains(SlidingSyncVersion.Proxy)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
currentSlidingSyncVersion == SlidingSyncVersion.Proxy
|
||||
}
|
||||
|
||||
private suspend fun ensurePusherIsRegistered(pusherRegistrationState: MutableState<AsyncData<Unit>>) {
|
||||
|
||||
@@ -14,5 +14,6 @@ data class LoggedInState(
|
||||
val pusherRegistrationState: AsyncData<Unit>,
|
||||
val ignoreRegistrationError: Boolean,
|
||||
val forceNativeSlidingSyncMigration: Boolean,
|
||||
val appName: String,
|
||||
val eventSink: (LoggedInEvents) -> Unit,
|
||||
)
|
||||
|
||||
@@ -24,10 +24,12 @@ fun aLoggedInState(
|
||||
showSyncSpinner: Boolean = false,
|
||||
pusherRegistrationState: AsyncData<Unit> = AsyncData.Uninitialized,
|
||||
forceNativeSlidingSyncMigration: Boolean = false,
|
||||
appName: String = "Element X",
|
||||
) = LoggedInState(
|
||||
showSyncSpinner = showSyncSpinner,
|
||||
pusherRegistrationState = pusherRegistrationState,
|
||||
ignoreRegistrationError = false,
|
||||
forceNativeSlidingSyncMigration = forceNativeSlidingSyncMigration,
|
||||
appName = appName,
|
||||
eventSink = {},
|
||||
)
|
||||
|
||||
@@ -73,9 +73,12 @@ fun LoggedInView(
|
||||
|
||||
// Set the force migration dialog here so it's always displayed over every screen
|
||||
if (state.forceNativeSlidingSyncMigration) {
|
||||
ForceNativeSlidingSyncMigrationDialog(onSubmit = {
|
||||
state.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync)
|
||||
})
|
||||
ForceNativeSlidingSyncMigrationDialog(
|
||||
appName = state.appName,
|
||||
onSubmit = {
|
||||
state.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,11 +101,12 @@ private fun Throwable.getReason(): String? {
|
||||
|
||||
@Composable
|
||||
private fun ForceNativeSlidingSyncMigrationDialog(
|
||||
appName: String,
|
||||
onSubmit: () -> Unit,
|
||||
) {
|
||||
ErrorDialog(
|
||||
title = null,
|
||||
content = stringResource(R.string.banner_migrate_to_native_sliding_sync_force_logout_title),
|
||||
content = stringResource(R.string.banner_migrate_to_native_sliding_sync_app_force_logout_title, appName),
|
||||
submitText = stringResource(R.string.banner_migrate_to_native_sliding_sync_action),
|
||||
onSubmit = onSubmit,
|
||||
canDismiss = false,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Log Out & Upgrade"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_app_force_logout_title">"%1$s no longer supports the old protocol. Please log out and log back in to continue using the app."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Your homeserver no longer supports the old protocol. Please log out and log back in to continue using the app."</string>
|
||||
</resources>
|
||||
|
||||
@@ -14,6 +14,7 @@ import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import im.vector.app.features.analytics.plan.CryptoSessionStateChange
|
||||
import im.vector.app.features.analytics.plan.UserProperties
|
||||
import io.element.android.libraries.core.meta.BuildMeta
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import io.element.android.libraries.matrix.api.encryption.EncryptionService
|
||||
@@ -26,12 +27,11 @@ import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatu
|
||||
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
||||
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
|
||||
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
|
||||
import io.element.android.libraries.matrix.test.sync.FakeSyncService
|
||||
import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService
|
||||
import io.element.android.libraries.preferences.api.store.EnableNativeSlidingSyncUseCase
|
||||
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
|
||||
import io.element.android.libraries.push.api.PushService
|
||||
import io.element.android.libraries.push.test.FakePushService
|
||||
import io.element.android.libraries.pushproviders.api.Distributor
|
||||
@@ -46,7 +46,6 @@ import io.element.android.tests.testutils.lambda.lambdaError
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import io.element.android.tests.testutils.lambda.value
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.advanceUntilIdle
|
||||
import kotlinx.coroutines.test.runTest
|
||||
@@ -92,6 +91,7 @@ class LoggedInPresenterTest {
|
||||
val roomListService = FakeRoomListService()
|
||||
val verificationService = FakeSessionVerificationService()
|
||||
val encryptionService = FakeEncryptionService()
|
||||
val buildMeta = aBuildMeta()
|
||||
val presenter = LoggedInPresenter(
|
||||
matrixClient = FakeMatrixClient(roomListService = roomListService, encryptionService = encryptionService),
|
||||
syncService = FakeSyncService(initialSyncState = SyncState.Running),
|
||||
@@ -99,7 +99,7 @@ class LoggedInPresenterTest {
|
||||
sessionVerificationService = verificationService,
|
||||
analyticsService = analyticsService,
|
||||
encryptionService = encryptionService,
|
||||
enableNativeSlidingSyncUseCase = EnableNativeSlidingSyncUseCase(InMemoryAppPreferencesStore(), this),
|
||||
buildMeta = buildMeta,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
@@ -518,28 +518,9 @@ class LoggedInPresenterTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `present - CheckSlidingSyncProxyAvailability will not force the migration if native sliding sync is not supported too`() = runTest {
|
||||
val matrixClient = FakeMatrixClient(
|
||||
currentSlidingSyncVersionLambda = { Result.success(SlidingSyncVersion.Proxy) },
|
||||
availableSlidingSyncVersionsLambda = { Result.success(emptyList()) },
|
||||
)
|
||||
val presenter = createLoggedInPresenter(matrixClient = matrixClient)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
assertThat(initialState.forceNativeSlidingSyncMigration).isFalse()
|
||||
|
||||
initialState.eventSink(LoggedInEvents.CheckSlidingSyncProxyAvailability)
|
||||
|
||||
expectNoEvents()
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@Test
|
||||
fun `present - LogoutAndMigrateToNativeSlidingSync enables native sliding sync and logs out the user`() = runTest {
|
||||
fun `present - LogoutAndMigrateToNativeSlidingSync logs out the user`() = runTest {
|
||||
val logoutLambda = lambdaRecorder<Boolean, Boolean, String?> { userInitiated, ignoreSdkError ->
|
||||
assertThat(userInitiated).isTrue()
|
||||
assertThat(ignoreSdkError).isTrue()
|
||||
@@ -548,21 +529,16 @@ class LoggedInPresenterTest {
|
||||
val matrixClient = FakeMatrixClient().apply {
|
||||
this.logoutLambda = logoutLambda
|
||||
}
|
||||
val appPreferencesStore = InMemoryAppPreferencesStore()
|
||||
val enableNativeSlidingSyncUseCase = EnableNativeSlidingSyncUseCase(appPreferencesStore, this)
|
||||
val presenter = createLoggedInPresenter(matrixClient = matrixClient, enableNativeSlidingSyncUseCase = enableNativeSlidingSyncUseCase)
|
||||
val presenter = createLoggedInPresenter(matrixClient = matrixClient)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
|
||||
assertThat(appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()).isFalse()
|
||||
|
||||
initialState.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync)
|
||||
|
||||
advanceUntilIdle()
|
||||
|
||||
assertThat(appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()).isTrue()
|
||||
assertThat(logoutLambda.assertions().isCalledOnce())
|
||||
}
|
||||
}
|
||||
@@ -579,8 +555,8 @@ class LoggedInPresenterTest {
|
||||
sessionVerificationService: SessionVerificationService = FakeSessionVerificationService(),
|
||||
encryptionService: EncryptionService = FakeEncryptionService(),
|
||||
pushService: PushService = FakePushService(),
|
||||
enableNativeSlidingSyncUseCase: EnableNativeSlidingSyncUseCase = EnableNativeSlidingSyncUseCase(InMemoryAppPreferencesStore(), this),
|
||||
matrixClient: MatrixClient = FakeMatrixClient(roomListService = roomListService),
|
||||
buildMeta: BuildMeta = aBuildMeta(),
|
||||
): LoggedInPresenter {
|
||||
return LoggedInPresenter(
|
||||
matrixClient = matrixClient,
|
||||
@@ -589,7 +565,7 @@ class LoggedInPresenterTest {
|
||||
sessionVerificationService = sessionVerificationService,
|
||||
analyticsService = analyticsService,
|
||||
encryptionService = encryptionService,
|
||||
enableNativeSlidingSyncUseCase = enableNativeSlidingSyncUseCase,
|
||||
buildMeta = buildMeta,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ interface LogoutEntryPoint : FeatureEntryPoint {
|
||||
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
|
||||
|
||||
interface NodeBuilder {
|
||||
fun onSuccessfulLogoutPendingAction(action: () -> Unit): NodeBuilder
|
||||
fun callback(callback: Callback): NodeBuilder
|
||||
fun build(): Node
|
||||
}
|
||||
|
||||
@@ -27,15 +27,6 @@ class DefaultLogoutEntryPoint @Inject constructor() : LogoutEntryPoint {
|
||||
return this
|
||||
}
|
||||
|
||||
override fun onSuccessfulLogoutPendingAction(action: () -> Unit): LogoutEntryPoint.NodeBuilder {
|
||||
plugins += object : LogoutNode.SuccessfulLogoutPendingAction, Plugin {
|
||||
override fun onSuccessfulLogoutPendingAction() {
|
||||
action()
|
||||
}
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
override fun build(): Node {
|
||||
return parentNode.createNode<LogoutNode>(buildContext, plugins)
|
||||
}
|
||||
|
||||
@@ -32,12 +32,6 @@ class LogoutNode @AssistedInject constructor(
|
||||
plugins<LogoutEntryPoint.Callback>().forEach { it.onChangeRecoveryKeyClick() }
|
||||
}
|
||||
|
||||
interface SuccessfulLogoutPendingAction : Plugin {
|
||||
fun onSuccessfulLogoutPendingAction()
|
||||
}
|
||||
|
||||
private val customOnSuccessfulLogoutPendingAction = plugins<SuccessfulLogoutPendingAction>().firstOrNull()
|
||||
|
||||
@Composable
|
||||
override fun View(modifier: Modifier) {
|
||||
val state = presenter.present()
|
||||
@@ -47,7 +41,6 @@ class LogoutNode @AssistedInject constructor(
|
||||
state = state,
|
||||
onChangeRecoveryKeyClick = ::onChangeRecoveryKeyClick,
|
||||
onSuccessLogout = {
|
||||
customOnSuccessfulLogoutPendingAction?.onSuccessfulLogoutPendingAction()
|
||||
onSuccessLogout(activity, isDark, it)
|
||||
},
|
||||
onBackClick = ::navigateUp,
|
||||
|
||||
@@ -13,7 +13,6 @@ import io.element.android.libraries.featureflag.ui.model.FeatureUiModel
|
||||
sealed interface DeveloperSettingsEvents {
|
||||
data class UpdateEnabledFeature(val feature: FeatureUiModel, val isEnabled: Boolean) : DeveloperSettingsEvents
|
||||
data class SetCustomElementCallBaseUrl(val baseUrl: String?) : DeveloperSettingsEvents
|
||||
data class SetSimplifiedSlidingSyncEnabled(val isEnabled: Boolean) : DeveloperSettingsEvents
|
||||
data class SetHideImagesAndVideos(val value: Boolean) : DeveloperSettingsEvents
|
||||
data class SetTracingLogLevel(val logLevel: LogLevelItem) : DeveloperSettingsEvents
|
||||
data object ClearCache : DeveloperSettingsEvents
|
||||
|
||||
@@ -19,7 +19,6 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateMap
|
||||
import io.element.android.appconfig.ElementCallConfig
|
||||
import io.element.android.features.logout.api.LogoutUseCase
|
||||
import io.element.android.features.preferences.impl.developer.tracing.toLogLevel
|
||||
import io.element.android.features.preferences.impl.developer.tracing.toLogLevelItem
|
||||
import io.element.android.features.preferences.impl.tasks.ClearCacheUseCase
|
||||
@@ -51,7 +50,6 @@ class DeveloperSettingsPresenter @Inject constructor(
|
||||
private val rageshakePresenter: Presenter<RageshakePreferencesState>,
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
private val buildMeta: BuildMeta,
|
||||
private val logoutUseCase: LogoutUseCase,
|
||||
) : Presenter<DeveloperSettingsState> {
|
||||
@Composable
|
||||
override fun present(): DeveloperSettingsState {
|
||||
@@ -72,9 +70,6 @@ class DeveloperSettingsPresenter @Inject constructor(
|
||||
val customElementCallBaseUrl by appPreferencesStore
|
||||
.getCustomElementCallBaseUrlFlow()
|
||||
.collectAsState(initial = null)
|
||||
val isSimplifiedSlidingSyncEnabled by appPreferencesStore
|
||||
.isSimplifiedSlidingSyncEnabledFlow()
|
||||
.collectAsState(initial = false)
|
||||
val hideImagesAndVideos by appPreferencesStore
|
||||
.doesHideImagesAndVideosFlow()
|
||||
.collectAsState(initial = false)
|
||||
@@ -122,12 +117,6 @@ class DeveloperSettingsPresenter @Inject constructor(
|
||||
appPreferencesStore.setCustomElementCallBaseUrl(urlToSave)
|
||||
}
|
||||
DeveloperSettingsEvents.ClearCache -> coroutineScope.clearCache(clearCacheAction)
|
||||
is DeveloperSettingsEvents.SetSimplifiedSlidingSyncEnabled -> coroutineScope.launch {
|
||||
appPreferencesStore.setSimplifiedSlidingSyncEnabled(event.isEnabled)
|
||||
runCatching {
|
||||
logoutUseCase.logout(ignoreSdkError = true)
|
||||
}
|
||||
}
|
||||
is DeveloperSettingsEvents.SetHideImagesAndVideos -> coroutineScope.launch {
|
||||
appPreferencesStore.setHideImagesAndVideos(event.value)
|
||||
}
|
||||
@@ -147,7 +136,6 @@ class DeveloperSettingsPresenter @Inject constructor(
|
||||
defaultUrl = ElementCallConfig.DEFAULT_BASE_URL,
|
||||
validator = ::customElementCallUrlValidator,
|
||||
),
|
||||
isSimpleSlidingSyncEnabled = isSimplifiedSlidingSyncEnabled,
|
||||
hideImagesAndVideos = hideImagesAndVideos,
|
||||
tracingLogLevel = tracingLogLevel,
|
||||
eventSink = ::handleEvents
|
||||
|
||||
@@ -20,7 +20,6 @@ data class DeveloperSettingsState(
|
||||
val rageshakeState: RageshakePreferencesState,
|
||||
val clearCacheAction: AsyncAction<Unit>,
|
||||
val customElementCallBaseUrlState: CustomElementCallBaseUrlState,
|
||||
val isSimpleSlidingSyncEnabled: Boolean,
|
||||
val hideImagesAndVideos: Boolean,
|
||||
val tracingLogLevel: AsyncData<LogLevelItem>,
|
||||
val eventSink: (DeveloperSettingsEvents) -> Unit
|
||||
|
||||
@@ -32,7 +32,6 @@ open class DeveloperSettingsStateProvider : PreviewParameterProvider<DeveloperSe
|
||||
fun aDeveloperSettingsState(
|
||||
clearCacheAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
|
||||
customElementCallBaseUrlState: CustomElementCallBaseUrlState = aCustomElementCallBaseUrlState(),
|
||||
isSimplifiedSlidingSyncEnabled: Boolean = false,
|
||||
hideImagesAndVideos: Boolean = false,
|
||||
eventSink: (DeveloperSettingsEvents) -> Unit = {},
|
||||
) = DeveloperSettingsState(
|
||||
@@ -41,7 +40,6 @@ fun aDeveloperSettingsState(
|
||||
cacheSize = AsyncData.Success("1.2 MB"),
|
||||
clearCacheAction = clearCacheAction,
|
||||
customElementCallBaseUrlState = customElementCallBaseUrlState,
|
||||
isSimpleSlidingSyncEnabled = isSimplifiedSlidingSyncEnabled,
|
||||
hideImagesAndVideos = hideImagesAndVideos,
|
||||
tracingLogLevel = AsyncData.Success(LogLevelItem.INFO),
|
||||
eventSink = eventSink,
|
||||
|
||||
@@ -60,14 +60,6 @@ fun DeveloperSettingsView(
|
||||
state.eventSink(DeveloperSettingsEvents.SetTracingLogLevel(logLevel))
|
||||
}
|
||||
)
|
||||
PreferenceSwitch(
|
||||
title = "Enable Simplified Sliding Sync",
|
||||
subtitle = "When toggled you'll be logged out of the app and will need to log in again.",
|
||||
isChecked = state.isSimpleSlidingSyncEnabled,
|
||||
onCheckedChange = {
|
||||
state.eventSink(DeveloperSettingsEvents.SetSimplifiedSlidingSyncEnabled(it))
|
||||
}
|
||||
)
|
||||
}
|
||||
PreferenceCategory(title = "Showkase") {
|
||||
PreferenceText(
|
||||
|
||||
@@ -11,7 +11,6 @@ package io.element.android.features.preferences.impl.developer
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.appconfig.ElementCallConfig
|
||||
import io.element.android.features.logout.test.FakeLogoutUseCase
|
||||
import io.element.android.features.preferences.impl.developer.tracing.LogLevelItem
|
||||
import io.element.android.features.preferences.impl.tasks.FakeClearCacheUseCase
|
||||
import io.element.android.features.preferences.impl.tasks.FakeComputeCacheSizeUseCase
|
||||
@@ -25,11 +24,9 @@ import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
|
||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
|
||||
import io.element.android.tests.testutils.WarmUpRule
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import io.element.android.tests.testutils.test
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.test.advanceUntilIdle
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
@@ -48,7 +45,6 @@ class DeveloperSettingsPresenterTest {
|
||||
assertThat(state.cacheSize).isEqualTo(AsyncData.Uninitialized)
|
||||
assertThat(state.customElementCallBaseUrlState).isNotNull()
|
||||
assertThat(state.customElementCallBaseUrlState.baseUrl).isNull()
|
||||
assertThat(state.isSimpleSlidingSyncEnabled).isFalse()
|
||||
assertThat(state.hideImagesAndVideos).isFalse()
|
||||
assertThat(state.rageshakeState.isEnabled).isFalse()
|
||||
assertThat(state.rageshakeState.isSupported).isTrue()
|
||||
@@ -153,34 +149,6 @@ class DeveloperSettingsPresenterTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `present - toggling simplified sliding sync changes the preferences and logs out the user`() = runTest {
|
||||
val logoutCallRecorder = lambdaRecorder<Boolean, String?> { "" }
|
||||
val logoutUseCase = FakeLogoutUseCase(logoutLambda = logoutCallRecorder)
|
||||
val preferences = InMemoryAppPreferencesStore()
|
||||
val presenter = createDeveloperSettingsPresenter(preferencesStore = preferences, logoutUseCase = logoutUseCase)
|
||||
presenter.test {
|
||||
skipItems(2)
|
||||
awaitItem().also { state ->
|
||||
assertThat(state.isSimpleSlidingSyncEnabled).isFalse()
|
||||
state.eventSink(DeveloperSettingsEvents.SetSimplifiedSlidingSyncEnabled(true))
|
||||
}
|
||||
awaitItem().also { state ->
|
||||
assertThat(state.isSimpleSlidingSyncEnabled).isTrue()
|
||||
assertThat(preferences.isSimplifiedSlidingSyncEnabledFlow().first()).isTrue()
|
||||
advanceUntilIdle()
|
||||
logoutCallRecorder.assertions().isCalledOnce()
|
||||
state.eventSink(DeveloperSettingsEvents.SetSimplifiedSlidingSyncEnabled(false))
|
||||
}
|
||||
awaitItem().also { state ->
|
||||
assertThat(state.isSimpleSlidingSyncEnabled).isFalse()
|
||||
assertThat(preferences.isSimplifiedSlidingSyncEnabledFlow().first()).isFalse()
|
||||
advanceUntilIdle()
|
||||
logoutCallRecorder.assertions().isCalledExactly(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `present - toggling hide image and video`() = runTest {
|
||||
val preferences = InMemoryAppPreferencesStore()
|
||||
@@ -225,7 +193,6 @@ class DeveloperSettingsPresenterTest {
|
||||
clearCacheUseCase: FakeClearCacheUseCase = FakeClearCacheUseCase(),
|
||||
preferencesStore: InMemoryAppPreferencesStore = InMemoryAppPreferencesStore(),
|
||||
buildMeta: BuildMeta = aBuildMeta(),
|
||||
logoutUseCase: FakeLogoutUseCase = FakeLogoutUseCase(logoutLambda = { "" })
|
||||
): DeveloperSettingsPresenter {
|
||||
return DeveloperSettingsPresenter(
|
||||
featureFlagService = featureFlagService,
|
||||
@@ -234,7 +201,6 @@ class DeveloperSettingsPresenterTest {
|
||||
rageshakePresenter = { aRageshakePreferencesState() },
|
||||
appPreferencesStore = preferencesStore,
|
||||
buildMeta = buildMeta,
|
||||
logoutUseCase = logoutUseCase,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,19 +102,6 @@ class DeveloperSettingsViewTest {
|
||||
eventsRecorder.assertSingle(DeveloperSettingsEvents.ClearCache)
|
||||
}
|
||||
|
||||
@Config(qualifiers = "h1500dp")
|
||||
@Test
|
||||
fun `clicking on the simplified sliding sync switch emits the expected event`() {
|
||||
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>()
|
||||
rule.setDeveloperSettingsView(
|
||||
state = aDeveloperSettingsState(
|
||||
eventSink = eventsRecorder
|
||||
),
|
||||
)
|
||||
rule.onNodeWithText("Enable Simplified Sliding Sync").performClick()
|
||||
eventsRecorder.assertSingle(DeveloperSettingsEvents.SetSimplifiedSlidingSyncEnabled(true))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `clicking on the hide images and videos switch emits the expected event`() {
|
||||
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>()
|
||||
|
||||
@@ -22,7 +22,6 @@ open class RoomListContentStateProvider : PreviewParameterProvider<RoomListConte
|
||||
aSkeletonContentState(),
|
||||
anEmptyContentState(),
|
||||
anEmptyContentState(securityBannerState = SecurityBannerState.SetUpRecovery),
|
||||
aRoomsContentState(securityBannerState = SecurityBannerState.NeedsNativeSlidingSyncMigration),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -21,14 +21,12 @@ import dagger.assisted.AssistedInject
|
||||
import im.vector.app.features.analytics.plan.MobileScreen
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.invite.api.response.AcceptDeclineInviteView
|
||||
import io.element.android.features.logout.api.direct.DirectLogoutEvents
|
||||
import io.element.android.features.logout.api.direct.DirectLogoutView
|
||||
import io.element.android.features.roomlist.api.RoomListEntryPoint
|
||||
import io.element.android.features.roomlist.impl.components.RoomListMenuAction
|
||||
import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase
|
||||
import io.element.android.libraries.di.SessionScope
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.preferences.api.store.EnableNativeSlidingSyncUseCase
|
||||
import io.element.android.services.analytics.api.AnalyticsService
|
||||
|
||||
@ContributesNode(SessionScope::class)
|
||||
@@ -40,7 +38,6 @@ class RoomListNode @AssistedInject constructor(
|
||||
private val analyticsService: AnalyticsService,
|
||||
private val acceptDeclineInviteView: AcceptDeclineInviteView,
|
||||
private val directLogoutView: DirectLogoutView,
|
||||
private val enableNativeSlidingSyncUseCase: EnableNativeSlidingSyncUseCase,
|
||||
) : Node(buildContext, plugins = plugins) {
|
||||
init {
|
||||
lifecycle.subscribe(
|
||||
@@ -104,13 +101,6 @@ class RoomListNode @AssistedInject constructor(
|
||||
onRoomSettingsClick = this::onRoomSettingsClick,
|
||||
onMenuActionClick = { onMenuActionClick(activity, it) },
|
||||
onRoomDirectorySearchClick = this::onRoomDirectorySearchClick,
|
||||
onMigrateToNativeSlidingSyncClick = {
|
||||
if (state.directLogoutState.canDoDirectSignOut) {
|
||||
state.directLogoutState.eventSink(DirectLogoutEvents.Logout(ignoreSdkError = false))
|
||||
} else {
|
||||
plugins<RoomListEntryPoint.Callback>().forEach { it.onLogoutForNativeSlidingSyncMigrationNeeded() }
|
||||
}
|
||||
},
|
||||
modifier = modifier,
|
||||
) {
|
||||
acceptDeclineInviteView.Render(
|
||||
@@ -121,8 +111,6 @@ class RoomListNode @AssistedInject constructor(
|
||||
)
|
||||
}
|
||||
|
||||
directLogoutView.Render(state.directLogoutState) {
|
||||
enableNativeSlidingSyncUseCase()
|
||||
}
|
||||
directLogoutView.Render(state.directLogoutState) {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,6 @@ import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.encryption.EncryptionService
|
||||
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomList
|
||||
import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion
|
||||
import io.element.android.libraries.matrix.api.sync.SyncService
|
||||
import io.element.android.libraries.matrix.api.sync.isOnline
|
||||
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
||||
@@ -173,16 +172,13 @@ class RoomListPresenter @Inject constructor(
|
||||
@Composable
|
||||
private fun rememberSecurityBannerState(
|
||||
securityBannerDismissed: Boolean,
|
||||
needsSlidingSyncMigration: Boolean,
|
||||
): State<SecurityBannerState> {
|
||||
val currentSecurityBannerDismissed by rememberUpdatedState(securityBannerDismissed)
|
||||
val currentNeedsSlidingSyncMigration by rememberUpdatedState(needsSlidingSyncMigration)
|
||||
val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState()
|
||||
return remember {
|
||||
derivedStateOf {
|
||||
calculateBannerState(
|
||||
securityBannerDismissed = currentSecurityBannerDismissed,
|
||||
needsSlidingSyncMigration = currentNeedsSlidingSyncMigration,
|
||||
recoveryState = recoveryState,
|
||||
)
|
||||
}
|
||||
@@ -191,7 +187,6 @@ class RoomListPresenter @Inject constructor(
|
||||
|
||||
private fun calculateBannerState(
|
||||
securityBannerDismissed: Boolean,
|
||||
needsSlidingSyncMigration: Boolean,
|
||||
recoveryState: RecoveryState,
|
||||
): SecurityBannerState {
|
||||
if (securityBannerDismissed) {
|
||||
@@ -206,10 +201,6 @@ class RoomListPresenter @Inject constructor(
|
||||
RecoveryState.ENABLED -> Unit
|
||||
}
|
||||
|
||||
if (needsSlidingSyncMigration) {
|
||||
return SecurityBannerState.NeedsNativeSlidingSyncMigration
|
||||
}
|
||||
|
||||
return SecurityBannerState.None
|
||||
}
|
||||
|
||||
@@ -231,10 +222,7 @@ class RoomListPresenter @Inject constructor(
|
||||
loadingState == RoomList.LoadingState.NotLoaded || roomSummaries is AsyncData.Loading
|
||||
}
|
||||
}
|
||||
val needsSlidingSyncMigration by produceState(false) {
|
||||
value = client.needsSlidingSyncMigration().getOrDefault(false)
|
||||
}
|
||||
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
|
||||
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed)
|
||||
return when {
|
||||
showEmpty -> RoomListContentState.Empty(securityBannerState = securityBannerState)
|
||||
showSkeleton -> RoomListContentState.Skeleton(count = 16)
|
||||
@@ -320,19 +308,6 @@ class RoomListPresenter @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the user needs to migrate to a native sliding sync version.
|
||||
*/
|
||||
private suspend fun MatrixClient.needsSlidingSyncMigration(): Result<Boolean> = runCatching {
|
||||
val currentSlidingSyncVersion = currentSlidingSyncVersion().getOrThrow()
|
||||
if (currentSlidingSyncVersion != SlidingSyncVersion.Native) {
|
||||
val availableSlidingSyncVersions = availableSlidingSyncVersions().getOrThrow()
|
||||
availableSlidingSyncVersions.contains(SlidingSyncVersion.Native)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
private var currentUpdateVisibleRangeJob: Job? = null
|
||||
private fun CoroutineScope.updateVisibleRange(range: IntRange) {
|
||||
currentUpdateVisibleRangeJob?.cancel()
|
||||
|
||||
@@ -56,7 +56,6 @@ enum class SecurityBannerState {
|
||||
None,
|
||||
SetUpRecovery,
|
||||
RecoveryKeyConfirmation,
|
||||
NeedsNativeSlidingSyncMigration,
|
||||
}
|
||||
|
||||
@Immutable
|
||||
|
||||
@@ -50,7 +50,6 @@ fun RoomListView(
|
||||
onRoomSettingsClick: (roomId: RoomId) -> Unit,
|
||||
onMenuActionClick: (RoomListMenuAction) -> Unit,
|
||||
onRoomDirectorySearchClick: () -> Unit,
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
acceptDeclineInviteView: @Composable () -> Unit,
|
||||
) {
|
||||
@@ -77,7 +76,6 @@ fun RoomListView(
|
||||
onOpenSettings = onSettingsClick,
|
||||
onCreateRoomClick = onCreateRoomClick,
|
||||
onMenuActionClick = onMenuActionClick,
|
||||
onMigrateToNativeSlidingSyncClick = onMigrateToNativeSlidingSyncClick,
|
||||
modifier = Modifier.padding(top = topPadding),
|
||||
)
|
||||
// This overlaid view will only be visible when state.displaySearchResults is true
|
||||
@@ -107,7 +105,6 @@ private fun RoomListScaffold(
|
||||
onOpenSettings: () -> Unit,
|
||||
onCreateRoomClick: () -> Unit,
|
||||
onMenuActionClick: (RoomListMenuAction) -> Unit,
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
fun onRoomClick(room: RoomListRoomSummary) {
|
||||
@@ -143,7 +140,6 @@ private fun RoomListScaffold(
|
||||
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
|
||||
onRoomClick = ::onRoomClick,
|
||||
onCreateRoomClick = onCreateRoomClick,
|
||||
onMigrateToNativeSlidingSyncClick = onMigrateToNativeSlidingSyncClick,
|
||||
modifier = Modifier
|
||||
.padding(padding)
|
||||
.consumeWindowInsets(padding)
|
||||
@@ -184,6 +180,5 @@ internal fun RoomListViewPreview(@PreviewParameter(RoomListStateProvider::class)
|
||||
onMenuActionClick = {},
|
||||
onRoomDirectorySearchClick = {},
|
||||
acceptDeclineInviteView = {},
|
||||
onMigrateToNativeSlidingSyncClick = {},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.features.roomlist.impl.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import io.element.android.features.roomlist.impl.R
|
||||
import io.element.android.libraries.designsystem.components.Announcement
|
||||
import io.element.android.libraries.designsystem.components.AnnouncementType
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
|
||||
@Composable
|
||||
internal fun NativeSlidingSyncMigrationBanner(
|
||||
onContinueClick: () -> Unit,
|
||||
onDismissClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Announcement(
|
||||
modifier = modifier.roomListBannerPadding(),
|
||||
title = stringResource(R.string.banner_migrate_to_native_sliding_sync_title),
|
||||
description = stringResource(R.string.banner_migrate_to_native_sliding_sync_description),
|
||||
type = AnnouncementType.Actionable(
|
||||
actionText = stringResource(R.string.banner_migrate_to_native_sliding_sync_action),
|
||||
onActionClick = onContinueClick,
|
||||
onDismissClick = onDismissClick,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@PreviewsDayNight
|
||||
@Composable
|
||||
internal fun NativeSlidingSyncMigrationBannerPreview() = ElementPreview {
|
||||
NativeSlidingSyncMigrationBanner(
|
||||
onContinueClick = {},
|
||||
onDismissClick = {},
|
||||
)
|
||||
}
|
||||
@@ -64,7 +64,6 @@ fun RoomListContentView(
|
||||
onConfirmRecoveryKeyClick: () -> Unit,
|
||||
onRoomClick: (RoomListRoomSummary) -> Unit,
|
||||
onCreateRoomClick: () -> Unit,
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Box(modifier = modifier) {
|
||||
@@ -90,7 +89,6 @@ fun RoomListContentView(
|
||||
eventSink = eventSink,
|
||||
onSetUpRecoveryClick = onSetUpRecoveryClick,
|
||||
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
|
||||
onMigrateToNativeSlidingSyncClick = onMigrateToNativeSlidingSyncClick,
|
||||
onRoomClick = onRoomClick,
|
||||
)
|
||||
}
|
||||
@@ -162,7 +160,6 @@ private fun RoomsView(
|
||||
onSetUpRecoveryClick: () -> Unit,
|
||||
onConfirmRecoveryKeyClick: () -> Unit,
|
||||
onRoomClick: (RoomListRoomSummary) -> Unit,
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
if (state.summaries.isEmpty() && filtersState.hasAnyFilterSelected) {
|
||||
@@ -177,7 +174,6 @@ private fun RoomsView(
|
||||
onSetUpRecoveryClick = onSetUpRecoveryClick,
|
||||
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
|
||||
onRoomClick = onRoomClick,
|
||||
onMigrateToNativeSlidingSyncClick = onMigrateToNativeSlidingSyncClick,
|
||||
modifier = modifier.fillMaxSize(),
|
||||
)
|
||||
}
|
||||
@@ -190,7 +186,6 @@ private fun RoomsViewList(
|
||||
onSetUpRecoveryClick: () -> Unit,
|
||||
onConfirmRecoveryKeyClick: () -> Unit,
|
||||
onRoomClick: (RoomListRoomSummary) -> Unit,
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val lazyListState = rememberLazyListState()
|
||||
@@ -229,14 +224,6 @@ private fun RoomsViewList(
|
||||
)
|
||||
}
|
||||
}
|
||||
SecurityBannerState.NeedsNativeSlidingSyncMigration -> {
|
||||
item {
|
||||
NativeSlidingSyncMigrationBanner(
|
||||
onContinueClick = onMigrateToNativeSlidingSyncClick,
|
||||
onDismissClick = { updatedEventSink(RoomListEvents.DismissBanner) },
|
||||
)
|
||||
}
|
||||
}
|
||||
SecurityBannerState.None -> if (state.fullScreenIntentPermissionsState.shouldDisplayBanner) {
|
||||
item {
|
||||
FullScreenIntentPermissionBanner(state = state.fullScreenIntentPermissionsState)
|
||||
@@ -318,6 +305,5 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr
|
||||
onConfirmRecoveryKeyClick = {},
|
||||
onRoomClick = {},
|
||||
onCreateRoomClick = {},
|
||||
onMigrateToNativeSlidingSyncClick = {},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Выйсці і абнавіць"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ваш сервер зараз падтрымлівае новы, хутчэйшы пратакол. Выйдзіце з сістэмы і зноў увайдзіце, каб абнавіць яе. Гэта дапаможа вам пазбегнуць прымусовага выхаду з сістэмы, калі стары пратакол будзе пазней выдалены."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Ваш хатні сервер больш не падтрымлівае стары пратакол. Калі ласка, выйдзіце і ўвайдзіце зноў, каб працягнуць выкарыстанне праграмы."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Даступна абнаўленне"</string>
|
||||
<string name="banner_set_up_recovery_content">"Стварыце новы ключ аднаўлення, які можна выкарыстоўваць для аднаўлення зашыфраванай гісторыі паведамленняў у выпадку страты доступу да вашых прылад."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Наладзьце аднаўленне"</string>
|
||||
<string name="banner_set_up_recovery_title">"Наладзіць аднаўленне"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Odhlásit se a upgradovat"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Váš server nyní podporuje nový, rychlejší protokol. Chcete-li upgradovat, odhlaste se a znovu se přihlaste. Pokud to uděláte nyní, pomůže vám vyhnout se nucenému odhlášení, když bude starý protokol později odstraněn."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Váš domovský server již nepodporuje starý protokol. Chcete-li pokračovat v používání aplikace, odhlaste se a znovu se přihlaste."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade k dispozici"</string>
|
||||
<string name="banner_set_up_recovery_content">"Vygenerujte nový klíč pro obnovení, který lze použít k obnovení historie šifrovaných zpráv v případě, že ztratíte přístup ke svým zařízením."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Nastavení obnovy"</string>
|
||||
<string name="banner_set_up_recovery_title">"Nastavení obnovy"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Abmelden und aktualisieren"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Dein Server unterstützt jetzt ein neues, schnelleres Protokoll. Melde dich ab und melde dich wieder an, um zu aktualisieren. Wenn du das jetzt tust, vermeidest du eine erzwungene Abmeldung, wenn das alte Protokoll später entfernt wird."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Dein Homeserver unterstützt das alte Protokoll nicht mehr. Bitte logge dich aus und melde dich wieder an, um die App weiter zu nutzen."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aktualisierung verfügbar"</string>
|
||||
<string name="banner_set_up_recovery_content">"Erstelle einen neuen Wiederherstellungsschlüssel, mit dem du deinen verschlüsselten Nachrichtenverlauf wiederherstellen kannst, wenn du dich an einem neuen Gerät anmeldest."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Wiederherstellung einrichten"</string>
|
||||
<string name="banner_set_up_recovery_title">"Wiederherstellung einrichten"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Αποσύνδεση & Αναβάθμιση"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ο διακομιστής σου υποστηρίζει τώρα ένα νέο, ταχύτερο πρωτόκολλο. Αποσυνδέσου και συνδέσου ξανά για αναβάθμιση τώρα. Κάνοντας αυτό τώρα θα σε βοηθήσει να αποφύγεις μια αναγκαστική αποσύνδεση όταν το παλιό πρωτόκολλο καταργηθεί αργότερα."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Ο οικιακός διακομιστής σου δεν υποστηρίζει πλέον το παλιό πρωτόκολλο. Αποσυνδέσου και συνδέσου ξανά για να συνεχίσεις να χρησιμοποιείς την εφαρμογή."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Διαθέσιμη αναβάθμιση"</string>
|
||||
<string name="banner_set_up_recovery_content">"Δημιούργησε ένα νέο κλειδί ανάκτησης που μπορεί να χρησιμοποιηθεί για την επαναφορά του ιστορικού των κρυπτογραφημένων μηνυμάτων σου σε περίπτωση που χάσεις την πρόσβαση στις συσκευές σου."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Ρύθμιση ανάκτησης"</string>
|
||||
<string name="banner_set_up_recovery_title">"Ρύθμιση ανάκτησης"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Logi välja ja uuenda"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Sinu koduserver toetab uut ja kiiremat protokolli. Uuendamiseks logi korraks rakendusest välja ja siis tagasi. Mingil hetkel tulevikus vana protokoll eemaldatakse kasutusest ja tehes uuenduse nüüd väldid hilisemat sundkorras uuendust."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Sinu koduserver enam ei toeta vana protokolli. Jätkamaks rakenduse kasutamist palun logi välja ning seejärel tagasi."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Saadaval on uuendus"</string>
|
||||
<string name="banner_set_up_recovery_content">"Loo uus taastevõti, mida saad kasutada oma krüptitud sõnumite ajaloo taastamisel olukorras, kus kaotad ligipääsu oma seadmetele."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Seadista andmete taastamine"</string>
|
||||
<string name="banner_set_up_recovery_title">"Seadista taastamine"</string>
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"خروج و ارتقا"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"ارتقا موجود است"</string>
|
||||
<string name="banner_set_up_recovery_submit">"برپایی بازیابی"</string>
|
||||
<string name="banner_set_up_recovery_title">"برپایی بازیابی"</string>
|
||||
<string name="confirm_recovery_key_banner_title">"ورود کلید بازیابیتان"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Kirjaudu Ulos & Päivitä"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Palvelimesi tukee nyt uutta, nopeampaa protokollaa. Kirjaudu ulos ja takaisin sisään päivittääksesi nyt. Jos teet tämän nyt, voit välttää pakotetun uloskirjautumisen, kun vanha protokolla poistetaan myöhemmin."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Kotipalvelimesi ei enää tue vanhaa protokollaa. Kirjaudu ulos ja takaisin sisään jatkaaksesi sovelluksen käyttöä."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Päivitys saatavilla"</string>
|
||||
<string name="banner_set_up_recovery_content">"Palauta kryptografinen identiteettisi ja viestihistoriasi palautusavaimella, mikäli menetät pääsyn kaikkiin laitteisiisi."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Ota palautus käyttöön"</string>
|
||||
<string name="banner_set_up_recovery_title">"Ota palautus käyttöön tilisi suojaamiseksi"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Déconnecter et mettre à niveau"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Votre serveur prend désormais en charge un nouveau protocole plus rapide. Déconnectez-vous, puis reconnectez-vous pour effectuer la mise à niveau dès maintenant. En le faisant tout de suite, vous éviterez une déconnexion forcée lorsque l’ancien protocole sera supprimé."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Votre serveur d’accueil ne prend plus en charge l’ancien protocole. Veuillez vous déconnecter puis vous reconnecter pour continuer à utiliser l’application."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Mise à niveau disponible"</string>
|
||||
<string name="banner_set_up_recovery_content">"Générez une nouvelle clé de récupération qui peut être utilisée pour restaurer l’historique de vos messages chiffrés au cas où vous perdriez l’accès à vos appareils."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Configurer la sauvegarde"</string>
|
||||
<string name="banner_set_up_recovery_title">"Configurer la récupération"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Kijelentkezés és frissítés"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"A kiszolgálója mostantól egy új, gyorsabb protokollt támogat. A frissítéshez jelentkezzen ki, majd jelentkezzen be újra. Ha ezt most megteszi, elkerülheti a kényszerített kijelentkeztetést a régi protokollt eltávolításakor."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"A Matrix-kiszolgáló már nem támogatja a régi protokollt. Az alkalmazás további használatához jelentkezzen ki és be."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Frissítés érhető el"</string>
|
||||
<string name="banner_set_up_recovery_content">"Hozzon létre egy új helyreállítási kulcsot, amellyel visszaállíthatja a titkosított üzenetek előzményeit, ha elveszíti az eszközökhöz való hozzáférést."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Helyreállítás beállítása"</string>
|
||||
<string name="banner_set_up_recovery_title">"Helyreállítás beállítása a fiókja védelméhez"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Keluar & Tingkatkan"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Server Anda kini mendukung protokol baru yang lebih cepat. Keluar dan masuk lagi untuk memperbarui sekarang. Melakukan hal ini sekarang akan membantu Anda menghindari keluar paksa saat protokol lama dihapus nantinya."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Homeserver Anda tidak lagi mendukung protokol lama. Silakan keluar dan masuk kembali untuk terus menggunakan aplikasi."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Peningkatan tersedia"</string>
|
||||
<string name="banner_set_up_recovery_content">"Buat kunci pemulihan baru yang dapat digunakan untuk memulihkan riwayat pesan terenkripsi Anda jika Anda kehilangan akses ke perangkat Anda."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Siapkan pemulihan"</string>
|
||||
<string name="banner_set_up_recovery_title">"Siapkan pemulihan"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Esci e aggiorna"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Il tuo server ora supporta un nuovo protocollo più veloce. Esci e rientra per effettuare l\'aggiornamento. Se lo fai ora, eviterai una disconnessione forzata quando il vecchio protocollo verrà rimosso in seguito."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Il tuo homeserver non supporta più il vecchio protocollo. Esci e rientra per continuare a usare l\'app."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aggiornamento disponibile"</string>
|
||||
<string name="banner_set_up_recovery_content">"Genera una nuova chiave di recupero che può essere usata per ripristinare la cronologia dei messaggi crittografati nel caso in cui tu perda l\'accesso ai tuoi dispositivi."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Configura il recupero"</string>
|
||||
<string name="banner_set_up_recovery_title">"Configura il ripristino"</string>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Oppgradering tilgjengelig"</string>
|
||||
<string name="confirm_recovery_key_banner_primary_button_title">"Skriv inn gjenopprettingsnøkkelen din"</string>
|
||||
<string name="confirm_recovery_key_banner_secondary_button_title">"Har du glemt din gjenopprettingsnøkkel?"</string>
|
||||
<string name="screen_invites_decline_chat_message">"Er du sikker på at du vil takke nei til invitasjonen til å bli med i %1$s?"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Uitloggen & Upgraden"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Je server ondersteunt nu een nieuw, sneller protocol. Log uit en log opnieuw in om nu te upgraden. Als je dit nu doet, voorkom je dat je geforceerd uitlogt wordt wanneer het oude protocol later wordt verwijderd."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Je homeserver ondersteunt het oude protocol niet meer. Log uit en log opnieuw in om de app te blijven gebruiken."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade beschikbaar"</string>
|
||||
<string name="banner_set_up_recovery_submit">"Herstelmogelijkheid instellen"</string>
|
||||
<string name="confirm_recovery_key_banner_message">"Je chatback-up is momenteel niet gesynchroniseerd. Je moet je herstelsleutel invoeren om toegang te behouden tot je chatback-up."</string>
|
||||
<string name="confirm_recovery_key_banner_title">"Voer je herstelsleutel in"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Wyloguj się i zaktualizuj"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Twój serwer obsługuje teraz nowy, szybszy protokół. Wyloguj się i zaloguj ponownie, aby uaktualnić teraz. Zrobienie tego teraz pomoże uniknąć wymuszonego wylogowania, gdy stary protokół zostanie później usunięty."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Twój serwer domowy już nie wspiera starego protokołu. Zaloguj się ponownie, aby kontynuować korzystanie z aplikacji."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Dostępna aktualizacja"</string>
|
||||
<string name="banner_set_up_recovery_content">"Wygeneruj nowy klucz przywracania, którego można użyć do przywrócenia historii wiadomości szyfrowanych w przypadku utraty dostępu do swoich urządzeń."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Skonfiguruj przywracanie"</string>
|
||||
<string name="banner_set_up_recovery_title">"Skonfiguruj przywracanie"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Sair & Atualizar"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"O teu servidor suporta agora um protocolo novo e mais rápido. Termina a sessão e volta a iniciar sessão para atualizar agora. Se o fizeres agora, evitarás um fim de sessão forçado quando o protocolo antigo for removido mais tarde."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Seu homeserver não suporta mais o protocolo antigo. Termine sessão e volte a iniciar sessão para continuar a utilizar a aplicação."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Atualização disponível"</string>
|
||||
<string name="banner_set_up_recovery_content">"Recupera a tua identidade criptográfica e o histórico de mensagens com uma chave de recuperação se tiveres perdido todos os teus dispositivos existentes."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Configurar recuperação"</string>
|
||||
<string name="banner_set_up_recovery_title">"Configurar a recuperação"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Deconectați-vă și faceți upgrade"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Serverul dvs. acceptă acum un protocol nou, mai rapid. Deconectați-vă și conectați-vă din nou pentru a face upgrade acum. Dacă faceți acest lucru acum, vă va ajuta să evitați o deconectare forțată atunci când vechiul protocol este eliminat ulterior."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Serverul dvs. de acasă nu mai acceptă vechiul protocol. Vă rugăm să vă deconectați și să vă conectați din nou pentru a continua să utilizați aplicația."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade disponibil"</string>
|
||||
<string name="banner_set_up_recovery_content">"Recuperați-vă identitatea criptografică și istoricul mesajelor cu o cheie de recuperare dacă ați pierdut toate dispozitivele existente."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Configurați recuperarea"</string>
|
||||
<string name="banner_set_up_recovery_title">"Configurați recuperarea pentru a vă proteja contul"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Выйти и обновить"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Теперь ваш сервер поддерживает новый, более быстрый протокол. Чтобы обновить его прямо сейчас, выйдите и войдите в свою учётную запись снова. Сделав это сейчас, вы сможете избежать принудительного выхода из системы при последующем удалении старого протокола."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Ваш домашний сервер больше не поддерживает старый протокол. Пожалуйста, выйдите и войдите в свою учётную запись снова, чтобы продолжить использование приложения."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Доступно обновление"</string>
|
||||
<string name="banner_set_up_recovery_content">"Создайте новый ключ восстановления, который можно использовать для восстановления зашифрованной истории сообщений в случае потери доступа к своим устройствам."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Настроить восстановление"</string>
|
||||
<string name="banner_set_up_recovery_title">"Для защиты вашего аккаунта рекомендуется настроить восстановление"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Odhlásiť sa a aktualizovať"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Váš server teraz podporuje nový, rýchlejší protokol. Odhláste sa a prihláste sa znova, aby ste mohli aktualizovať. Ak to urobíte teraz, pomôže vám vyhnúť sa nútenému odhláseniu, keď sa starý protokol neskôr odstráni."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Váš domovský server už nepodporuje starý protokol. Ak chcete pokračovať v používaní aplikácie, odhláste sa a znova sa prihláste."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aktualizácia je k dispozícii"</string>
|
||||
<string name="banner_set_up_recovery_content">"Vytvorte nový kľúč na obnovenie, ktorý môžete použiť na obnovenie vašej histórie šifrovaných správ v prípade straty prístupu k vašim zariadeniam."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Nastaviť obnovenie"</string>
|
||||
<string name="banner_set_up_recovery_title">"Nastaviť obnovenie"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Logga ut och uppgradera"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Din server stöder nu ett nytt, snabbare protokoll. Logga ut och logga in igen för att uppgradera nu. Om du gör detta nu hjälper du dig att undvika en tvingad utloggning när det gamla protokollet tas bort senare."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Din hemserver stöder inte längre det gamla protokollet. Logga ut och logga in igen för att fortsätta använda appen."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Uppgradering tillgänglig"</string>
|
||||
<string name="banner_set_up_recovery_content">"Skapa en ny återställningsnyckel som kan användas för att återställa din krypterade meddelandehistorik om du förlorar åtkomst till dina enheter."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Ställ in återställning"</string>
|
||||
<string name="banner_set_up_recovery_title">"Ställ in återställning"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Çıkış Yap ve Yükselt"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Sunucunuz artık yeni, daha hızlı bir protokolü destekliyor. Şimdi oturumu kapatıp tekrar oturum açarak yükseltme yapın. Bunu şimdi yapmak, eski protokol daha sonra kaldırıldığında zorunlu oturum kapatmayı önlemenize yardımcı olacaktır."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Ana sunucunuz artık eski protokolü desteklemiyor. Lütfen oturumu kapatın ve uygulamayı kullanmaya devam etmek için tekrar oturum açın."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Yükseltme mevcut"</string>
|
||||
<string name="banner_set_up_recovery_content">"Mevcut tüm cihazlarınızı kaybettiyseniz şifreleme kimliğinizi ve mesaj geçmişinizi bir kurtarma anahtarıyla kurtarın."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Kurtarmayı ayarlayın"</string>
|
||||
<string name="banner_set_up_recovery_title">"Hesabınızı korumak için kurtarmayı ayarlayın"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Вийти та оновити"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ваш сервер тепер підтримує новий, швидший протокол. Вийдіть із системи та увійдіть знову, щоб оновити систему зараз. Якщо ви зробите це зараз, це допоможе вам уникнути примусового виходу з системи, коли старий протокол буде видалено пізніше."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Ваш домашній сервер більше не підтримує старий протокол. Будь ласка, вийдіть і увійдіть знову, щоб продовжити використання програми."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Доступне оновлення"</string>
|
||||
<string name="banner_set_up_recovery_content">"Відновіть свою криптографічну ідентичність та історію повідомлень за допомогою ключа відновлення, якщо ви втратили всі наявні пристрої."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Налаштувати відновлення"</string>
|
||||
<string name="banner_set_up_recovery_title">"Налаштуйте відновлення для захисту свого облікового запису"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"登出並升級"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"您的伺服器現在支援新的、更快的協定。立即登出並重新登入以進行升級。現在這樣做將協助您避免在稍後移除舊協定時被強制登出。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"您的家伺服器不再支援舊協定。請登出並重新登入以繼續使用應用程式。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"可升級"</string>
|
||||
<string name="banner_set_up_recovery_content">"若您遺失了所有現有裝置,則請使用復原金鑰以救援您的密碼學身份與訊息歷史紀錄。"</string>
|
||||
<string name="banner_set_up_recovery_submit">"設定復原"</string>
|
||||
<string name="banner_set_up_recovery_title">"設定備援以保護您的帳號"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"登出并升级"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"您的服务器现在支持更快的新协议。现在登出并重新登录以进行升级。现在这样做可以帮助您避免在以后删除旧协议时被强制登出。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"您的服务器不再支持旧协议。请登出并重新登录以继续使用此应用。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"有可用升级"</string>
|
||||
<string name="banner_set_up_recovery_content">"生成新的恢复密钥,该密钥可用于在您无法访问设备时恢复加密的消息历史记录。"</string>
|
||||
<string name="banner_set_up_recovery_submit">"设置恢复"</string>
|
||||
<string name="banner_set_up_recovery_title">"设置恢复"</string>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="banner_migrate_to_native_sliding_sync_action">"Log Out & Upgrade"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Your server now supports a new, faster protocol. Log out and log back in to upgrade now. Doing this now will help you avoid a forced logout when the old protocol is removed later."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_force_logout_title">"Your homeserver no longer supports the old protocol. Please log out and log back in to continue using the app."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade available"</string>
|
||||
<string name="banner_set_up_recovery_content">"Recover your cryptographic identity and message history with a recovery key if you have lost all your existing devices."</string>
|
||||
<string name="banner_set_up_recovery_submit">"Set up recovery"</string>
|
||||
<string name="banner_set_up_recovery_title">"Set up recovery to protect your account"</string>
|
||||
|
||||
@@ -229,21 +229,6 @@ class RoomListViewTest {
|
||||
listOf(RoomListEvents.AcceptInvite(invitedRoom), RoomListEvents.DeclineInvite(invitedRoom)),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `clicking on logout and migrate calls the migration clicked callback`() {
|
||||
val state = aRoomListState(
|
||||
contentState = aRoomsContentState(securityBannerState = SecurityBannerState.NeedsNativeSlidingSyncMigration),
|
||||
eventSink = {},
|
||||
)
|
||||
ensureCalledOnce { callback ->
|
||||
rule.setRoomListView(
|
||||
state = state,
|
||||
onMigrateToNativeSlidingSyncClick = callback,
|
||||
)
|
||||
rule.clickOn(R.string.banner_migrate_to_native_sliding_sync_action)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomListView(
|
||||
@@ -256,7 +241,6 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomL
|
||||
onRoomSettingsClick: (RoomId) -> Unit = EnsureNeverCalledWithParam(),
|
||||
onMenuActionClick: (RoomListMenuAction) -> Unit = EnsureNeverCalledWithParam(),
|
||||
onRoomDirectorySearchClick: () -> Unit = EnsureNeverCalled(),
|
||||
onMigrateToNativeSlidingSyncClick: () -> Unit = EnsureNeverCalled()
|
||||
) {
|
||||
setContent {
|
||||
RoomListView(
|
||||
@@ -269,7 +253,6 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomL
|
||||
onRoomSettingsClick = onRoomSettingsClick,
|
||||
onMenuActionClick = onMenuActionClick,
|
||||
onRoomDirectorySearchClick = onRoomDirectorySearchClick,
|
||||
onMigrateToNativeSlidingSyncClick = onMigrateToNativeSlidingSyncClick,
|
||||
acceptDeclineInviteView = { },
|
||||
)
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ jsoup = "org.jsoup:jsoup:1.18.3"
|
||||
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
||||
molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0"
|
||||
timber = "com.jakewharton.timber:timber:5.0.1"
|
||||
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.78"
|
||||
matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.2.17"
|
||||
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
|
||||
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
|
||||
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
|
||||
|
||||
@@ -129,10 +129,8 @@ class RustMatrixClientFactory @Inject constructor(
|
||||
// Apply sliding sync version settings
|
||||
when (slidingSyncType) {
|
||||
ClientBuilderSlidingSync.Restored -> this
|
||||
is ClientBuilderSlidingSync.CustomProxy -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Proxy(slidingSyncType.url))
|
||||
ClientBuilderSlidingSync.Discovered -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DiscoverProxy)
|
||||
ClientBuilderSlidingSync.Simplified -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DiscoverNative)
|
||||
ClientBuilderSlidingSync.ForcedSimplified -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Native)
|
||||
ClientBuilderSlidingSync.Discovered -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DISCOVER_NATIVE)
|
||||
ClientBuilderSlidingSync.Native -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.NATIVE)
|
||||
}
|
||||
}
|
||||
.run {
|
||||
@@ -143,21 +141,14 @@ class RustMatrixClientFactory @Inject constructor(
|
||||
}
|
||||
|
||||
sealed interface ClientBuilderSlidingSync {
|
||||
// The proxy is set by the user.
|
||||
data class CustomProxy(val url: String) : ClientBuilderSlidingSync
|
||||
|
||||
// The proxy will be supplied when restoring the Session.
|
||||
data object Restored : ClientBuilderSlidingSync
|
||||
|
||||
// A proxy must be discovered whilst building the session.
|
||||
// A Native Sliding Sync instance must be discovered whilst building the session.
|
||||
data object Discovered : ClientBuilderSlidingSync
|
||||
|
||||
// Use Simplified Sliding Sync.
|
||||
data object Simplified : ClientBuilderSlidingSync
|
||||
|
||||
// Force using Simplified Sliding Sync.
|
||||
// TODO allow the user to select between proxy, simplified or force simplified in developer options.
|
||||
data object ForcedSimplified : ClientBuilderSlidingSync
|
||||
// Force using Native Sliding Sync.
|
||||
data object Native : ClientBuilderSlidingSync
|
||||
}
|
||||
|
||||
private fun SessionData.toSession() = Session(
|
||||
@@ -166,6 +157,6 @@ private fun SessionData.toSession() = Session(
|
||||
userId = userId,
|
||||
deviceId = deviceId,
|
||||
homeserverUrl = homeserverUrl,
|
||||
slidingSyncVersion = slidingSyncProxy?.let(SlidingSyncVersion::Proxy) ?: SlidingSyncVersion.Native,
|
||||
slidingSyncVersion = SlidingSyncVersion.NATIVE,
|
||||
oidcData = oidcData,
|
||||
)
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
package io.element.android.libraries.matrix.impl.auth
|
||||
|
||||
import com.squareup.anvil.annotations.ContributesBinding
|
||||
import io.element.android.appconfig.AuthenticationConfig
|
||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||
import io.element.android.libraries.core.extensions.mapFailure
|
||||
import io.element.android.libraries.di.AppScope
|
||||
@@ -32,7 +31,6 @@ import io.element.android.libraries.matrix.impl.keys.PassphraseGenerator
|
||||
import io.element.android.libraries.matrix.impl.mapper.toSessionData
|
||||
import io.element.android.libraries.matrix.impl.paths.SessionPaths
|
||||
import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory
|
||||
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
||||
import io.element.android.libraries.sessionstorage.api.LoggedInState
|
||||
import io.element.android.libraries.sessionstorage.api.LoginType
|
||||
import io.element.android.libraries.sessionstorage.api.SessionStore
|
||||
@@ -40,10 +38,8 @@ import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.rustcomponents.sdk.Client
|
||||
import org.matrix.rustcomponents.sdk.ClientBuildException
|
||||
import org.matrix.rustcomponents.sdk.ClientBuilder
|
||||
import org.matrix.rustcomponents.sdk.HumanQrLoginException
|
||||
import org.matrix.rustcomponents.sdk.OidcConfiguration
|
||||
@@ -64,7 +60,6 @@ class RustMatrixAuthenticationService @Inject constructor(
|
||||
private val rustMatrixClientFactory: RustMatrixClientFactory,
|
||||
private val passphraseGenerator: PassphraseGenerator,
|
||||
private val oidcConfigurationProvider: OidcConfigurationProvider,
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
) : MatrixAuthenticationService {
|
||||
// Passphrase which will be used for new sessions. Existing sessions will use the passphrase
|
||||
// stored in the SessionData.
|
||||
@@ -288,28 +283,12 @@ class RustMatrixAuthenticationService @Inject constructor(
|
||||
sessionPaths: SessionPaths,
|
||||
config: suspend ClientBuilder.() -> ClientBuilder,
|
||||
): Client {
|
||||
val slidingSyncType = getSlidingSyncType()
|
||||
if (slidingSyncType is ClientBuilderSlidingSync.Simplified) {
|
||||
Timber.d("Creating client with simplified sliding sync")
|
||||
try {
|
||||
return rustMatrixClientFactory
|
||||
.getBaseClientBuilder(
|
||||
sessionPaths = sessionPaths,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncType = slidingSyncType,
|
||||
)
|
||||
.config()
|
||||
.build()
|
||||
} catch (e: ClientBuildException.SlidingSyncVersion) {
|
||||
Timber.e(e, "Failed to create client with simplified sliding sync, trying with Proxy now")
|
||||
}
|
||||
}
|
||||
Timber.d("Creating client with Proxy sliding sync")
|
||||
Timber.d("Creating client with simplified sliding sync")
|
||||
return rustMatrixClientFactory
|
||||
.getBaseClientBuilder(
|
||||
sessionPaths = sessionPaths,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncType = getSlidingSyncProxy(),
|
||||
slidingSyncType = ClientBuilderSlidingSync.Discovered,
|
||||
)
|
||||
.config()
|
||||
.build()
|
||||
@@ -322,43 +301,17 @@ class RustMatrixAuthenticationService @Inject constructor(
|
||||
oidcConfiguration: OidcConfiguration,
|
||||
progressListener: QrLoginProgressListener,
|
||||
): Client {
|
||||
val slidingSyncType = getSlidingSyncType()
|
||||
if (slidingSyncType is ClientBuilderSlidingSync.Simplified) {
|
||||
Timber.d("Creating client for QR Code login with simplified sliding sync")
|
||||
try {
|
||||
return rustMatrixClientFactory
|
||||
.getBaseClientBuilder(
|
||||
sessionPaths = sessionPaths,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncType = slidingSyncType,
|
||||
)
|
||||
.passphrase(passphrase)
|
||||
.buildWithQrCode(qrCodeData, oidcConfiguration, progressListener)
|
||||
} catch (e: HumanQrLoginException.SlidingSyncNotAvailable) {
|
||||
Timber.e(e, "Failed to create client with simplified sliding sync, trying with Proxy now")
|
||||
}
|
||||
}
|
||||
Timber.d("Creating client for QR Code login with Proxy sliding sync")
|
||||
Timber.d("Creating client for QR Code login with simplified sliding sync")
|
||||
return rustMatrixClientFactory
|
||||
.getBaseClientBuilder(
|
||||
sessionPaths = sessionPaths,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncType = getSlidingSyncProxy(),
|
||||
slidingSyncType = ClientBuilderSlidingSync.Discovered,
|
||||
)
|
||||
.passphrase(passphrase)
|
||||
.buildWithQrCode(qrCodeData, oidcConfiguration, progressListener)
|
||||
}
|
||||
|
||||
private suspend fun getSlidingSyncType(nativeSlidingSyncFailed: Boolean = false) = when {
|
||||
appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first() && !nativeSlidingSyncFailed -> ClientBuilderSlidingSync.Simplified
|
||||
else -> getSlidingSyncProxy()
|
||||
}
|
||||
|
||||
private fun getSlidingSyncProxy() = when {
|
||||
AuthenticationConfig.SLIDING_SYNC_PROXY_URL != null -> ClientBuilderSlidingSync.CustomProxy(AuthenticationConfig.SLIDING_SYNC_PROXY_URL!!)
|
||||
else -> ClientBuilderSlidingSync.Discovered
|
||||
}
|
||||
|
||||
private fun clear() {
|
||||
currentClient?.close()
|
||||
currentClient = null
|
||||
|
||||
@@ -12,7 +12,6 @@ import io.element.android.libraries.matrix.impl.paths.SessionPaths
|
||||
import io.element.android.libraries.sessionstorage.api.LoginType
|
||||
import io.element.android.libraries.sessionstorage.api.SessionData
|
||||
import org.matrix.rustcomponents.sdk.Session
|
||||
import org.matrix.rustcomponents.sdk.SlidingSyncVersion
|
||||
import java.util.Date
|
||||
|
||||
internal fun Session.toSessionData(
|
||||
@@ -28,7 +27,7 @@ internal fun Session.toSessionData(
|
||||
refreshToken = refreshToken,
|
||||
homeserverUrl = homeserverUrl ?: this.homeserverUrl,
|
||||
oidcData = oidcData,
|
||||
slidingSyncProxy = (slidingSyncVersion as? SlidingSyncVersion.Proxy)?.url,
|
||||
slidingSyncProxy = null,
|
||||
loginTimestamp = Date(),
|
||||
isTokenValid = isTokenValid,
|
||||
loginType = loginType,
|
||||
|
||||
@@ -12,8 +12,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion as RustSlidingSyncVersio
|
||||
|
||||
internal fun RustSlidingSyncVersion.map(): SlidingSyncVersion {
|
||||
return when (this) {
|
||||
RustSlidingSyncVersion.None -> SlidingSyncVersion.None
|
||||
is RustSlidingSyncVersion.Proxy -> SlidingSyncVersion.Proxy
|
||||
RustSlidingSyncVersion.Native -> SlidingSyncVersion.Native
|
||||
RustSlidingSyncVersion.NONE -> SlidingSyncVersion.None
|
||||
RustSlidingSyncVersion.NATIVE -> SlidingSyncVersion.Native
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ class RustSessionVerificationService(
|
||||
|
||||
override suspend fun requestVerification() = tryOrFail {
|
||||
initVerificationControllerIfNeeded()
|
||||
verificationController.requestVerification()
|
||||
verificationController.requestDeviceVerification()
|
||||
}
|
||||
|
||||
override suspend fun cancelVerification() = tryOrFail {
|
||||
|
||||
@@ -14,9 +14,9 @@ import io.element.android.libraries.matrix.api.verification.SessionVerificationR
|
||||
import org.matrix.rustcomponents.sdk.SessionVerificationRequestDetails as RustSessionVerificationRequestDetails
|
||||
|
||||
fun RustSessionVerificationRequestDetails.map() = SessionVerificationRequestDetails(
|
||||
senderId = UserId(senderId),
|
||||
senderId = UserId(senderProfile.userId),
|
||||
flowId = FlowId(flowId),
|
||||
deviceId = DeviceId(deviceId),
|
||||
displayName = displayName,
|
||||
displayName = senderProfile.displayName,
|
||||
firstSeenTimestamp = firstSeenTimestamp.toLong(),
|
||||
)
|
||||
|
||||
@@ -11,7 +11,6 @@ import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import io.element.android.libraries.matrix.impl.createRustMatrixClientFactory
|
||||
import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory
|
||||
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
|
||||
import io.element.android.libraries.sessionstorage.api.SessionStore
|
||||
import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore
|
||||
import io.element.android.libraries.sessionstorage.test.aSessionData
|
||||
@@ -50,7 +49,6 @@ class RustMatrixAuthenticationServiceTest {
|
||||
rustMatrixClientFactory = rustMatrixClientFactory,
|
||||
passphraseGenerator = FakePassphraseGenerator(),
|
||||
oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory),
|
||||
appPreferencesStore = InMemoryAppPreferencesStore(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ import org.matrix.rustcomponents.sdk.Session
|
||||
import org.matrix.rustcomponents.sdk.SlidingSyncVersion
|
||||
|
||||
internal fun aRustSession(
|
||||
proxy: SlidingSyncVersion = SlidingSyncVersion.None,
|
||||
proxy: SlidingSyncVersion = SlidingSyncVersion.NONE,
|
||||
accessToken: String = "accessToken",
|
||||
refreshToken: String = "refreshToken",
|
||||
): Session {
|
||||
|
||||
@@ -72,7 +72,7 @@ class SessionKtTest {
|
||||
@Test
|
||||
fun `toSessionData copy the sliding sync url if present`() {
|
||||
val result = aRustSession(
|
||||
proxy = SlidingSyncVersion.Proxy("proxyUrl")
|
||||
proxy = SlidingSyncVersion.NATIVE
|
||||
).toSessionData(
|
||||
isTokenValid = true,
|
||||
loginType = LoginType.PASSWORD,
|
||||
@@ -80,7 +80,7 @@ class SessionKtTest {
|
||||
sessionPaths = SessionPaths(File("/a/file"), File("/a/cache")),
|
||||
homeserverUrl = A_HOMESERVER_URL_2,
|
||||
)
|
||||
assertThat(result.slidingSyncProxy).isEqualTo("proxyUrl")
|
||||
assertThat(result.slidingSyncProxy).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -20,9 +20,6 @@ interface AppPreferencesStore {
|
||||
suspend fun setTheme(theme: String)
|
||||
fun getThemeFlow(): Flow<String?>
|
||||
|
||||
suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean)
|
||||
fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean>
|
||||
|
||||
suspend fun setHideImagesAndVideos(value: Boolean)
|
||||
fun doesHideImagesAndVideosFlow(): Flow<Boolean>
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.preferences.api.store
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
class EnableNativeSlidingSyncUseCase @Inject constructor(
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
private val appCoroutineScope: CoroutineScope,
|
||||
) {
|
||||
operator fun invoke() {
|
||||
appCoroutineScope.launch {
|
||||
appPreferencesStore.setSimplifiedSlidingSyncEnabled(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.preferences.api.store
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.test.advanceUntilIdle
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
|
||||
class EnableNativeSlidingSyncUseCaseTest {
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@Test
|
||||
fun `ensure that the use case sets the simplified sliding sync enabled flag`() = runTest {
|
||||
val preferencesStore = InMemoryAppPreferencesStore()
|
||||
val useCase = EnableNativeSlidingSyncUseCase(preferencesStore, this)
|
||||
assertThat(preferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()).isFalse()
|
||||
|
||||
useCase()
|
||||
advanceUntilIdle()
|
||||
|
||||
assertThat(preferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()).isTrue()
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,6 @@ private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(na
|
||||
private val developerModeKey = booleanPreferencesKey("developerMode")
|
||||
private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseUrl")
|
||||
private val themeKey = stringPreferencesKey("theme")
|
||||
private val simplifiedSlidingSyncKey = booleanPreferencesKey("useSimplifiedSlidingSync")
|
||||
private val hideImagesAndVideosKey = booleanPreferencesKey("hideImagesAndVideos")
|
||||
private val logLevelKey = stringPreferencesKey("logLevel")
|
||||
|
||||
@@ -82,18 +81,6 @@ class DefaultAppPreferencesStore @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean) {
|
||||
store.edit { prefs ->
|
||||
prefs[simplifiedSlidingSyncKey] = enabled
|
||||
}
|
||||
}
|
||||
|
||||
override fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean> {
|
||||
return store.data.map { prefs ->
|
||||
prefs[simplifiedSlidingSyncKey] ?: true
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun setHideImagesAndVideos(value: Boolean) {
|
||||
store.edit { prefs ->
|
||||
prefs[hideImagesAndVideosKey] = value
|
||||
|
||||
@@ -51,14 +51,6 @@ class InMemoryAppPreferencesStore(
|
||||
return theme
|
||||
}
|
||||
|
||||
override suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean) {
|
||||
simplifiedSlidingSyncEnabled.value = enabled
|
||||
}
|
||||
|
||||
override fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean> {
|
||||
return simplifiedSlidingSyncEnabled
|
||||
}
|
||||
|
||||
override suspend fun setHideImagesAndVideos(value: Boolean) {
|
||||
hideImagesAndVideos.value = value
|
||||
}
|
||||
|
||||
@@ -122,6 +122,8 @@
|
||||
<string name="action_view_in_timeline">"Прагляд у хроніцы"</string>
|
||||
<string name="action_view_source">"Прагляд зыходнага кода"</string>
|
||||
<string name="action_yes">"Так"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ваш сервер зараз падтрымлівае новы, хутчэйшы пратакол. Выйдзіце з сістэмы і зноў увайдзіце, каб абнавіць яе. Гэта дапаможа вам пазбегнуць прымусовага выхаду з сістэмы, калі стары пратакол будзе пазней выдалены."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Даступна абнаўленне"</string>
|
||||
<string name="common_about">"Аб праграме"</string>
|
||||
<string name="common_acceptable_use_policy">"Палітыка дапушчальнага выкарыстання"</string>
|
||||
<string name="common_advanced_settings">"Пашыраныя налады"</string>
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
<string name="action_view_source">"Zobrazit zdroj"</string>
|
||||
<string name="action_yes">"Ano"</string>
|
||||
<string name="action_yes_try_again">"Ano, zkusit znovu"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Váš server nyní podporuje nový, rychlejší protokol. Chcete-li upgradovat, odhlaste se a znovu se přihlaste. Pokud to uděláte nyní, pomůže vám vyhnout se nucenému odhlášení, když bude starý protokol později odstraněn."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade k dispozici"</string>
|
||||
<string name="common_about">"O aplikaci"</string>
|
||||
<string name="common_acceptable_use_policy">"Zásady používání"</string>
|
||||
<string name="common_adding_caption">"Přidání titulku"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Quellcode anzeigen"</string>
|
||||
<string name="action_yes">"Ja"</string>
|
||||
<string name="action_yes_try_again">"Ja, versuchen Sie es noch einmal"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Dein Server unterstützt jetzt ein neues, schnelleres Protokoll. Melde dich ab und melde dich wieder an, um zu aktualisieren. Wenn du das jetzt tust, vermeidest du eine erzwungene Abmeldung, wenn das alte Protokoll später entfernt wird."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aktualisierung verfügbar"</string>
|
||||
<string name="common_about">"Über"</string>
|
||||
<string name="common_acceptable_use_policy">"Nutzungsrichtlinie"</string>
|
||||
<string name="common_adding_caption">"Hinzufügen einer Bildunterschrift"</string>
|
||||
|
||||
@@ -127,6 +127,8 @@
|
||||
<string name="action_view_in_timeline">"Προβολή στο χρονοδιάγραμμα"</string>
|
||||
<string name="action_view_source">"Προβολή πηγής"</string>
|
||||
<string name="action_yes">"Ναι"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ο διακομιστής σου υποστηρίζει τώρα ένα νέο, ταχύτερο πρωτόκολλο. Αποσυνδέσου και συνδέσου ξανά για αναβάθμιση τώρα. Κάνοντας αυτό τώρα θα σε βοηθήσει να αποφύγεις μια αναγκαστική αποσύνδεση όταν το παλιό πρωτόκολλο καταργηθεί αργότερα."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Διαθέσιμη αναβάθμιση"</string>
|
||||
<string name="common_about">"Σχετικά"</string>
|
||||
<string name="common_acceptable_use_policy">"Πολιτική αποδεκτής χρήσης"</string>
|
||||
<string name="common_adding_caption">"Η λεζάντα προστίθεται"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Vaata lähtekoodi"</string>
|
||||
<string name="action_yes">"Jah"</string>
|
||||
<string name="action_yes_try_again">"Jah, proovi uuesti"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Sinu koduserver toetab uut ja kiiremat protokolli. Uuendamiseks logi korraks rakendusest välja ja siis tagasi. Mingil hetkel tulevikus vana protokoll eemaldatakse kasutusest ja tehes uuenduse nüüd väldid hilisemat sundkorras uuendust."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Saadaval on uuendus"</string>
|
||||
<string name="common_about">"Rakenduse teave"</string>
|
||||
<string name="common_acceptable_use_policy">"Vastuvõetava kasutamise põhimõtted"</string>
|
||||
<string name="common_adding_caption">"Lisame selgitust"</string>
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
<string name="action_view_in_timeline">"دیدن در خط زمانی"</string>
|
||||
<string name="action_view_source">"دیدن منبع"</string>
|
||||
<string name="action_yes">"بله"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"ارتقا موجود است"</string>
|
||||
<string name="common_about">"درباره"</string>
|
||||
<string name="common_acceptable_use_policy">"سیاست استفادهٔ پذیرفتنی"</string>
|
||||
<string name="common_advanced_settings">"تنظیمات پیشرفته"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Näytä lähde"</string>
|
||||
<string name="action_yes">"Kyllä"</string>
|
||||
<string name="action_yes_try_again">"Kyllä, yritä uudelleen"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Palvelimesi tukee nyt uutta, nopeampaa protokollaa. Kirjaudu ulos ja takaisin sisään päivittääksesi nyt. Jos teet tämän nyt, voit välttää pakotetun uloskirjautumisen, kun vanha protokolla poistetaan myöhemmin."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Päivitys saatavilla"</string>
|
||||
<string name="common_about">"Tietoa"</string>
|
||||
<string name="common_acceptable_use_policy">"Hyväksyttävän käytön käytäntö"</string>
|
||||
<string name="common_adding_caption">"Lisätään kuvatekstiä"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Afficher la source"</string>
|
||||
<string name="action_yes">"Oui"</string>
|
||||
<string name="action_yes_try_again">"Oui, réessayez"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Votre serveur prend désormais en charge un nouveau protocole plus rapide. Déconnectez-vous, puis reconnectez-vous pour effectuer la mise à niveau dès maintenant. En le faisant tout de suite, vous éviterez une déconnexion forcée lorsque l’ancien protocole sera supprimé."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Mise à niveau disponible"</string>
|
||||
<string name="common_about">"À propos"</string>
|
||||
<string name="common_acceptable_use_policy">"Politique d’utilisation acceptable"</string>
|
||||
<string name="common_adding_caption">"Ajout d’une légende"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Forrás megtekintése"</string>
|
||||
<string name="action_yes">"Igen"</string>
|
||||
<string name="action_yes_try_again">"Igen, újrapróbálkozás"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"A kiszolgálója mostantól egy új, gyorsabb protokollt támogat. A frissítéshez jelentkezzen ki, majd jelentkezzen be újra. Ha ezt most megteszi, elkerülheti a kényszerített kijelentkeztetést a régi protokollt eltávolításakor."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Frissítés érhető el"</string>
|
||||
<string name="common_about">"Névjegy"</string>
|
||||
<string name="common_acceptable_use_policy">"Elfogadható használatra vonatkozó szabályzat"</string>
|
||||
<string name="common_adding_caption">"Felirat hozzáadása"</string>
|
||||
|
||||
@@ -125,6 +125,8 @@
|
||||
<string name="action_view_in_timeline">"Lihat di lini masa"</string>
|
||||
<string name="action_view_source">"Tampilkan sumber"</string>
|
||||
<string name="action_yes">"Ya"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Server Anda kini mendukung protokol baru yang lebih cepat. Keluar dan masuk lagi untuk memperbarui sekarang. Melakukan hal ini sekarang akan membantu Anda menghindari keluar paksa saat protokol lama dihapus nantinya."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Peningkatan tersedia"</string>
|
||||
<string name="common_about">"Tentang"</string>
|
||||
<string name="common_acceptable_use_policy">"Kebijakan penggunaan wajar"</string>
|
||||
<string name="common_adding_caption">"Menambahkan keterangan"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Vedi codice sorgente"</string>
|
||||
<string name="action_yes">"Sì"</string>
|
||||
<string name="action_yes_try_again">"Sì, riprova"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Il tuo server ora supporta un nuovo protocollo più veloce. Esci e rientra per effettuare l\'aggiornamento. Se lo fai ora, eviterai una disconnessione forzata quando il vecchio protocollo verrà rimosso in seguito."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aggiornamento disponibile"</string>
|
||||
<string name="common_about">"Informazioni"</string>
|
||||
<string name="common_acceptable_use_policy">"Regole sull\'utilizzo consentito"</string>
|
||||
<string name="common_adding_caption">"Aggiunta didascalia"</string>
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
<string name="action_take_photo">"Ta bilde"</string>
|
||||
<string name="action_view_source">"Vis kilde"</string>
|
||||
<string name="action_yes">"Ja"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Oppgradering tilgjengelig"</string>
|
||||
<string name="common_about">"Om"</string>
|
||||
<string name="common_acceptable_use_policy">"Retningslinjer for akseptabel bruk"</string>
|
||||
<string name="common_adding_caption">"Legger til bildetekst"</string>
|
||||
|
||||
@@ -120,6 +120,8 @@
|
||||
<string name="action_view_in_timeline">"Bekijk in tijdlijn"</string>
|
||||
<string name="action_view_source">"Bron weergeven"</string>
|
||||
<string name="action_yes">"Ja"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Je server ondersteunt nu een nieuw, sneller protocol. Log uit en log opnieuw in om nu te upgraden. Als je dit nu doet, voorkom je dat je geforceerd uitlogt wordt wanneer het oude protocol later wordt verwijderd."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade beschikbaar"</string>
|
||||
<string name="common_about">"Over"</string>
|
||||
<string name="common_acceptable_use_policy">"Beleid inzake redelijk gebruik"</string>
|
||||
<string name="common_advanced_settings">"Geavanceerde instellingen"</string>
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
<string name="action_view_source">"Wyświetl źródło"</string>
|
||||
<string name="action_yes">"Tak"</string>
|
||||
<string name="action_yes_try_again">"Tak, spróbuj ponownie"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Twój serwer obsługuje teraz nowy, szybszy protokół. Wyloguj się i zaloguj ponownie, aby uaktualnić teraz. Zrobienie tego teraz pomoże uniknąć wymuszonego wylogowania, gdy stary protokół zostanie później usunięty."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Dostępna aktualizacja"</string>
|
||||
<string name="common_about">"O programie"</string>
|
||||
<string name="common_acceptable_use_policy">"Polityka użytkowania"</string>
|
||||
<string name="common_adding_caption">"Dodawanie opisu"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Ver fonte"</string>
|
||||
<string name="action_yes">"Sim"</string>
|
||||
<string name="action_yes_try_again">"Sim, tentar novamente"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"O teu servidor suporta agora um protocolo novo e mais rápido. Termina a sessão e volta a iniciar sessão para atualizar agora. Se o fizeres agora, evitarás um fim de sessão forçado quando o protocolo antigo for removido mais tarde."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Atualização disponível"</string>
|
||||
<string name="common_about">"Sobre"</string>
|
||||
<string name="common_acceptable_use_policy">"Política de utilização aceitável"</string>
|
||||
<string name="common_adding_caption">"A adicionar legenda"</string>
|
||||
|
||||
@@ -123,6 +123,8 @@
|
||||
<string name="action_view_in_timeline">"Vedeți în cameră"</string>
|
||||
<string name="action_view_source">"Vedeți sursă"</string>
|
||||
<string name="action_yes">"Da"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Serverul dvs. acceptă acum un protocol nou, mai rapid. Deconectați-vă și conectați-vă din nou pentru a face upgrade acum. Dacă faceți acest lucru acum, vă va ajuta să evitați o deconectare forțată atunci când vechiul protocol este eliminat ulterior."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade disponibil"</string>
|
||||
<string name="common_about">"Despre"</string>
|
||||
<string name="common_acceptable_use_policy">"Politică de utilizare rezonabilă"</string>
|
||||
<string name="common_advanced_settings">"Setări avansate"</string>
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
<string name="action_view_source">"Показать источник"</string>
|
||||
<string name="action_yes">"Да"</string>
|
||||
<string name="action_yes_try_again">"Да, попробуйте еще раз"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Теперь ваш сервер поддерживает новый, более быстрый протокол. Чтобы обновить его прямо сейчас, выйдите и войдите в свою учётную запись снова. Сделав это сейчас, вы сможете избежать принудительного выхода из системы при последующем удалении старого протокола."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Доступно обновление"</string>
|
||||
<string name="common_about">"О приложении"</string>
|
||||
<string name="common_acceptable_use_policy">"Политика допустимого использования"</string>
|
||||
<string name="common_adding_caption">"Добавление подписи"</string>
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
<string name="action_view_source">"Zobraziť zdroj"</string>
|
||||
<string name="action_yes">"Áno"</string>
|
||||
<string name="action_yes_try_again">"Áno, skúsiť to znova"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Váš server teraz podporuje nový, rýchlejší protokol. Odhláste sa a prihláste sa znova, aby ste mohli aktualizovať. Ak to urobíte teraz, pomôže vám vyhnúť sa nútenému odhláseniu, keď sa starý protokol neskôr odstráni."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Aktualizácia je k dispozícii"</string>
|
||||
<string name="common_about">"O aplikácii"</string>
|
||||
<string name="common_acceptable_use_policy">"Zásady prijateľného používania"</string>
|
||||
<string name="common_adding_caption">"Pridáva sa titulok"</string>
|
||||
|
||||
@@ -127,6 +127,9 @@
|
||||
<string name="action_view_in_timeline">"Visa i tidslinjen"</string>
|
||||
<string name="action_view_source">"Visa källkod"</string>
|
||||
<string name="action_yes">"Ja"</string>
|
||||
<string name="action_yes_try_again">"Ja, försök igen"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Din server stöder nu ett nytt, snabbare protokoll. Logga ut och logga in igen för att uppgradera nu. Om du gör detta nu hjälper du dig att undvika en tvingad utloggning när det gamla protokollet tas bort senare."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Uppgradering tillgänglig"</string>
|
||||
<string name="common_about">"Om"</string>
|
||||
<string name="common_acceptable_use_policy">"Policy för godtagbar användning"</string>
|
||||
<string name="common_adding_caption">"Lägga till bildtext"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"Kaynağı görüntüle"</string>
|
||||
<string name="action_yes">"Evet"</string>
|
||||
<string name="action_yes_try_again">"Evet, tekrar dene"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Sunucunuz artık yeni, daha hızlı bir protokolü destekliyor. Şimdi oturumu kapatıp tekrar oturum açarak yükseltme yapın. Bunu şimdi yapmak, eski protokol daha sonra kaldırıldığında zorunlu oturum kapatmayı önlemenize yardımcı olacaktır."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Yükseltme mevcut"</string>
|
||||
<string name="common_about">"Hakkında"</string>
|
||||
<string name="common_acceptable_use_policy">"Kabul edilebilir kullanım politikası"</string>
|
||||
<string name="common_adding_caption">"Açıklama ekleme"</string>
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
<string name="action_view_source">"Переглянути джерело"</string>
|
||||
<string name="action_yes">"Так"</string>
|
||||
<string name="action_yes_try_again">"Так, повторити спробу"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Ваш сервер тепер підтримує новий, швидший протокол. Вийдіть із системи та увійдіть знову, щоб оновити систему зараз. Якщо ви зробите це зараз, це допоможе вам уникнути примусового виходу з системи, коли старий протокол буде видалено пізніше."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Доступне оновлення"</string>
|
||||
<string name="common_about">"Відомості"</string>
|
||||
<string name="common_acceptable_use_policy">"Політика прийнятного використання"</string>
|
||||
<string name="common_adding_caption">"Додавання підпису"</string>
|
||||
|
||||
@@ -126,6 +126,8 @@
|
||||
<string name="action_view_source">"檢視原始碼"</string>
|
||||
<string name="action_yes">"是"</string>
|
||||
<string name="action_yes_try_again">"是的,再試一次"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"您的伺服器現在支援新的、更快的協定。立即登出並重新登入以進行升級。現在這樣做將協助您避免在稍後移除舊協定時被強制登出。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"可升級"</string>
|
||||
<string name="common_about">"關於"</string>
|
||||
<string name="common_acceptable_use_policy">"可接受使用政策"</string>
|
||||
<string name="common_adding_caption">"新增標題"</string>
|
||||
|
||||
@@ -127,6 +127,8 @@
|
||||
<string name="action_view_source">"查看源码"</string>
|
||||
<string name="action_yes">"是"</string>
|
||||
<string name="action_yes_try_again">"是的,再试一次"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"您的服务器现在支持更快的新协议。现在登出并重新登录以进行升级。现在这样做可以帮助您避免在以后删除旧协议时被强制登出。"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"有可用升级"</string>
|
||||
<string name="common_about">"关于"</string>
|
||||
<string name="common_acceptable_use_policy">"可接受的使用政策"</string>
|
||||
<string name="common_adding_caption">"添加标题"</string>
|
||||
|
||||
@@ -129,6 +129,8 @@
|
||||
<string name="action_view_source">"View source"</string>
|
||||
<string name="action_yes">"Yes"</string>
|
||||
<string name="action_yes_try_again">"Yes, try again"</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_description">"Your server now supports a new, faster protocol. Log out and log back in to upgrade now. Doing this now will help you avoid a forced logout when the old protocol is removed later."</string>
|
||||
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade available"</string>
|
||||
<string name="common_about">"About"</string>
|
||||
<string name="common_acceptable_use_policy">"Acceptable use policy"</string>
|
||||
<string name="common_adding_caption">"Adding caption"</string>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,8 @@
|
||||
"name" : ":appnav",
|
||||
"includeRegex" : [
|
||||
"banner\\.migrate_to_native_sliding_sync\\.force_logout.title",
|
||||
"banner\\.migrate_to_native_sliding_sync\\.action"
|
||||
"banner\\.migrate_to_native_sliding_sync\\.action",
|
||||
"banner\\.migrate_to_native_sliding_sync\\.app_force_logout\\.title"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -168,7 +169,6 @@
|
||||
"session_verification_banner_.*",
|
||||
"confirm_recovery_key_banner_.*",
|
||||
"banner\\.set_up_recovery\\..*",
|
||||
"banner\\.migrate_to_native_sliding_sync\\..*",
|
||||
"full_screen_intent_banner_.*",
|
||||
"screen_migration_.*",
|
||||
"screen_invites_.*",
|
||||
|
||||
Reference in New Issue
Block a user