From 0dc80db9b722b368bbbb936c76a8b94b883b13df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Jul 2022 23:06:02 +0000 Subject: [PATCH 001/190] Bump dokka-gradle-plugin from 1.7.0 to 1.7.10 Bumps dokka-gradle-plugin from 1.7.0 to 1.7.10. --- updated-dependencies: - dependency-name: org.jetbrains.dokka:dokka-gradle-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 61027a0bff..ac223ca55b 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5' classpath "com.likethesalad.android:stem-plugin:2.1.1" classpath 'org.owasp:dependency-check-gradle:7.1.1' - classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.0" + classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.10" classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 6ed36e804b19e45d36a6de49ccc849dc68e8685c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Jul 2022 23:10:44 +0000 Subject: [PATCH 002/190] Bump io.gitlab.arturbosch.detekt from 1.20.0 to 1.21.0 Bumps io.gitlab.arturbosch.detekt from 1.20.0 to 1.21.0. --- updated-dependencies: - dependency-name: io.gitlab.arturbosch.detekt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e8472097d5..a0523dfaf7 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ plugins { // ktlint Plugin id "org.jlleitschuh.gradle.ktlint" version "10.3.0" // Detekt - id "io.gitlab.arturbosch.detekt" version "1.20.0" + id "io.gitlab.arturbosch.detekt" version "1.21.0" // Dependency Analysis id 'com.autonomousapps.dependency-analysis' version "1.9.0" From 50b7f3ef2c79fee177e1eab2a1ff771285d25045 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 19 Jul 2022 14:51:29 +0200 Subject: [PATCH 003/190] Ad group `io.github.davidburstrom.contester` for detekt 1.21.0 --- dependencies_groups.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle index e89c69a594..f60a77a92d 100644 --- a/dependencies_groups.gradle +++ b/dependencies_groups.gradle @@ -125,6 +125,7 @@ ext.groups = [ 'info.picocli', 'io.arrow-kt', 'io.element.android', + 'io.github.davidburstrom.contester', 'io.github.detekt.sarif4k', 'io.github.microutils', 'io.github.reactivecircus.flowbinding', From b4f833cb0d71a7e9d164538da14f57a9a813100e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 19 Jul 2022 14:53:12 +0200 Subject: [PATCH 004/190] Detekt: disable rule `InstanceOfCheckForException` --- tools/detekt/detekt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index a836edc47a..ac79e9e6cb 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -43,6 +43,8 @@ exceptions: active: false TooGenericExceptionThrown: active: false + InstanceOfCheckForException: + active: false complexity: TooManyFunctions: From 40f8d94954a6997d506bbf2951305ebd251fb206 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 19 Jul 2022 14:58:44 +0200 Subject: [PATCH 005/190] Detekt: Use require() instead of throwing an IllegalArgumentException. [UseRequire] --- .../org/matrix/android/sdk/api/util/StringOrderUtils.kt | 2 +- .../crypto/algorithms/megolm/MXMegolmEncryption.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt index 83c8585941..1de0a36034 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/StringOrderUtils.kt @@ -76,7 +76,7 @@ object StringOrderUtils { } fun stringToBase(x: String, alphabet: CharArray): BigInteger { - if (x.isEmpty()) throw IllegalArgumentException() + require(x.isNotEmpty()) val len = alphabet.size.toBigInteger() var result = BigInteger("0") x.reversed().forEachIndexed { index, c -> diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt index 48a25f2a8b..db7246caf5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt @@ -250,8 +250,10 @@ internal class MXMegolmEncryption( * @param sessionInfo the session info * @param devicesByUser the devices map */ - private suspend fun shareUserDevicesKey(sessionInfo: MXOutboundSessionInfo, - devicesByUser: Map>) { + private suspend fun shareUserDevicesKey( + sessionInfo: MXOutboundSessionInfo, + devicesByUser: Map> + ) { val sessionKey = olmDevice.getSessionKey(sessionInfo.sessionId) ?: return Unit.also { Timber.tag(loggerTag.value).v("shareUserDevicesKey() Failed to share session, failed to export") } @@ -533,7 +535,7 @@ internal class MXMegolmEncryption( @Throws override suspend fun shareHistoryKeysWithDevice(inboundSessionWrapper: InboundGroupSessionHolder, deviceInfo: CryptoDeviceInfo) { - if (!inboundSessionWrapper.wrapper.sessionData.sharedHistory) throw IllegalArgumentException("This key can't be shared") + require(inboundSessionWrapper.wrapper.sessionData.sharedHistory) { "This key can't be shared" } Timber.tag(loggerTag.value).i("process shareHistoryKeys for ${inboundSessionWrapper.wrapper.safeSessionId} to ${deviceInfo.shortDebugString()}") val userId = deviceInfo.userId val deviceId = deviceInfo.deviceId From 62f2fe1c1665109bb2ab279fd121dc1e773a9a68 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 19 Jul 2022 14:59:57 +0200 Subject: [PATCH 006/190] Detekt: This explicit usage of `it` as the lambda parameter name can be omitted. [ExplicitItLambdaParameter] --- .../session/room/send/queue/EventSenderProcessorThread.kt | 2 +- .../features/roommemberprofile/RoomMemberProfileViewModel.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt index c5b13043d7..51107c9655 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt @@ -119,7 +119,7 @@ internal class EventSenderProcessorThread @Inject constructor( override fun cancel(eventId: String, roomId: String) { (currentTask as? SendEventQueuedTask) - ?.takeIf { it -> it.event.eventId == eventId && it.event.roomId == roomId } + ?.takeIf { it.event.eventId == eventId && it.event.roomId == roomId } ?.cancel() } diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt index 2c30555696..d38b2a0a69 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -117,7 +117,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor( it.fold(true) { prev, dev -> prev && (dev.trustLevel?.crossSigningVerified == true) } ) } - .execute { it -> + .execute { copy( allDevicesAreTrusted = it()?.first == true, allDevicesAreCrossSignedTrusted = it()?.second == true From 2d761385a1bd9708bc9457747bba97035068e298 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 19 Jul 2022 15:02:05 +0200 Subject: [PATCH 007/190] Detekt: disable rule `UseCheckOrError` --- tools/detekt/detekt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index ac79e9e6cb..96adb3d117 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -23,6 +23,8 @@ style: active: false ProtectedMemberInFinalClass: active: false + UseCheckOrError: + active: false empty-blocks: EmptyFunctionBlock: From 4dccff4d788da05217cbf3d42ade9f662a21c55b Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 7 Jul 2022 16:59:38 +0100 Subject: [PATCH 008/190] Improves formatting in AppStateHandler --- .../java/im/vector/app/AppStateHandler.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/AppStateHandler.kt index e1b8bfc474..a4e10f776e 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/AppStateHandler.kt @@ -47,9 +47,8 @@ import javax.inject.Singleton /** * This class handles the global app state. - * It requires to be added to ProcessLifecycleOwner.get().lifecycle + * It is required that this class is added as an observer to ProcessLifecycleOwner.get().lifecycle in [VectorApplication] */ -// TODO Keep this class for now, will maybe be used fro Space @Singleton class AppStateHandler @Inject constructor( private val sessionDataSource: ActiveSessionDataSource, @@ -71,30 +70,39 @@ class AppStateHandler @Inject constructor( } } - fun setCurrentSpace(spaceId: String?, session: Session? = null, persistNow: Boolean = false, isForwardNavigation: Boolean = true) { + fun setCurrentSpace( + spaceId: String?, + session: Session? = null, + persistNow: Boolean = false, + isForwardNavigation: Boolean = true, + ) { + val activeSession = session ?: activeSessionHolder.getSafeActiveSession() ?: return val currentSpace = selectedSpaceDataSource.currentValue?.orNull() - val uSession = session ?: activeSessionHolder.getSafeActiveSession() ?: return - if (currentSpace != null && spaceId == currentSpace.roomId) return - val spaceSum = spaceId?.let { uSession.getRoomSummary(spaceId) } + val spaceSummary = spaceId?.let { activeSession.getRoomSummary(spaceId) } + val sameSpaceSelected = currentSpace != null && spaceId == currentSpace.roomId + + if (sameSpaceSelected) { + return + } if (isForwardNavigation) { spaceBackstack.addLast(currentSpace?.roomId) } if (persistNow) { - uiStateRepository.storeSelectedSpace(spaceSum?.roomId, uSession.sessionId) + uiStateRepository.storeSelectedSpace(spaceSummary?.roomId, activeSession.sessionId) } - if (spaceSum == null) { + if (spaceSummary == null) { selectedSpaceDataSource.post(Option.empty()) } else { - selectedSpaceDataSource.post(Option.just(spaceSum)) + selectedSpaceDataSource.post(Option.just(spaceSummary)) } if (spaceId != null) { - uSession.coroutineScope.launch(Dispatchers.IO) { + activeSession.coroutineScope.launch(Dispatchers.IO) { tryOrNull { - uSession.getRoom(spaceId)?.membershipService()?.loadRoomMembersIfNeeded() + activeSession.getRoom(spaceId)?.membershipService()?.loadRoomMembersIfNeeded() } } } From e4c8c88cee73c38c82d1db71151b5e9b0648e330 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Fri, 8 Jul 2022 10:05:05 +0100 Subject: [PATCH 009/190] Refactors AppStateHandler into interface implementation pattern --- .../java/im/vector/app/AppStateHandler.kt | 127 ++------------- .../java/im/vector/app/AppStateHandlerImpl.kt | 149 ++++++++++++++++++ .../app/features/home/HomeDetailViewModel.kt | 4 +- .../home/room/list/RoomListSectionBuilder.kt | 6 +- .../home/room/list/RoomListViewModel.kt | 2 +- .../createroom/CreateRoomViewModel.kt | 2 +- .../app/features/spaces/SpaceListViewModel.kt | 3 +- .../app/features/spaces/SpaceMenuViewModel.kt | 2 +- .../leave/SpaceLeaveAdvancedViewModel.kt | 24 +-- .../java/im/vector/app/AppStateHandlerTest.kt | 40 +++++ 10 files changed, 219 insertions(+), 140 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt create mode 100644 vector/src/test/java/im/vector/app/AppStateHandlerTest.kt diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/AppStateHandler.kt index a4e10f776e..ebc9d36c1d 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/AppStateHandler.kt @@ -1,11 +1,11 @@ /* - * Copyright 2019 New Vector Ltd + * Copyright (c) 2022 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,134 +17,25 @@ package im.vector.app import androidx.lifecycle.DefaultLifecycleObserver -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.asFlow import arrow.core.Option -import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.core.utils.BehaviorDataSource -import im.vector.app.features.analytics.AnalyticsTracker -import im.vector.app.features.analytics.plan.UserProperties -import im.vector.app.features.session.coroutineScope -import im.vector.app.features.ui.UiStateRepository -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.cancelChildren -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.extensions.tryOrNull +import kotlinx.coroutines.flow.Flow import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.getRoom -import org.matrix.android.sdk.api.session.getRoomSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.sync.SyncRequestState -import javax.inject.Inject -import javax.inject.Singleton -/** - * This class handles the global app state. - * It is required that this class is added as an observer to ProcessLifecycleOwner.get().lifecycle in [VectorApplication] - */ -@Singleton -class AppStateHandler @Inject constructor( - private val sessionDataSource: ActiveSessionDataSource, - private val uiStateRepository: UiStateRepository, - private val activeSessionHolder: ActiveSessionHolder, - private val analyticsTracker: AnalyticsTracker -) : DefaultLifecycleObserver { +interface AppStateHandler : DefaultLifecycleObserver { - private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) - private val selectedSpaceDataSource = BehaviorDataSource>(Option.empty()) - - val selectedSpaceFlow = selectedSpaceDataSource.stream() - - private val spaceBackstack = ArrayDeque() - - fun getCurrentSpace(): RoomSummary? { - return selectedSpaceDataSource.currentValue?.orNull()?.let { spaceSummary -> - activeSessionHolder.getSafeActiveSession()?.roomService()?.getRoomSummary(spaceSummary.roomId) - } - } + fun getCurrentSpace(): RoomSummary? fun setCurrentSpace( spaceId: String?, session: Session? = null, persistNow: Boolean = false, isForwardNavigation: Boolean = true, - ) { - val activeSession = session ?: activeSessionHolder.getSafeActiveSession() ?: return - val currentSpace = selectedSpaceDataSource.currentValue?.orNull() - val spaceSummary = spaceId?.let { activeSession.getRoomSummary(spaceId) } - val sameSpaceSelected = currentSpace != null && spaceId == currentSpace.roomId + ) - if (sameSpaceSelected) { - return - } + fun getSpaceBackstack(): ArrayDeque - if (isForwardNavigation) { - spaceBackstack.addLast(currentSpace?.roomId) - } + fun getSelectedSpaceFlow(): Flow> - if (persistNow) { - uiStateRepository.storeSelectedSpace(spaceSummary?.roomId, activeSession.sessionId) - } - - if (spaceSummary == null) { - selectedSpaceDataSource.post(Option.empty()) - } else { - selectedSpaceDataSource.post(Option.just(spaceSummary)) - } - - if (spaceId != null) { - activeSession.coroutineScope.launch(Dispatchers.IO) { - tryOrNull { - activeSession.getRoom(spaceId)?.membershipService()?.loadRoomMembersIfNeeded() - } - } - } - } - - private fun observeActiveSession() { - sessionDataSource.stream() - .distinctUntilChanged() - .onEach { - // sessionDataSource could already return a session while activeSession holder still returns null - it.orNull()?.let { session -> - setCurrentSpace(uiStateRepository.getSelectedSpace(session.sessionId), session) - observeSyncStatus(session) - } - } - .launchIn(coroutineScope) - } - - private fun observeSyncStatus(session: Session) { - session.syncService().getSyncRequestStateLive() - .asFlow() - .filterIsInstance() - .map { session.spaceService().getRootSpaceSummaries().size } - .distinctUntilChanged() - .onEach { spacesNumber -> - analyticsTracker.updateUserProperties(UserProperties(numSpaces = spacesNumber)) - }.launchIn(session.coroutineScope) - } - - fun getSpaceBackstack() = spaceBackstack - - fun safeActiveSpaceId(): String? { - return selectedSpaceDataSource.currentValue?.orNull()?.roomId - } - - override fun onResume(owner: LifecycleOwner) { - observeActiveSession() - } - - override fun onPause(owner: LifecycleOwner) { - coroutineScope.coroutineContext.cancelChildren() - val session = activeSessionHolder.getSafeActiveSession() ?: return - uiStateRepository.storeSelectedSpace(selectedSpaceDataSource.currentValue?.orNull()?.roomId, session.sessionId) - } + fun getSafeActiveSpaceId(): String? } diff --git a/vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt b/vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt new file mode 100644 index 0000000000..55a2a1a8bb --- /dev/null +++ b/vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt @@ -0,0 +1,149 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app + +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.asFlow +import arrow.core.Option +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.utils.BehaviorDataSource +import im.vector.app.features.analytics.AnalyticsTracker +import im.vector.app.features.analytics.plan.UserProperties +import im.vector.app.features.session.coroutineScope +import im.vector.app.features.ui.UiStateRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.getRoom +import org.matrix.android.sdk.api.session.getRoomSummary +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.sync.SyncRequestState +import javax.inject.Inject +import javax.inject.Singleton + +/** + * This class handles the global app state. + * It is required that this class is added as an observer to ProcessLifecycleOwner.get().lifecycle in [VectorApplication] + */ +@Singleton +class AppStateHandlerImpl @Inject constructor( + private val sessionDataSource: ActiveSessionDataSource, + private val uiStateRepository: UiStateRepository, + private val activeSessionHolder: ActiveSessionHolder, + private val analyticsTracker: AnalyticsTracker +) : AppStateHandler { + + private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + private val selectedSpaceDataSource = BehaviorDataSource>(Option.empty()) + private val selectedSpaceFlow = selectedSpaceDataSource.stream() + private val spaceBackstack = ArrayDeque() + + override fun getCurrentSpace(): RoomSummary? { + return selectedSpaceDataSource.currentValue?.orNull()?.let { spaceSummary -> + activeSessionHolder.getSafeActiveSession()?.roomService()?.getRoomSummary(spaceSummary.roomId) + } + } + + override fun setCurrentSpace( + spaceId: String?, + session: Session?, + persistNow: Boolean, + isForwardNavigation: Boolean, + ) { + val activeSession = session ?: activeSessionHolder.getSafeActiveSession() ?: return + val currentSpace = selectedSpaceDataSource.currentValue?.orNull() + val spaceSummary = spaceId?.let { activeSession.getRoomSummary(spaceId) } + val sameSpaceSelected = currentSpace != null && spaceId == currentSpace.roomId + + if (sameSpaceSelected) { + return + } + + if (isForwardNavigation) { + spaceBackstack.addLast(currentSpace?.roomId) + } + + if (persistNow) { + uiStateRepository.storeSelectedSpace(spaceSummary?.roomId, activeSession.sessionId) + } + + if (spaceSummary == null) { + selectedSpaceDataSource.post(Option.empty()) + } else { + selectedSpaceDataSource.post(Option.just(spaceSummary)) + } + + if (spaceId != null) { + activeSession.coroutineScope.launch(Dispatchers.IO) { + tryOrNull { + activeSession.getRoom(spaceId)?.membershipService()?.loadRoomMembersIfNeeded() + } + } + } + } + + private fun observeActiveSession() { + sessionDataSource.stream() + .distinctUntilChanged() + .onEach { + // sessionDataSource could already return a session while activeSession holder still returns null + it.orNull()?.let { session -> + setCurrentSpace(uiStateRepository.getSelectedSpace(session.sessionId), session) + observeSyncStatus(session) + } + } + .launchIn(coroutineScope) + } + + private fun observeSyncStatus(session: Session) { + session.syncService().getSyncRequestStateLive() + .asFlow() + .filterIsInstance() + .map { session.spaceService().getRootSpaceSummaries().size } + .distinctUntilChanged() + .onEach { spacesNumber -> + analyticsTracker.updateUserProperties(UserProperties(numSpaces = spacesNumber)) + }.launchIn(session.coroutineScope) + } + + override fun getSpaceBackstack() = spaceBackstack + + override fun getSelectedSpaceFlow() = selectedSpaceFlow + + override fun getSafeActiveSpaceId(): String? { + return selectedSpaceDataSource.currentValue?.orNull()?.roomId + } + + override fun onResume(owner: LifecycleOwner) { + observeActiveSession() + } + + override fun onPause(owner: LifecycleOwner) { + coroutineScope.coroutineContext.cancelChildren() + val session = activeSessionHolder.getSafeActiveSession() ?: return + uiStateRepository.storeSelectedSpace(selectedSpaceDataSource.currentValue?.orNull()?.roomId, session.sessionId) + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index 357d2b7c69..f16df17ead 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -207,7 +207,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomGroupingMethod() { - appStateHandler.selectedSpaceFlow + appStateHandler.getSelectedSpaceFlow() .setOnEach { copy( selectedSpace = it.orNull() @@ -216,7 +216,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomSummaries() { - appStateHandler.selectedSpaceFlow.distinctUntilChanged().flatMapLatest { + appStateHandler.getSelectedSpaceFlow().distinctUntilChanged().flatMapLatest { // we use it as a trigger to all changes in room, but do not really load // the actual models session.roomService().getPagedRoomSummariesLive( diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt index 42634c237a..3e9498891a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt @@ -359,7 +359,7 @@ class RoomListSectionBuilder( query: (RoomSummaryQueryParams.Builder) -> Unit ) { withQueryParams(query) { roomQueryParams -> - val updatedQueryParams = roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId()) + val updatedQueryParams = roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()) val liveQueryParams = MutableStateFlow(updatedQueryParams) val itemCountFlow = liveQueryParams .flatMapLatest { @@ -370,7 +370,7 @@ class RoomListSectionBuilder( val name = stringProvider.getString(nameRes) val filteredPagedRoomSummariesLive = session.roomService().getFilteredPagedRoomSummariesLive( - roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId()), + roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()), pagedListConfig ) when (spaceFilterStrategy) { @@ -417,7 +417,7 @@ class RoomListSectionBuilder( RoomAggregateNotificationCount(it.size, it.size) } else { session.roomService().getNotificationCountForRooms( - roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId()) + roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()) ) } ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index 44d61f9ed2..6a4d46dd05 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -148,7 +148,7 @@ class RoomListViewModel @AssistedInject constructor( private val roomListSectionBuilder = RoomListSectionBuilder( session, stringProvider, - appStateHandler, + appStateHandlerImpl, viewModelScope, autoAcceptInvites, { diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index e068d21b36..121007cf2a 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -73,7 +73,7 @@ class CreateRoomViewModel @AssistedInject constructor( initHomeServerName() initAdminE2eByDefault() - val parentSpaceId = initialState.parentSpaceId ?: appStateHandler.safeActiveSpaceId() + val parentSpaceId = initialState.parentSpaceId ?: appStateHandler.getSafeActiveSpaceId() val restrictedSupport = session.homeServerCapabilitiesService().getHomeServerCapabilities() .isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index 3b2fb31b74..a72c6cc0c2 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -85,8 +85,7 @@ class SpaceListViewModel @AssistedInject constructor( } observeSpaceSummaries() -// observeSelectionState() - appStateHandler.selectedSpaceFlow + appStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .setOnEach { selectedSpaceOption -> copy( diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt index 7b53b09187..e50fa5540c 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt @@ -73,7 +73,7 @@ class SpaceMenuViewModel @AssistedInject constructor( it.getOrNull()?.let { if (it.membership == Membership.LEAVE) { setState { copy(leavingState = Success(Unit)) } - if (appStateHandler.safeActiveSpaceId() == initialState.spaceId) { + if (appStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { // switch to home? appStateHandler.setCurrentSpace(null, session) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt index 7413386709..4b6657fc47 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt @@ -75,19 +75,19 @@ class SpaceLeaveAdvancedViewModel @AssistedInject constructor( } setState { copy(spaceSummary = spaceSummary) } - session.getRoom(initialState.spaceId)?.let { room -> - room.flow().liveRoomSummary() - .unwrap() - .onEach { - if (it.membership == Membership.LEAVE) { - setState { copy(leaveState = Success(Unit)) } - if (appStateHandler.safeActiveSpaceId() == initialState.spaceId) { - // switch to home? - appStateHandler.setCurrentSpace(null, session) - } + session.getRoom(initialState.spaceId) + ?.flow() + ?.liveRoomSummary() + ?.unwrap() + ?.onEach { + if (it.membership == Membership.LEAVE) { + setState { copy(leaveState = Success(Unit)) } + if (appStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { + // switch to home? + appStateHandler.setCurrentSpace(null, session) } - }.launchIn(viewModelScope) - } + } + }?.launchIn(viewModelScope) viewModelScope.launch { val children = session.roomService().getRoomSummaries( diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt new file mode 100644 index 0000000000..ac839ac806 --- /dev/null +++ b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app + +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.features.analytics.AnalyticsTracker +import im.vector.app.features.ui.UiStateRepository +import io.mockk.mockk + +internal class AppStateHandlerTest { + + private val sessionDataSource: ActiveSessionDataSource = mockk() + private val uiStateRepository: UiStateRepository = mockk() + private val activeSessionHolder: ActiveSessionHolder = mockk() + private val analyticsTracker: AnalyticsTracker = mockk() + + private val appStateHandlerImpl = AppStateHandlerImpl( + sessionDataSource, + uiStateRepository, + activeSessionHolder, + analyticsTracker, + ) + + + +} From fbdbfb6be272110db08193154b67de72937a107d Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Fri, 8 Jul 2022 11:56:00 +0100 Subject: [PATCH 010/190] Post cherry pick fix --- .../main/java/im/vector/app/core/di/SingletonModule.kt | 5 +++++ .../app/features/home/UnreadMessagesSharedViewModel.kt | 8 ++++---- .../features/home/room/list/RoomListSectionBuilder.kt | 10 +++++----- .../app/features/home/room/list/RoomListViewModel.kt | 4 ++-- .../src/test/java/im/vector/app/AppStateHandlerTest.kt | 7 +++++++ 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt index 602fd73034..c5e27af761 100644 --- a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt @@ -28,6 +28,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import im.vector.app.AppStateHandler +import im.vector.app.AppStateHandlerImpl import im.vector.app.BuildConfig import im.vector.app.EmojiCompatWrapper import im.vector.app.EmojiSpanify @@ -108,6 +110,9 @@ abstract class VectorBindModule { @Binds abstract fun bindSystemSettingsProvide(provider: AndroidSystemSettingsProvider): SystemSettingsProvider + + @Binds + abstract fun bindAppStateHandler(appStateHandlerImpl: AppStateHandlerImpl): AppStateHandler } @InstallIn(SingletonComponent::class) diff --git a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt index f2e6b7e064..074149a255 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt @@ -109,8 +109,8 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor( } combine( - appStateHandler.selectedSpaceFlow.distinctUntilChanged(), - appStateHandler.selectedSpaceFlow.flatMapLatest { + appStateHandler.getSelectedSpaceFlow().distinctUntilChanged(), + appStateHandler.getSelectedSpaceFlow().flatMapLatest { roomService.getPagedRoomSummariesLive( roomSummaryQueryParams { this.memberships = Membership.activeMemberships() @@ -161,10 +161,10 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor( CountInfo( homeCount = counts, otherCount = RoomAggregateNotificationCount( - notificationCount = rootCounts.fold(0, { acc, rs -> acc + rs.notificationCount }) + + notificationCount = rootCounts.fold(0) { acc, rs -> acc + rs.notificationCount } + (counts.notificationCount.takeIf { selectedSpace != null } ?: 0) + spaceInviteCount, - highlightCount = rootCounts.fold(0, { acc, rs -> acc + rs.highlightCount }) + + highlightCount = rootCounts.fold(0) { acc, rs -> acc + rs.highlightCount } + (counts.highlightCount.takeIf { selectedSpace != null } ?: 0) + spaceInviteCount ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt index 3e9498891a..d91f8f6e5d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt @@ -94,7 +94,7 @@ class RoomListSectionBuilder( } } - appStateHandler.selectedSpaceFlow + appStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .onEach { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() @@ -149,7 +149,7 @@ class RoomListSectionBuilder( ) { it.memberships = listOf(Membership.JOIN) it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS - it.roomTagQueryFilter = RoomTagQueryFilter(false, false, false) + it.roomTagQueryFilter = RoomTagQueryFilter(isFavorite = false, isLowPriority = false, isServerNotice = false) } addSection( @@ -186,7 +186,7 @@ class RoomListSectionBuilder( // add suggested rooms val suggestedRoomsFlow = // MutableLiveData>() - appStateHandler.selectedSpaceFlow + appStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .flatMapLatest { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() @@ -270,7 +270,7 @@ class RoomListSectionBuilder( ) { it.memberships = listOf(Membership.JOIN) it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM - it.roomTagQueryFilter = RoomTagQueryFilter(false, false, null) + it.roomTagQueryFilter = RoomTagQueryFilter(isFavorite = false, isLowPriority = false, isServerNotice = null) } addSection( @@ -282,7 +282,7 @@ class RoomListSectionBuilder( ) { it.memberships = listOf(Membership.JOIN) it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM - it.roomTagQueryFilter = RoomTagQueryFilter(false, true, null) + it.roomTagQueryFilter = RoomTagQueryFilter(isFavorite = false, isLowPriority = true, isServerNotice = null) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index 6a4d46dd05..e51bdc5841 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -100,7 +100,7 @@ class RoomListViewModel @AssistedInject constructor( observeMembershipChanges() observeLocalRooms() - appStateHandler.selectedSpaceFlow + appStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .execute { copy( @@ -148,7 +148,7 @@ class RoomListViewModel @AssistedInject constructor( private val roomListSectionBuilder = RoomListSectionBuilder( session, stringProvider, - appStateHandlerImpl, + appStateHandler, viewModelScope, autoAcceptInvites, { diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt index ac839ac806..1ff645a9e5 100644 --- a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt +++ b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt @@ -20,6 +20,8 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.ui.UiStateRepository import io.mockk.mockk +import org.amshove.kluent.shouldBe +import org.junit.Test internal class AppStateHandlerTest { @@ -35,6 +37,11 @@ internal class AppStateHandlerTest { analyticsTracker, ) + @Test + fun `given selected space is null, when getCurrentSpace, then return null`() { + val currentSpace = appStateHandlerImpl.getCurrentSpace() + currentSpace shouldBe null + } } From 49992f682efb49eed4d028a5caebc63119275724 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 08:12:04 +0200 Subject: [PATCH 011/190] Adds test for existing space --- .../java/im/vector/app/AppStateHandlerTest.kt | 34 ++++++++++++++++--- .../im/vector/app/test/fakes/FakeSession.kt | 10 ++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt index 1ff645a9e5..51e5308a92 100644 --- a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt +++ b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt @@ -16,32 +16,56 @@ package im.vector.app -import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.ui.UiStateRepository +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeSession +import io.mockk.every +import io.mockk.justRun import io.mockk.mockk import org.amshove.kluent.shouldBe +import org.junit.Before import org.junit.Test +import org.matrix.android.sdk.api.session.room.model.RoomSummary internal class AppStateHandlerTest { + private val spaceId = "spaceId" + private val spaceSummary: RoomSummary = mockk { + every { roomId } returns spaceId + } + private val session = FakeSession.withRoomSummary(spaceSummary) + private val sessionDataSource: ActiveSessionDataSource = mockk() private val uiStateRepository: UiStateRepository = mockk() - private val activeSessionHolder: ActiveSessionHolder = mockk() + private val activeSessionHolder = FakeActiveSessionHolder(session).instance private val analyticsTracker: AnalyticsTracker = mockk() - private val appStateHandlerImpl = AppStateHandlerImpl( + private val appStateHandler = AppStateHandlerImpl( sessionDataSource, uiStateRepository, activeSessionHolder, analyticsTracker, ) + @Before + fun setup() { + justRun { uiStateRepository.storeSelectedSpace(any(), any()) } + } + @Test - fun `given selected space is null, when getCurrentSpace, then return null`() { - val currentSpace = appStateHandlerImpl.getCurrentSpace() + fun `given selected space doesn't exist, when getCurrentSpace, then return null`() { + val currentSpace = appStateHandler.getCurrentSpace() currentSpace shouldBe null } + @Test + fun `given selected space exists, when getCurrentSpace, then return selected space`() { + appStateHandler.setCurrentSpace(spaceId, session) + + val currentSpace = appStateHandler.getCurrentSpace() + + currentSpace shouldBe spaceSummary + } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt index 3af15a7e5c..e62214e310 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt @@ -23,11 +23,14 @@ import im.vector.app.features.session.VectorSessionStore import im.vector.app.test.testCoroutineDispatchers import io.mockk.coEvery import io.mockk.coJustRun +import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.getRoomSummary import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService import org.matrix.android.sdk.api.session.profile.ProfileService +import org.matrix.android.sdk.api.session.room.model.RoomSummary class FakeSession( val fakeCryptoService: FakeCryptoService = FakeCryptoService(), @@ -65,4 +68,11 @@ class FakeSession( this@FakeSession.startSyncing(any()) } } + + companion object { + + fun withRoomSummary(roomSummary: RoomSummary) = FakeSession().apply { + every { getRoomSummary(any()) } returns roomSummary + } + } } From f770ae065318f747829e4e3fd74e81a3175e5c14 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 08:53:08 +0200 Subject: [PATCH 012/190] Adds tests for persist space and backstack --- .../im/vector/app/AppStateHandlerImplTest.kt | 116 ++++++++++++++++++ .../java/im/vector/app/AppStateHandlerTest.kt | 71 ----------- .../app/test/fakes/FakeUiStateRepository.kt | 29 +++++ 3 files changed, 145 insertions(+), 71 deletions(-) create mode 100644 vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt delete mode 100644 vector/src/test/java/im/vector/app/AppStateHandlerTest.kt create mode 100644 vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt new file mode 100644 index 0000000000..f523208c97 --- /dev/null +++ b/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app + +import im.vector.app.test.fakes.FakeActiveSessionDataSource +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeAnalyticsTracker +import im.vector.app.test.fakes.FakeSession +import im.vector.app.test.fakes.FakeUiStateRepository +import io.mockk.every +import io.mockk.justRun +import io.mockk.mockk +import org.amshove.kluent.shouldBe +import org.amshove.kluent.shouldBeEqualTo +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.session.room.model.RoomSummary + +internal class AppStateHandlerImplTest { + + private val spaceId = "spaceId" + private val spaceSummary: RoomSummary = mockk() + private val session = FakeSession.withRoomSummary(spaceSummary) + + private val sessionDataSource = FakeActiveSessionDataSource() + private val uiStateRepository = FakeUiStateRepository() + private val activeSessionHolder = FakeActiveSessionHolder(session) + private val analyticsTracker = FakeAnalyticsTracker() + + private val appStateHandler = AppStateHandlerImpl( + sessionDataSource.instance, + uiStateRepository, + activeSessionHolder.instance, + analyticsTracker, + ) + + @Before + fun setup() { + justRun { uiStateRepository.storeSelectedSpace(any(), any()) } + every { spaceSummary.roomId } returns spaceId + } + + @Test + fun `given selected space doesn't exist, when getCurrentSpace, then return null`() { + val currentSpace = appStateHandler.getCurrentSpace() + + currentSpace shouldBe null + } + + @Test + fun `given selected space exists, when getCurrentSpace, then return selected space`() { + appStateHandler.setCurrentSpace(spaceId, session) + + val currentSpace = appStateHandler.getCurrentSpace() + + currentSpace shouldBe spaceSummary + } + + @Test + fun `given persistNow is true, when setCurrentSpace, then immediately persist to ui state`() { + appStateHandler.setCurrentSpace(spaceId, session, persistNow = true) + + uiStateRepository.verifyStoreSelectedSpace(spaceId, session) + } + + @Test + fun `given persistNow is false, when setCurrentSpace, then don't immediately persist to ui state`() { + appStateHandler.setCurrentSpace(spaceId, session, persistNow = false) + + uiStateRepository.verifyStoreSelectedSpace(spaceId, session, inverse = true) + } + + @Test + fun `given is forward navigation and no current space, when setCurrentSpace, then null added to backstack`() { + appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) + + val backstack = appStateHandler.getSpaceBackstack() + + backstack.size shouldBe 1 + backstack.first() shouldBe null + } + + @Test + fun `given is forward navigation and is in space, when setCurrentSpace, then previous space added to backstack`() { + appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) + appStateHandler.setCurrentSpace("secondSpaceId", session, isForwardNavigation = true) + + val backstack = appStateHandler.getSpaceBackstack() + + backstack.size shouldBe 2 + backstack shouldBeEqualTo listOf(null, spaceId) + } + + @Test + fun `given is not forward navigation, when setCurrentSpace, then previous space not added to backstack`() { + appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = false) + + val backstack = appStateHandler.getSpaceBackstack() + + backstack.size shouldBe 0 + } +} diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt deleted file mode 100644 index 51e5308a92..0000000000 --- a/vector/src/test/java/im/vector/app/AppStateHandlerTest.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2022 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app - -import im.vector.app.features.analytics.AnalyticsTracker -import im.vector.app.features.ui.UiStateRepository -import im.vector.app.test.fakes.FakeActiveSessionHolder -import im.vector.app.test.fakes.FakeSession -import io.mockk.every -import io.mockk.justRun -import io.mockk.mockk -import org.amshove.kluent.shouldBe -import org.junit.Before -import org.junit.Test -import org.matrix.android.sdk.api.session.room.model.RoomSummary - -internal class AppStateHandlerTest { - - private val spaceId = "spaceId" - private val spaceSummary: RoomSummary = mockk { - every { roomId } returns spaceId - } - private val session = FakeSession.withRoomSummary(spaceSummary) - - private val sessionDataSource: ActiveSessionDataSource = mockk() - private val uiStateRepository: UiStateRepository = mockk() - private val activeSessionHolder = FakeActiveSessionHolder(session).instance - private val analyticsTracker: AnalyticsTracker = mockk() - - private val appStateHandler = AppStateHandlerImpl( - sessionDataSource, - uiStateRepository, - activeSessionHolder, - analyticsTracker, - ) - - @Before - fun setup() { - justRun { uiStateRepository.storeSelectedSpace(any(), any()) } - } - - @Test - fun `given selected space doesn't exist, when getCurrentSpace, then return null`() { - val currentSpace = appStateHandler.getCurrentSpace() - - currentSpace shouldBe null - } - - @Test - fun `given selected space exists, when getCurrentSpace, then return selected space`() { - appStateHandler.setCurrentSpace(spaceId, session) - - val currentSpace = appStateHandler.getCurrentSpace() - - currentSpace shouldBe spaceSummary - } -} diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt new file mode 100644 index 0000000000..3b38e4512c --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.test.fakes + +import im.vector.app.features.ui.UiStateRepository +import io.mockk.mockk +import io.mockk.verify +import org.matrix.android.sdk.api.session.Session + +class FakeUiStateRepository : UiStateRepository by mockk() { + + fun verifyStoreSelectedSpace(roomId: String, session: Session, inverse: Boolean = false) { + verify(inverse = inverse) { storeSelectedSpace(roomId, session.sessionId) } + } +} From 9a649b6093e1e377bedea7e7a8ccd73d947bf9ed Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 09:39:12 +0200 Subject: [PATCH 013/190] Adds tests for selectedSpaceFlow and activeSpaceId --- .../im/vector/app/AppStateHandlerImplTest.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt b/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt index f523208c97..6f0c33f998 100644 --- a/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt +++ b/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt @@ -24,6 +24,8 @@ import im.vector.app.test.fakes.FakeUiStateRepository import io.mockk.every import io.mockk.justRun import io.mockk.mockk +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBe import org.amshove.kluent.shouldBeEqualTo import org.junit.Before @@ -113,4 +115,29 @@ internal class AppStateHandlerImplTest { backstack.size shouldBe 0 } + + @Test + fun `when setCurrentSpace, then space is emitted to selectedSpaceFlow`() = runTest { + appStateHandler.setCurrentSpace(spaceId, session) + + val currentSpace = appStateHandler.getSelectedSpaceFlow().first().orNull() + + currentSpace shouldBeEqualTo spaceSummary + } + + @Test + fun `given current space exists, when getSafeActiveSpaceId, then return current space id`() { + appStateHandler.setCurrentSpace(spaceId, session) + + val activeSpaceId = appStateHandler.getSafeActiveSpaceId() + + activeSpaceId shouldBeEqualTo spaceId + } + + @Test + fun `given current space doesn't exist, when getSafeActiveSpaceId, then return current null`() { + val activeSpaceId = appStateHandler.getSafeActiveSpaceId() + + activeSpaceId shouldBe null + } } From f0ae458a5489bdb1ed8015de4dca13dc58d4d358 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 10:10:44 +0200 Subject: [PATCH 014/190] Changes AppStateHandler to SpaceStateHandler --- ...ppStateHandler.kt => SpaceStateHandler.kt} | 2 +- ...andlerImpl.kt => SpaceStateHandlerImpl.kt} | 4 +- .../java/im/vector/app/VectorApplication.kt | 4 +- .../im/vector/app/core/di/SingletonModule.kt | 6 +-- .../vector/app/features/home/HomeActivity.kt | 4 +- .../app/features/home/HomeDetailFragment.kt | 14 +++---- .../app/features/home/HomeDetailViewModel.kt | 10 ++--- .../home/UnreadMessagesSharedViewModel.kt | 8 ++-- .../home/room/detail/TimelineViewModel.kt | 10 ++--- .../home/room/list/RoomListSectionBuilder.kt | 14 +++---- .../home/room/list/RoomListViewModel.kt | 8 ++-- .../features/navigation/DefaultNavigator.kt | 14 +++---- .../createroom/CreateRoomViewModel.kt | 6 +-- .../app/features/spaces/SpaceListViewModel.kt | 8 ++-- .../app/features/spaces/SpaceMenuViewModel.kt | 8 ++-- .../leave/SpaceLeaveAdvancedViewModel.kt | 8 ++-- ...plTest.kt => SpaceStateHandlerImplTest.kt} | 38 +++++++++---------- 17 files changed, 83 insertions(+), 83 deletions(-) rename vector/src/main/java/im/vector/app/{AppStateHandler.kt => SpaceStateHandler.kt} (95%) rename vector/src/main/java/im/vector/app/{AppStateHandlerImpl.kt => SpaceStateHandlerImpl.kt} (98%) rename vector/src/test/java/im/vector/app/{AppStateHandlerImplTest.kt => SpaceStateHandlerImplTest.kt} (73%) diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/SpaceStateHandler.kt similarity index 95% rename from vector/src/main/java/im/vector/app/AppStateHandler.kt rename to vector/src/main/java/im/vector/app/SpaceStateHandler.kt index ebc9d36c1d..7a98025734 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/SpaceStateHandler.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.Flow import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.model.RoomSummary -interface AppStateHandler : DefaultLifecycleObserver { +interface SpaceStateHandler : DefaultLifecycleObserver { fun getCurrentSpace(): RoomSummary? diff --git a/vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt b/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt similarity index 98% rename from vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt rename to vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt index 55a2a1a8bb..23c9d7e4c9 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandlerImpl.kt +++ b/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt @@ -49,12 +49,12 @@ import javax.inject.Singleton * It is required that this class is added as an observer to ProcessLifecycleOwner.get().lifecycle in [VectorApplication] */ @Singleton -class AppStateHandlerImpl @Inject constructor( +class SpaceStateHandlerImpl @Inject constructor( private val sessionDataSource: ActiveSessionDataSource, private val uiStateRepository: UiStateRepository, private val activeSessionHolder: ActiveSessionHolder, private val analyticsTracker: AnalyticsTracker -) : AppStateHandler { +) : SpaceStateHandler { private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) private val selectedSpaceDataSource = BehaviorDataSource>(Option.empty()) diff --git a/vector/src/main/java/im/vector/app/VectorApplication.kt b/vector/src/main/java/im/vector/app/VectorApplication.kt index 3cb0423ca8..a0a3b20e11 100644 --- a/vector/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector/src/main/java/im/vector/app/VectorApplication.kt @@ -90,7 +90,7 @@ class VectorApplication : @Inject lateinit var vectorPreferences: VectorPreferences @Inject lateinit var versionProvider: VersionProvider @Inject lateinit var notificationUtils: NotificationUtils - @Inject lateinit var appStateHandler: AppStateHandler + @Inject lateinit var spaceStateHandler: SpaceStateHandler @Inject lateinit var popupAlertManager: PopupAlertManager @Inject lateinit var pinLocker: PinLocker @Inject lateinit var callManager: WebRtcCallManager @@ -187,7 +187,7 @@ class VectorApplication : fcmHelper.onEnterBackground(activeSessionHolder) } }) - ProcessLifecycleOwner.get().lifecycle.addObserver(appStateHandler) + ProcessLifecycleOwner.get().lifecycle.addObserver(spaceStateHandler) ProcessLifecycleOwner.get().lifecycle.addObserver(pinLocker) ProcessLifecycleOwner.get().lifecycle.addObserver(callManager) // This should be done as early as possible diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt index c5e27af761..5c70e9be53 100644 --- a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt @@ -28,8 +28,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import im.vector.app.AppStateHandler -import im.vector.app.AppStateHandlerImpl +import im.vector.app.SpaceStateHandler +import im.vector.app.SpaceStateHandlerImpl import im.vector.app.BuildConfig import im.vector.app.EmojiCompatWrapper import im.vector.app.EmojiSpanify @@ -112,7 +112,7 @@ abstract class VectorBindModule { abstract fun bindSystemSettingsProvide(provider: AndroidSystemSettingsProvider): SystemSettingsProvider @Binds - abstract fun bindAppStateHandler(appStateHandlerImpl: AppStateHandlerImpl): AppStateHandler + abstract fun bindSpaceStateHandler(spaceStateHandlerImpl: SpaceStateHandlerImpl): SpaceStateHandler } @InstallIn(SingletonComponent::class) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index d82621977f..9d59ba1574 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -35,7 +35,7 @@ import com.airbnb.mvrx.Mavericks import com.airbnb.mvrx.viewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.extensions.hideKeyboard @@ -129,7 +129,7 @@ class HomeActivity : @Inject lateinit var permalinkHandler: PermalinkHandler @Inject lateinit var avatarRenderer: AvatarRenderer @Inject lateinit var initSyncStepFormatter: InitSyncStepFormatter - @Inject lateinit var appStateHandler: AppStateHandler + @Inject lateinit var spaceStateHandler: SpaceStateHandler @Inject lateinit var unifiedPushHelper: UnifiedPushHelper @Inject lateinit var fcmHelper: FcmHelper diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 828e4cc26c..54ff44d2c3 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -28,7 +28,7 @@ import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.badge.BadgeDrawable -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.R import im.vector.app.core.extensions.commitTransaction import im.vector.app.core.extensions.toMvRxBundle @@ -66,7 +66,7 @@ class HomeDetailFragment @Inject constructor( private val alertManager: PopupAlertManager, private val callManager: WebRtcCallManager, private val vectorPreferences: VectorPreferences, - private val appStateHandler: AppStateHandler + private val spaceStateHandler: SpaceStateHandler ) : VectorBaseFragment(), KeysBackupBanner.Delegate, CurrentCallsView.Callback, @@ -183,13 +183,13 @@ class HomeDetailFragment @Inject constructor( } private fun navigateBack() { - val previousSpaceId = appStateHandler.getSpaceBackstack().removeLastOrNull() - val parentSpaceId = appStateHandler.getCurrentSpace()?.flattenParentIds?.lastOrNull() + val previousSpaceId = spaceStateHandler.getSpaceBackstack().removeLastOrNull() + val parentSpaceId = spaceStateHandler.getCurrentSpace()?.flattenParentIds?.lastOrNull() setCurrentSpace(previousSpaceId ?: parentSpaceId) } private fun setCurrentSpace(spaceId: String?) { - appStateHandler.setCurrentSpace(spaceId, isForwardNavigation = false) + spaceStateHandler.setCurrentSpace(spaceId, isForwardNavigation = false) sharedActionViewModel.post(HomeActivitySharedAction.OnCloseSpace) } @@ -212,7 +212,7 @@ class HomeDetailFragment @Inject constructor( } private fun refreshSpaceState() { - appStateHandler.getCurrentSpace()?.let { + spaceStateHandler.getCurrentSpace()?.let { onSpaceChange(it) } } @@ -466,7 +466,7 @@ class HomeDetailFragment @Inject constructor( return this } - override fun onBackPressed(toolbarButton: Boolean) = if (appStateHandler.getCurrentSpace() != null) { + override fun onBackPressed(toolbarButton: Boolean) = if (spaceStateHandler.getCurrentSpace() != null) { navigateBack() true } else { diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index f16df17ead..ede9872a9b 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -22,7 +22,7 @@ import com.airbnb.mvrx.ViewModelContext import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.extensions.singletonEntryPoint @@ -68,7 +68,7 @@ class HomeDetailViewModel @AssistedInject constructor( private val vectorDataStore: VectorDataStore, private val callManager: WebRtcCallManager, private val directRoomHelper: DirectRoomHelper, - private val appStateHandler: AppStateHandler, + private val spaceStateHandler: SpaceStateHandler, private val autoAcceptInvites: AutoAcceptInvites, private val vectorOverrides: VectorOverrides ) : VectorViewModel(initialState), @@ -207,7 +207,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomGroupingMethod() { - appStateHandler.getSelectedSpaceFlow() + spaceStateHandler.getSelectedSpaceFlow() .setOnEach { copy( selectedSpace = it.orNull() @@ -216,7 +216,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomSummaries() { - appStateHandler.getSelectedSpaceFlow().distinctUntilChanged().flatMapLatest { + spaceStateHandler.getSelectedSpaceFlow().distinctUntilChanged().flatMapLatest { // we use it as a trigger to all changes in room, but do not really load // the actual models session.roomService().getPagedRoomSummariesLive( @@ -228,7 +228,7 @@ class HomeDetailViewModel @AssistedInject constructor( } .throttleFirst(300) .onEach { - val activeSpaceRoomId = appStateHandler.getCurrentSpace()?.roomId + val activeSpaceRoomId = spaceStateHandler.getCurrentSpace()?.roomId var dmInvites = 0 var roomsInvite = 0 if (autoAcceptInvites.showInvites()) { diff --git a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt index 074149a255..fca106d3a5 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt @@ -22,7 +22,7 @@ import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyAction @@ -58,7 +58,7 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor( @Assisted initialState: UnreadMessagesState, session: Session, private val vectorPreferences: VectorPreferences, - appStateHandler: AppStateHandler, + spaceStateHandler: SpaceStateHandler, private val autoAcceptInvites: AutoAcceptInvites ) : VectorViewModel(initialState) { @@ -109,8 +109,8 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor( } combine( - appStateHandler.getSelectedSpaceFlow().distinctUntilChanged(), - appStateHandler.getSelectedSpaceFlow().flatMapLatest { + spaceStateHandler.getSelectedSpaceFlow().distinctUntilChanged(), + spaceStateHandler.getSelectedSpaceFlow().flatMapLatest { roomService.getPagedRoomSummariesLive( roomSummaryQueryParams { this.memberships = Membership.activeMemberships() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index e305ccbec1..d562609e42 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -28,7 +28,7 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.R import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory @@ -136,7 +136,7 @@ class TimelineViewModel @AssistedInject constructor( private val locationSharingServiceConnection: LocationSharingServiceConnection, private val stopLiveLocationShareUseCase: StopLiveLocationShareUseCase, timelineFactory: TimelineFactory, - appStateHandler: AppStateHandler, + spaceStateHandler: SpaceStateHandler, ) : VectorViewModel(initialState), Timeline.Listener, ChatEffectManager.Delegate, CallProtocolsChecker.Listener, LocationSharingServiceConnection.Callback { @@ -218,16 +218,16 @@ class TimelineViewModel @AssistedInject constructor( if (initialState.switchToParentSpace) { // We are coming from a notification, try to switch to the most relevant space // so that when hitting back the room will appear in the list - appStateHandler.getCurrentSpace().let { currentSpace -> + spaceStateHandler.getCurrentSpace().let { currentSpace -> val currentRoomSummary = room.roomSummary() ?: return@let // nothing we are good if ((currentSpace == null && !vectorPreferences.prefSpacesShowAllRoomInHome()) || (currentSpace != null && !currentRoomSummary.flattenParentIds.contains(currentSpace.roomId))) { // take first one or switch to home - appStateHandler.setCurrentSpace( + spaceStateHandler.setCurrentSpace( currentRoomSummary .flattenParentIds.firstOrNull { it.isNotBlank() }, - // force persist, because if not on resume the AppStateHandler will resume + // force persist, because if not on resume the SpaceStateHandler will resume // the current space from what was persisted on enter background persistNow = true ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt index d91f8f6e5d..2408d157f3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt @@ -23,7 +23,7 @@ import androidx.lifecycle.asFlow import androidx.lifecycle.liveData import androidx.paging.PagedList import com.airbnb.mvrx.Async -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.RoomListDisplayMode @@ -58,7 +58,7 @@ import timber.log.Timber class RoomListSectionBuilder( private val session: Session, private val stringProvider: StringProvider, - private val appStateHandler: AppStateHandler, + private val spaceStateHandler: SpaceStateHandler, private val viewModelScope: CoroutineScope, private val autoAcceptInvites: AutoAcceptInvites, private val onUpdatable: (UpdatableLivePageResult) -> Unit, @@ -94,7 +94,7 @@ class RoomListSectionBuilder( } } - appStateHandler.getSelectedSpaceFlow() + spaceStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .onEach { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() @@ -186,7 +186,7 @@ class RoomListSectionBuilder( // add suggested rooms val suggestedRoomsFlow = // MutableLiveData>() - appStateHandler.getSelectedSpaceFlow() + spaceStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .flatMapLatest { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() @@ -359,7 +359,7 @@ class RoomListSectionBuilder( query: (RoomSummaryQueryParams.Builder) -> Unit ) { withQueryParams(query) { roomQueryParams -> - val updatedQueryParams = roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()) + val updatedQueryParams = roomQueryParams.process(spaceFilterStrategy, spaceStateHandler.getSafeActiveSpaceId()) val liveQueryParams = MutableStateFlow(updatedQueryParams) val itemCountFlow = liveQueryParams .flatMapLatest { @@ -370,7 +370,7 @@ class RoomListSectionBuilder( val name = stringProvider.getString(nameRes) val filteredPagedRoomSummariesLive = session.roomService().getFilteredPagedRoomSummariesLive( - roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()), + roomQueryParams.process(spaceFilterStrategy, spaceStateHandler.getSafeActiveSpaceId()), pagedListConfig ) when (spaceFilterStrategy) { @@ -417,7 +417,7 @@ class RoomListSectionBuilder( RoomAggregateNotificationCount(it.size, it.size) } else { session.roomService().getNotificationCountForRooms( - roomQueryParams.process(spaceFilterStrategy, appStateHandler.getSafeActiveSpaceId()) + roomQueryParams.process(spaceFilterStrategy, spaceStateHandler.getSafeActiveSpaceId()) ) } ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index e51bdc5841..4b76daf502 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -25,7 +25,7 @@ import com.airbnb.mvrx.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -60,7 +60,7 @@ class RoomListViewModel @AssistedInject constructor( @Assisted initialState: RoomListViewState, private val session: Session, stringProvider: StringProvider, - appStateHandler: AppStateHandler, + spaceStateHandler: SpaceStateHandler, vectorPreferences: VectorPreferences, autoAcceptInvites: AutoAcceptInvites, private val analyticsTracker: AnalyticsTracker @@ -100,7 +100,7 @@ class RoomListViewModel @AssistedInject constructor( observeMembershipChanges() observeLocalRooms() - appStateHandler.getSelectedSpaceFlow() + spaceStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .execute { copy( @@ -148,7 +148,7 @@ class RoomListViewModel @AssistedInject constructor( private val roomListSectionBuilder = RoomListSectionBuilder( session, stringProvider, - appStateHandler, + spaceStateHandler, viewModelScope, autoAcceptInvites, { diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index 291eee307f..f851c75290 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -31,7 +31,7 @@ import androidx.core.app.TaskStackBuilder import androidx.core.util.Pair import androidx.core.view.ViewCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.error.fatalError @@ -120,7 +120,7 @@ class DefaultNavigator @Inject constructor( private val sessionHolder: ActiveSessionHolder, private val vectorPreferences: VectorPreferences, private val widgetArgsBuilder: WidgetArgsBuilder, - private val appStateHandler: AppStateHandler, + private val spaceStateHandler: SpaceStateHandler, private val supportedVerificationMethodsProvider: SupportedVerificationMethodsProvider, private val features: VectorFeatures, private val analyticsTracker: AnalyticsTracker @@ -167,7 +167,7 @@ class DefaultNavigator @Inject constructor( analyticsTracker.capture( sessionHolder.getActiveSession().getRoomSummary(roomId).toAnalyticsViewRoom( trigger = trigger, - selectedSpace = appStateHandler.getCurrentSpace() + selectedSpace = spaceStateHandler.getCurrentSpace() ) ) } @@ -182,7 +182,7 @@ class DefaultNavigator @Inject constructor( fatalError("Trying to open an unknown space $spaceId", vectorPreferences.failFast()) return } - appStateHandler.setCurrentSpace(spaceId) + spaceStateHandler.setCurrentSpace(spaceId) when (postSwitchSpaceAction) { Navigator.PostSwitchSpaceAction.None -> { // go back to home if we are showing room details? @@ -318,7 +318,7 @@ class DefaultNavigator @Inject constructor( } override fun openRoomDirectory(context: Context, initialFilter: String) { - when (val currentSpace = appStateHandler.getCurrentSpace()) { + when (val currentSpace = spaceStateHandler.getCurrentSpace()) { null -> RoomDirectoryActivity.getIntent(context, initialFilter) else -> SpaceExploreActivity.newIntent(context, currentSpace.roomId) }.start(context) @@ -330,14 +330,14 @@ class DefaultNavigator @Inject constructor( } override fun openCreateDirectRoom(context: Context) { - when (val currentSpace = appStateHandler.getCurrentSpace()) { + when (val currentSpace = spaceStateHandler.getCurrentSpace()) { null -> CreateDirectRoomActivity.getIntent(context) else -> SpacePeopleActivity.newIntent(context, currentSpace.roomId) }.start(context) } override fun openInviteUsersToRoom(context: Context, roomId: String) { - when (val currentSpace = appStateHandler.getCurrentSpace()) { + when (val currentSpace = spaceStateHandler.getCurrentSpace()) { null -> InviteUsersToRoomActivity.getIntent(context, roomId).start(context) else -> showInviteToDialog(context, currentSpace, roomId) } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index 121007cf2a..2616d808f2 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -25,7 +25,7 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -58,7 +58,7 @@ class CreateRoomViewModel @AssistedInject constructor( @Assisted private val initialState: CreateRoomViewState, private val session: Session, private val rawService: RawService, - appStateHandler: AppStateHandler, + spaceStateHandler: SpaceStateHandler, private val analyticsTracker: AnalyticsTracker ) : VectorViewModel(initialState) { @@ -73,7 +73,7 @@ class CreateRoomViewModel @AssistedInject constructor( initHomeServerName() initAdminE2eByDefault() - val parentSpaceId = initialState.parentSpaceId ?: appStateHandler.getSafeActiveSpaceId() + val parentSpaceId = initialState.parentSpaceId ?: spaceStateHandler.getSafeActiveSpaceId() val restrictedSupport = session.homeServerCapabilitiesService().getHomeServerCapabilities() .isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index a72c6cc0c2..e1b845e549 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -23,7 +23,7 @@ import com.airbnb.mvrx.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -61,7 +61,7 @@ import org.matrix.android.sdk.flow.flow class SpaceListViewModel @AssistedInject constructor( @Assisted initialState: SpaceListViewState, - private val appStateHandler: AppStateHandler, + private val spaceStateHandler: SpaceStateHandler, private val session: Session, private val vectorPreferences: VectorPreferences, private val autoAcceptInvites: AutoAcceptInvites, @@ -85,7 +85,7 @@ class SpaceListViewModel @AssistedInject constructor( } observeSpaceSummaries() - appStateHandler.getSelectedSpaceFlow() + spaceStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .setOnEach { selectedSpaceOption -> copy( @@ -217,7 +217,7 @@ class SpaceListViewModel @AssistedInject constructor( if (state.selectedSpace?.roomId != action.spaceSummary?.roomId) { analyticsTracker.capture(Interaction(null, null, Interaction.Name.SpacePanelSwitchSpace)) setState { copy(selectedSpace = action.spaceSummary) } - appStateHandler.setCurrentSpace(action.spaceSummary?.roomId) + spaceStateHandler.setCurrentSpace(action.spaceSummary?.roomId) _viewEvents.post(SpaceListViewEvents.CloseDrawer) } else { analyticsTracker.capture(Interaction(null, null, Interaction.Name.SpacePanelSelectedSpace)) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt index e50fa5540c..6b1f9f88d5 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceMenuViewModel.kt @@ -24,7 +24,7 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyViewEvents @@ -50,7 +50,7 @@ import timber.log.Timber class SpaceMenuViewModel @AssistedInject constructor( @Assisted val initialState: SpaceMenuState, val session: Session, - val appStateHandler: AppStateHandler + val spaceStateHandler: SpaceStateHandler ) : VectorViewModel(initialState) { @AssistedFactory @@ -73,9 +73,9 @@ class SpaceMenuViewModel @AssistedInject constructor( it.getOrNull()?.let { if (it.membership == Membership.LEAVE) { setState { copy(leavingState = Success(Unit)) } - if (appStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { + if (spaceStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { // switch to home? - appStateHandler.setCurrentSpace(null, session) + spaceStateHandler.setCurrentSpace(null, session) } } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt index 4b6657fc47..800447d4c5 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt @@ -24,7 +24,7 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.AppStateHandler +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyViewEvents @@ -53,7 +53,7 @@ import timber.log.Timber class SpaceLeaveAdvancedViewModel @AssistedInject constructor( @Assisted val initialState: SpaceLeaveAdvanceViewState, private val session: Session, - private val appStateHandler: AppStateHandler + private val spaceStateHandler: SpaceStateHandler ) : VectorViewModel(initialState) { init { @@ -82,9 +82,9 @@ class SpaceLeaveAdvancedViewModel @AssistedInject constructor( ?.onEach { if (it.membership == Membership.LEAVE) { setState { copy(leaveState = Success(Unit)) } - if (appStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { + if (spaceStateHandler.getSafeActiveSpaceId() == initialState.spaceId) { // switch to home? - appStateHandler.setCurrentSpace(null, session) + spaceStateHandler.setCurrentSpace(null, session) } } }?.launchIn(viewModelScope) diff --git a/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt similarity index 73% rename from vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt rename to vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt index 6f0c33f998..8c94d5912b 100644 --- a/vector/src/test/java/im/vector/app/AppStateHandlerImplTest.kt +++ b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt @@ -32,7 +32,7 @@ import org.junit.Before import org.junit.Test import org.matrix.android.sdk.api.session.room.model.RoomSummary -internal class AppStateHandlerImplTest { +internal class SpaceStateHandlerImplTest { private val spaceId = "spaceId" private val spaceSummary: RoomSummary = mockk() @@ -43,7 +43,7 @@ internal class AppStateHandlerImplTest { private val activeSessionHolder = FakeActiveSessionHolder(session) private val analyticsTracker = FakeAnalyticsTracker() - private val appStateHandler = AppStateHandlerImpl( + private val spaceStateHandler = SpaceStateHandlerImpl( sessionDataSource.instance, uiStateRepository, activeSessionHolder.instance, @@ -58,39 +58,39 @@ internal class AppStateHandlerImplTest { @Test fun `given selected space doesn't exist, when getCurrentSpace, then return null`() { - val currentSpace = appStateHandler.getCurrentSpace() + val currentSpace = spaceStateHandler.getCurrentSpace() currentSpace shouldBe null } @Test fun `given selected space exists, when getCurrentSpace, then return selected space`() { - appStateHandler.setCurrentSpace(spaceId, session) + spaceStateHandler.setCurrentSpace(spaceId, session) - val currentSpace = appStateHandler.getCurrentSpace() + val currentSpace = spaceStateHandler.getCurrentSpace() currentSpace shouldBe spaceSummary } @Test fun `given persistNow is true, when setCurrentSpace, then immediately persist to ui state`() { - appStateHandler.setCurrentSpace(spaceId, session, persistNow = true) + spaceStateHandler.setCurrentSpace(spaceId, session, persistNow = true) uiStateRepository.verifyStoreSelectedSpace(spaceId, session) } @Test fun `given persistNow is false, when setCurrentSpace, then don't immediately persist to ui state`() { - appStateHandler.setCurrentSpace(spaceId, session, persistNow = false) + spaceStateHandler.setCurrentSpace(spaceId, session, persistNow = false) uiStateRepository.verifyStoreSelectedSpace(spaceId, session, inverse = true) } @Test fun `given is forward navigation and no current space, when setCurrentSpace, then null added to backstack`() { - appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) + spaceStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) - val backstack = appStateHandler.getSpaceBackstack() + val backstack = spaceStateHandler.getSpaceBackstack() backstack.size shouldBe 1 backstack.first() shouldBe null @@ -98,10 +98,10 @@ internal class AppStateHandlerImplTest { @Test fun `given is forward navigation and is in space, when setCurrentSpace, then previous space added to backstack`() { - appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) - appStateHandler.setCurrentSpace("secondSpaceId", session, isForwardNavigation = true) + spaceStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = true) + spaceStateHandler.setCurrentSpace("secondSpaceId", session, isForwardNavigation = true) - val backstack = appStateHandler.getSpaceBackstack() + val backstack = spaceStateHandler.getSpaceBackstack() backstack.size shouldBe 2 backstack shouldBeEqualTo listOf(null, spaceId) @@ -109,34 +109,34 @@ internal class AppStateHandlerImplTest { @Test fun `given is not forward navigation, when setCurrentSpace, then previous space not added to backstack`() { - appStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = false) + spaceStateHandler.setCurrentSpace(spaceId, session, isForwardNavigation = false) - val backstack = appStateHandler.getSpaceBackstack() + val backstack = spaceStateHandler.getSpaceBackstack() backstack.size shouldBe 0 } @Test fun `when setCurrentSpace, then space is emitted to selectedSpaceFlow`() = runTest { - appStateHandler.setCurrentSpace(spaceId, session) + spaceStateHandler.setCurrentSpace(spaceId, session) - val currentSpace = appStateHandler.getSelectedSpaceFlow().first().orNull() + val currentSpace = spaceStateHandler.getSelectedSpaceFlow().first().orNull() currentSpace shouldBeEqualTo spaceSummary } @Test fun `given current space exists, when getSafeActiveSpaceId, then return current space id`() { - appStateHandler.setCurrentSpace(spaceId, session) + spaceStateHandler.setCurrentSpace(spaceId, session) - val activeSpaceId = appStateHandler.getSafeActiveSpaceId() + val activeSpaceId = spaceStateHandler.getSafeActiveSpaceId() activeSpaceId shouldBeEqualTo spaceId } @Test fun `given current space doesn't exist, when getSafeActiveSpaceId, then return current null`() { - val activeSpaceId = appStateHandler.getSafeActiveSpaceId() + val activeSpaceId = spaceStateHandler.getSafeActiveSpaceId() activeSpaceId shouldBe null } From 1d77f991484bf5f912497aada0d20963f0aaed2d Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 10:37:33 +0200 Subject: [PATCH 015/190] Adds RoomSummaryFixture --- .../vector/app/SpaceStateHandlerImplTest.kt | 7 ++--- .../app/test/fixtures/RoomSummaryFixture.kt | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 vector/src/test/java/im/vector/app/test/fixtures/RoomSummaryFixture.kt diff --git a/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt index 8c94d5912b..f47f5ea9bf 100644 --- a/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt +++ b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt @@ -21,21 +21,19 @@ import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeAnalyticsTracker import im.vector.app.test.fakes.FakeSession import im.vector.app.test.fakes.FakeUiStateRepository -import io.mockk.every +import im.vector.app.test.fixtures.RoomSummaryFixture.aRoomSummary import io.mockk.justRun -import io.mockk.mockk import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBe import org.amshove.kluent.shouldBeEqualTo import org.junit.Before import org.junit.Test -import org.matrix.android.sdk.api.session.room.model.RoomSummary internal class SpaceStateHandlerImplTest { private val spaceId = "spaceId" - private val spaceSummary: RoomSummary = mockk() + private val spaceSummary = aRoomSummary(spaceId) private val session = FakeSession.withRoomSummary(spaceSummary) private val sessionDataSource = FakeActiveSessionDataSource() @@ -53,7 +51,6 @@ internal class SpaceStateHandlerImplTest { @Before fun setup() { justRun { uiStateRepository.storeSelectedSpace(any(), any()) } - every { spaceSummary.roomId } returns spaceId } @Test diff --git a/vector/src/test/java/im/vector/app/test/fixtures/RoomSummaryFixture.kt b/vector/src/test/java/im/vector/app/test/fixtures/RoomSummaryFixture.kt new file mode 100644 index 0000000000..ee37dac618 --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fixtures/RoomSummaryFixture.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.test.fixtures + +import org.matrix.android.sdk.api.session.room.model.RoomSummary + +object RoomSummaryFixture { + + fun aRoomSummary(roomId: String) = RoomSummary( + roomId, + isEncrypted = false, + encryptionEventTs = 0, + typingUsers = emptyList(), + ) +} From d8fdaf0477ad4294215779080044f591ee514c5d Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 10:38:31 +0200 Subject: [PATCH 016/190] Moves UiStateRepository stubbing to fake class --- .../test/java/im/vector/app/SpaceStateHandlerImplTest.kt | 7 ------- .../java/im/vector/app/test/fakes/FakeUiStateRepository.kt | 5 +++++ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt index f47f5ea9bf..36d372cfac 100644 --- a/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt +++ b/vector/src/test/java/im/vector/app/SpaceStateHandlerImplTest.kt @@ -22,12 +22,10 @@ import im.vector.app.test.fakes.FakeAnalyticsTracker import im.vector.app.test.fakes.FakeSession import im.vector.app.test.fakes.FakeUiStateRepository import im.vector.app.test.fixtures.RoomSummaryFixture.aRoomSummary -import io.mockk.justRun import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBe import org.amshove.kluent.shouldBeEqualTo -import org.junit.Before import org.junit.Test internal class SpaceStateHandlerImplTest { @@ -48,11 +46,6 @@ internal class SpaceStateHandlerImplTest { analyticsTracker, ) - @Before - fun setup() { - justRun { uiStateRepository.storeSelectedSpace(any(), any()) } - } - @Test fun `given selected space doesn't exist, when getCurrentSpace, then return null`() { val currentSpace = spaceStateHandler.getCurrentSpace() diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt index 3b38e4512c..4e8af9042c 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeUiStateRepository.kt @@ -17,12 +17,17 @@ package im.vector.app.test.fakes import im.vector.app.features.ui.UiStateRepository +import io.mockk.justRun import io.mockk.mockk import io.mockk.verify import org.matrix.android.sdk.api.session.Session class FakeUiStateRepository : UiStateRepository by mockk() { + init { + justRun { storeSelectedSpace(any(), any()) } + } + fun verifyStoreSelectedSpace(roomId: String, session: Session, inverse: Boolean = false) { verify(inverse = inverse) { storeSelectedSpace(roomId, session.sessionId) } } From 8b220de9521b348977cdc2e88649d15a434da069 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 10:50:21 +0200 Subject: [PATCH 017/190] Adds changelog file --- changelog.d/6598.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6598.misc diff --git a/changelog.d/6598.misc b/changelog.d/6598.misc new file mode 100644 index 0000000000..db65a30bdc --- /dev/null +++ b/changelog.d/6598.misc @@ -0,0 +1 @@ +Refactors SpaceStateHandler (previously AppStateHandler) and adds unit tests for it From d8668f70bc599eb2500ac01a4fce9a21f7fcbe9e Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Thu, 21 Jul 2022 11:34:49 +0200 Subject: [PATCH 018/190] Rearranges imports --- vector/src/main/java/im/vector/app/core/di/SingletonModule.kt | 4 ++-- .../src/main/java/im/vector/app/features/home/HomeActivity.kt | 2 +- .../java/im/vector/app/features/home/HomeDetailFragment.kt | 2 +- .../vector/app/features/home/room/detail/TimelineViewModel.kt | 2 +- .../app/features/home/room/list/RoomListSectionBuilder.kt | 2 +- .../im/vector/app/features/navigation/DefaultNavigator.kt | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt index 5c70e9be53..c969df74e4 100644 --- a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt @@ -28,11 +28,11 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import im.vector.app.SpaceStateHandler -import im.vector.app.SpaceStateHandlerImpl import im.vector.app.BuildConfig import im.vector.app.EmojiCompatWrapper import im.vector.app.EmojiSpanify +import im.vector.app.SpaceStateHandler +import im.vector.app.SpaceStateHandlerImpl import im.vector.app.config.analyticsConfig import im.vector.app.core.dispatchers.CoroutineDispatchers import im.vector.app.core.error.DefaultErrorFormatter diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 63808ba9fd..6e77975d46 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -35,8 +35,8 @@ import com.airbnb.mvrx.Mavericks import com.airbnb.mvrx.viewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint -import im.vector.app.SpaceStateHandler import im.vector.app.R +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.extensions.hideKeyboard import im.vector.app.core.extensions.registerStartForActivityResult diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 54ff44d2c3..68e012f16e 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -28,8 +28,8 @@ import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.badge.BadgeDrawable -import im.vector.app.SpaceStateHandler import im.vector.app.R +import im.vector.app.SpaceStateHandler import im.vector.app.core.extensions.commitTransaction import im.vector.app.core.extensions.toMvRxBundle import im.vector.app.core.platform.OnBackPressed diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index 0d03d21ad3..2e313f04ae 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -28,8 +28,8 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.SpaceStateHandler import im.vector.app.R +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.mvrx.runCatchingToAsync diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt index 2408d157f3..8c422e60b4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilder.kt @@ -23,8 +23,8 @@ import androidx.lifecycle.asFlow import androidx.lifecycle.liveData import androidx.paging.PagedList import com.airbnb.mvrx.Async -import im.vector.app.SpaceStateHandler import im.vector.app.R +import im.vector.app.SpaceStateHandler import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.RoomListDisplayMode import im.vector.app.features.invite.AutoAcceptInvites diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index f851c75290..877aea4ba3 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -31,8 +31,8 @@ import androidx.core.app.TaskStackBuilder import androidx.core.util.Pair import androidx.core.view.ViewCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder -import im.vector.app.SpaceStateHandler import im.vector.app.R +import im.vector.app.SpaceStateHandler import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.error.fatalError import im.vector.app.features.VectorFeatures From 11c1ae768a6b96e1bacc8547853e8fecfa79d61e Mon Sep 17 00:00:00 2001 From: "Auri B. P" Date: Thu, 21 Jul 2022 14:40:43 +0000 Subject: [PATCH 019/190] Translated using Weblate (Catalan) Currently translated at 99.7% (2309 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/ --- vector/src/main/res/values-ca/strings.xml | 56 ++++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-ca/strings.xml b/vector/src/main/res/values-ca/strings.xml index 05d10b0f5f..0ba6d2f959 100644 --- a/vector/src/main/res/values-ca/strings.xml +++ b/vector/src/main/res/values-ca/strings.xml @@ -2210,18 +2210,18 @@ Obert a tothom, perfecte per a comunitats Es mostrarà quan enviïs missatges. Escull un àlies - El teu compte %s s\'ha creat. + El teu compte %s s\'ha creat Felicitats! Torna a l\'inici Personalitza el perfil Connectat al servidor Vols unir-te a un servidor existent\? - ometre aquesta pregunta - Encara no n\'estàs segur\? Pots %s + Omet aquesta pregunta + Encara no n\'estàs segur\? %s Comunitats Equips Família i amics - T\'ajudarem a connectar-te. + T\'ajudarem a connectar-te Amb qui parlaràs més sovint\? ${app_name} també és ideal per a la feina. Les organitzacions més segures del món hi confien. Estàs d\'acord amb enviar aquesta informació\? @@ -2243,10 +2243,10 @@ Els servidor no accepta noms d\'usuari amb només dígits. Omet aquest pas Desa i continua - Les teves preferències s\'han desat. + Ves a la configuració en qualsevol moment per actualitzar el teu perfil Tot a punt! Som-hi - Ho pots canviar en qualsevol moment. + És hora de posar cara al nom Ho podràs canviar després Afegeix foto de perfil Àlies @@ -2535,4 +2535,48 @@ Envia un primer missatge per convidar %s a parlar Els missatges d\'aquest xat seran xifrats d\'extrem a extrem. Crea + Confirma el teu correu electrònic, prem el botó del correu que t\'hem enviat a %s + Si us plau, llegeix les condicions i polítiques de %s + Contacta + Et podran trobar com a %s + Creació de compte + Torna a enviar el correu + No has rebut un correu\? + Segueix les instruccions que s\'han enviat a %s + Ets humà\? + Usuari / Correu / Telèfon + No es pot obrir l\'enllaç: les comunitats han estat substituïdes pels espais + No tens permís per compartir la ubicació en directe + Comprova el teu correu per verificar. + Torna a enviar el codi + S\'ha enviat un codi al %s + Confirma el teu número de telèfon + Tanca la sessió de tots els dispositius + Restableix la contrasenya + Assegura\'t que té 8 o més caràcters. + Tria una nova contrasenya + Nova contrasenya + Comprova el teu correu. + %s t\'enviarà un enllaç de verificació + Codi de confirmació + Número de telèfon + %s ha de verificar el teu compte + Introdueix el número de telèfon + Correu + %s ha de verificar el teu compte + Introdueix el correu electrònic + Polítiques del servidor + Vols allotjar el teu propi servidor\? + URL del servidor + Quina és l\'adreça del servidor\? Això és com la casa on es desaran totes les teves dades + Selecciona el servidor + Hola de nou! + Edita + O + On viuran les teves converses + Ha de tenir 8 caràcters o més + Usa la predeterminada del sistema + Tria manualment + Automàtica + Tria la mida de la lletra \ No newline at end of file From bb13e1e437d4e2c10704c61ca7183afe5ef183c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 21 Jul 2022 16:32:35 +0000 Subject: [PATCH 020/190] Translated using Weblate (Estonian) Currently translated at 99.6% (2307 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- vector/src/main/res/values-et/strings.xml | 67 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 80881f45c0..45d8a1f96e 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -2357,7 +2357,7 @@ Asukoht Krüptimise seadistustes on viga ja sa ei saa sõnumeid saata. Seadistuste avamiseks klõpsi siin. Krüptimise seadistustes on viga ja sa ei saa sõnumeid saata. Kui soovid krüptimist töökorda saada, siis võta ühendust serveri haldajaga. - Me aitame sind Matrix\'i võrgu kasutamisel. + Me aitame sind Matrix\'i võrgu kasutamisel Alusta koduserveri kasutamist Võta jutulõngad kasutusele Märkus: palun käivita rakendus uuesti @@ -2365,8 +2365,8 @@ Kaart Näita jutumulle Tahad kasutada mõnda olemasolevat koduserverit\? - jätta selle küsimuse vahele - Sa pole veel otsustanud\? Sa võid %s + Jäta see küsimus vahele + Sa pole veel otsustanud\? %s Töökaaslased Kogukonnad Perekond ja sõbrad @@ -2425,16 +2425,16 @@ Koduserver ei võimalda ainult numbritest koosneva kasutajanime loomist. Jäta see samm vahele Salvesta ja jätka - Sinu eelistused on salvestatud. - Kõik on valmis! + Seadistusest saad alati oma profiili muuta + Tundub õige! Alustame nüüd - Sa võid seda hiljem alati muuta. + On aeg lisada oma nime juurde sobilik pilt Lisa profiilipilt Sa võid seda hiljem muuta Kuvatav nimi Seda näidatakse sõnumite saatmisel. Vali kuvatav nimi - Sinu kasutajakonto %s on nüüd olemas. + Sinu kasutajakonto %s on nüüd olemas Õnnitlused! Mine avalehele Isikupärasta oma profiili @@ -2526,4 +2526,57 @@ Saada oma esimene sõnum kutsudes %s vestlusesse See vestlus saab olema läbivalt krüptitud. Mine + + %d sõnum on eemaldatud + %d sõnumit on eemaldatud + + Jaga asukohta + Selles jututoas asukoha jagamiseks peavad sul olema vastavad õigused. + Sul pole vajalikke õigusi asukoha jagamiseks reaalajas + Seda linki ei saa avada: seniste vanatüübiliste kogukondade asemel on nüüd uued kogukonnad ehk kogukonnakeskused + Kasutajanimi / E-post / Telefon + Kas sa ikka oled inimene\? + Palun järgi juhtnööre, mille saatsime %s aadressile + Salasõna lähtestamine + Kas unustasid oma salasõna + Saada e-kiri uuesti + Sa ei saanud e-kirja kätte\? + Oma e-posti aadressi kinnitamiseks klõpsi selles kirjas leiduvat nuppu, mille just saatsime %s aadressile + Kinnitamiseks vaata oma e-kirju. + Saada kinnituskood uuesti + Kinnituskoodi saatsime telefoninumbrile %s + Kinnita oma telefoninumber + Logi kõik oma seadmed võrgust välja + Lähtesta salasõna + Palun kasuta vähemalt 8-tähelist salasõna. + Vali uus salasõna + Uus salasõna + Vaata oma e-kirju. + %s saadab sulle verifitseerimiseks lingi + Kinnituskood + Telefoninumber + %s soovib sinu kasutajakonto verifitseerimist + Sisesta oma telefoninumber + E-posti aadress + %s soovib sinu kasutajakonto verifitseerimist + Sisesta oma e-posti aadress + Palun loe läbi %s serveri kasutustingimused ja reeglid + Serveri reeglid + Võta meiega ühedust + Element Matrix Services (EMS) on toimiv ja usaldusväärne serveriteenus kiireks ja turvaliseks suhtluseks. Lisateave element.io/ems + Kas soovid et sul oleks oma serveriteenus\? + Serveri url + Mis on sinu serveri aadress\? Mingis mõttes on see sinu andmete kodu + Vali oma koduserver + Tere tulemast tagasi! + Muuda + Või + Kuidas sinu vestlusi hallatakse + Peab olema 8 või enam tähemärki + Teised saavad sind otsida sellisena: %s + Loo endale konto + Kasuta süsteemi seadistust + Vali ise + Määra automaatselt + Vali kirjatüübi suurus \ No newline at end of file From cca907c636c44a5b1d6ea1aa9e994e43fe2b563c Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 20 Jul 2022 18:55:13 +0000 Subject: [PATCH 021/190] Translated using Weblate (Persian) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- vector/src/main/res/values-fa/strings.xml | 69 ++++++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index a8dbe72b74..26a006f498 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -1515,7 +1515,7 @@ توضیحات توضیح در مورد اتاق (اختیاری) نام اتاق - پیام پاک شد + پیام برداشته شد به نظر در تلاش برای وصل شدن به کارساز خانگی دیگری هستید. می‌خواهید خارج شوید؟ از هیچ کارساز هویتی استفاده نمی‌کنید خطای نامشخص @@ -2364,12 +2364,12 @@ به کار انداختن پیام‌های رشته‌ای وصل شدن به کارساز دنبال پیوستن به کارسازهای موجودید؟ - از این پرسش بگذرید - هنوز اطمینان ندارید؟ می‌توانید %s + پرش از این پرسش + هنوز اطمینان ندارید؟ %s اجتماع‌ها گروه‌ها دوستان و خانواده - کمکتان می‌کنیم وصل بمانید. + کمکتان می‌کنیم وصل بمانید بیش‌تر با چه‌کسی گپ می‌زنید؟ هم‌اکنون دارید این رشته را می‌بینید! دیدن در اتاق @@ -2425,16 +2425,16 @@ کارساز خانگی، نام‌های کاربری فقط رقمی را نمی‌پذیرد. پرش از این گام ذخیره و ادامه - ترجیحاتتان ذخیره شد. - همه‌چیز تنظیم شده! + برای به‌روز رسانی نمایه‌تان، هر زمانی به تنظیمات سر بزنید + خوب به نظر می‌رسد! بزن بریم - می‌توانید هرزمانی تغییرش دهید. + زمان گذاشتن صورتی روی نام است گزینش نامی نمایشی افزودن یک تصویر نمایه می‌توانید بعدها تغییرش دهید نام نمایشی هنگامی که پیام می‌فرستید نشان داده خواهد شد. - حسابتان %s ایجاد شد. + حسابتان %s ایجاد شد تبریک! مرا به خانه ببر شخصی سازی نمایه @@ -2535,4 +2535,57 @@ \n%1$s نقطهٔ پایانی با موفّقیت روی کارساز خانگی ثبت شد. ثبت نقطهٔ پایانی + + ۱ پیام برداشته شد + %d پیام برداشته شد + + هم‌رسانی مکان + برای هم‌رسانی مکان زنده در این اتاق باید اجازه‌های درست را داشته باشید. + اجازهٔ هم‌رسانی مکان زنده را ندارید + نتوانست این پیوند را بگشاید: فضاها جایگزین اجتماع‌ها شده‌اند + نام کاربری، رایانامه یا تلفن + انسانید؟ + دستورالعمل‌های فرستاده به %s را دنبال‌کنید + بازنشانی گذرواژه + فراموشی گذرواژه + فرستادن دوبارهٔ رایانامه + رایانامه‌ای نگرفتید؟ + برای تأیید رایانامه‌تان، روی دکمه در رایانامه‌ای‌که اکنون برایتان به %s فرستادیم بزنید + برای تأیید، رایانامه‌تان را بررسی کنید. + فرستادن دوبارهٔ رمز + رمزی به %s فرستاده خواهد شد + شمارهٔ تلفنتان را تأیید کنید + خروج از تمامی افزاره‌ها + تکرار گذرواژه + مطمئن شوید ۸ نویسه یا بیش‌تر است. + گذرواژه‌ای جدید برگزینید + گذرواژهٔ جدید + رایانامه‌تان را بررسی کنید. + %s برایتان پیوند تأییدی خواهد فرستاد + رمز تأیید + شمارهٔ تلفن + %s می‌خواهد حسابتان را تأیید کند + شمارهٔ تلفنتان را وارد کنید + رایانامه + %s می‌خواهد حسابتان را تأیید کند + رایانامه‌تان را وارد کنید + لطفاً شرایط و سیاست‌های %s را بخوانید + سیاست‌های کارساز + در ارتباط بمانید + خدمات ماتریکسی المنت (EMS) خدمتی مطمئن برای ارتباطات سریع، امن و زنده است. چگونگیش را در element.io/ems ببینید + می‌خواهید کارساز خود را میزبانی کنید؟ + نشانی کارساز + نشانی کارسازتان چیست؟ چونان خانه‌ای برای تمامی داده‌هایتان است + کارسازتان را برگزینید + خوش برگشتید! + ویرایش + یا + جایی که گفت‌وگوهایتان خواهند زیست + باید ۸ نویسه یا بیش‌تر باشد + دیگران می‌توانند بیابندتان %s + ایجاد حسابتان + استفاده از پیش‌گزیدهٔ سامانه + گزینش دستی + تنظیم خودکار + گزینش اندازهٔ قلم \ No newline at end of file From 1624c8c73ac43fdd2718332c76c05249de6ab7a3 Mon Sep 17 00:00:00 2001 From: Linerly Date: Thu, 21 Jul 2022 13:01:38 +0000 Subject: [PATCH 022/190] Translated using Weblate (Indonesian) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- vector/src/main/res/values-in/strings.xml | 88 ++++++++++++++++++----- 1 file changed, 70 insertions(+), 18 deletions(-) diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 11752f934f..cbe5173920 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -289,7 +289,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Singkapan Riwayat Ruangan Siapa yang dapat membaca riwayat\? - Siapapun + Siapa pun Hanya anggota (dimulai sejak opsi ini dipilih) Hanya anggota (dimulai sejak mereka diundang) Hanya anggota (dimulai sejak mereka bergabung) @@ -549,7 +549,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Aplikasi ini menerima push Gagal menerima push. Solusinya adalah untuk menginstal ulang aplikasi. Percobaan Push - Pastikan Anda mengklik tautan di email yang telah kami kirimkan kepada Anda. + Pastikan Anda mengeklik tautan di email yang telah kami kirimkan kepada Anda. Hapus %s\? Tidak ada nomor telepon yang ditambahkan ke akun Anda Saring pengguna yang dicekal @@ -570,7 +570,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Beritahu semuanya Menghapus pesan yang dikirim dari yang lain Ubah pengaturan - Role bawaan + Peran bawaan Anda tidak diizinkan untuk memperbarui peran yang diperlukan untuk mengubah berbagai bagian ruangan Pilih role yang diperlukan untuk mengubah berbagai bagian ruangan Izin @@ -1048,7 +1048,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Setujui Persyaratan Layanan server identitas (%s) agar Anda dapat ditemukan melalui email atau nomor telepon. Kami mengirimi Anda email konfirmasi ke %s, periksa email Anda dan klik tautan konfirmasi Setel ulang sandi di %1$s - Email ini tidak terkait dengan akun apapun. + Email ini tidak terkait dengan akun apa pun. Aplikasi tidak dapat membuat akun di homeserver ini. \n \nApakah Anda ingin mendaftar menggunakan client web\? @@ -1096,7 +1096,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda membuat ruangan publik untuk siapa pun yang mengetahui tautannya. %1$s membuat ruangan publik untuk siapa pun yang mengetahui tautannya. Tekan lama pada sebuah ruangan untuk melihat lebih banyak pilihan - Anda tidak mengabaikan pengguna apapun + Anda tidak mengabaikan pengguna apa pun Ketik keyword untuk mencari reaksi. Spoiler Mengirim pesan sebagai spoiler @@ -1180,7 +1180,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kode verifikasi salah. Kode Sebuah pesan teks telah dikirim ke %s. Silakan masukkan kode verifikasi yang ada di dalamnya. - Server identitas yang Anda pilih tidak memiliki persyaratan layanan apapun. Hanya lanjutkan jika Anda memercayai pemilik layanan + Server identitas yang Anda pilih tidak memiliki persyaratan layanan apa pun. Hanya lanjutkan jika Anda memercayai pemilik layanan Server identitas tidak memiliki persyaratan layanan Mohon masukkan URL server identitas Tidak dapat terhubung ke server identitas @@ -1256,7 +1256,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Balas Edit Sepertinya Anda mencoba menyambung ke homeserver lain. Apakah Anda ingin keluar\? - Anda tidak menggunakan server identitas apapun + Anda tidak menggunakan server identitas apa pun Kesalahan Tidak Diketahui %s ingin memverifikasi sesi Anda Permintaan Verifikasi @@ -1472,7 +1472,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ke laporan dibaca ${app_name} tidak mendukung peristiwa dengan tipe \'%1$s\' Pesan langsung - Bawaan di %1$s + Standar di %1$s Kustom (%1$d) di %2$s Admin di %1$s Moderator di %1$s @@ -1579,7 +1579,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Bersihkan data personal Kata sandi Masuk - Masuk untuk memulihkan kunci enkripsi yang disimpan khusus di perangkat ini. Anda memerlukannya untuk melihat semua pesan di perangkat apapun secara aman. + Masuk untuk memulihkan kunci enkripsi yang disimpan khusus di perangkat ini. Anda memerlukannya untuk melihat semua pesan di perangkat apa pun secara aman. Masuk Anda telah keluar Masuk lagi @@ -1651,7 +1651,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ketuk tautan untuk mengkonfirmasi kata sandi baru Anda. Setelah Anda mengikuti petunjuk yang ada di tautan, klik bawahnya. Email verifikasi terkirim ke %1$s. Cek kotak masuk Anda - Email ini tidak tertaut dengan akun apapun + Email ini tidak tertaut dengan akun apa pun Lanjut Mengubah kata sandi Anda akan mengatur ulang kunci enkripsi ujung-ke-ujung pada semua sesi Anda, yang akan membuat riwayat obrolan terenkripsi tidak dapat dibaca. Atur Cadangan Kunci atau ekspor kunci ruangan Anda dari sesi lain sebelum mengatur ulang kata sandi Anda. Peringatan! @@ -2265,7 +2265,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kebijakan ${app_name} Anda dapat mematikannya kapan saja di pengaturan Kami tidak membagikan informasi ini dengan pihak ketiga - Kami tidak merekam atau memprofil data akun apapun + Kami tidak merekam atau memprofil data akun apa pun di sini Bantu kami mengidentifikasi masalah-masalah dan membuat ${app_name} lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda. \n @@ -2314,7 +2314,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Lokasi Enkripsi telah dikonfigurasi dengan salah sehingga Anda tidak dapat mengirim pesan. Klik untuk membuka pengaturan. Enkripsi telah dikonfigurasi dengan salah sehingga Anda tidak dapat mengirim pesan. Mohon hubungi sebuah admin untuk memulihkan enkripsi ke status yang valid. - Belum yakin\? Anda dapat %s + Belum yakin\? %s Tampilkan gelembung pesan Gagal untuk memuat peta Peta @@ -2322,11 +2322,11 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Aktifkan Pesan Utasan Hubungkan ke server Ingin bergabung ke server yang sudah ada\? - melewati pertanyaan ini + Lewati pertanyaan ini Komunitas Tim Teman dan keluarga - Kami akan membantu Anda untuk terhubung. + Kami akan membantu Anda untuk terhubung Siapa saja yang sering Anda chat\? Anda sudah menampilkan utasan ini! Tampilkan Di Ruangan @@ -2380,16 +2380,16 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Homeserver tidak menerima nama pengguna dengan hanya angka. Lewati Simpan dan lanjutkan - Preferensi Anda telah disimpan. - Anda siap! + Pergi ke pengaturan kapan saja untuk memperbarui profil Anda + Kelihatan bagus! Ayo - Anda dapat mengubahnya kapan saja. + Saatnya pasang wajah pada nama Tambahkan sebuah foto profil Anda dapat mengubahnya nanti Nama Tampilan Ini akan ditampilkan ketika Anda mengirim pesan. Pilih nama tampilan - Akun %s Anda telah dibuat. + Akun %s Anda telah dibuat Selamat! Kembalikan saya ke beranda Ubah profil @@ -2489,4 +2489,56 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kirim pesan pertama Anda untuk mengundang %s ke obrolan Pesan di obrolan ini akan dienkripsi secara ujung-ke-ujung. Mulai + Ikuti petunjuk yang terkirim ke %s + Untuk mengonfirmasi email Anda, ketuk tombol dalam email yang kami kirim ke %s + + %d pesan dihapus + + Bagikan lokasi + Anda harus mempunyai izin yang diperlukan untuk membagikan lokasi di ruangan ini. + Anda tidak memiliki izin untuk membagikan lokasi + Tidak dapat membuka tautan ini: komunitas telah digantikan dengan space + Nama Pengguna / Email / Telepon + Apakah Anda seorang manusia\? + Atur ulang kata sandi + Lupa kata sandi + Kirim ulang email + Belum menerima email\? + Periksa email Anda untuk memverifikasi. + Kirim ulang kode + Sebuah kode terkirim ke %s + Konfirmasi nomor telepon Anda + Keluarkan semua perangkat + Atur ulang kata sandi + Pastikan itu 8 karakter atau lebih. + Pilih kata sandi baru + Kata Sandi Baru + Periksa email Anda. + %s akan mengirim Anda sebuah tautan verifikasi + Kode konfirmasi + Nomor Telepon + %s harus memverifikasi akun Anda + Masukkan nomor telepon Anda + Email + %s harus memverifikasi akun Anda + Masukkan email Anda + Mohon baca ketentuan dan kebijakan %s + Kebijakan server + Hubungi kami + Element Matrix Services (EMS) adalah layanan kokoh dan dapat diandalkan untuk komunikasi waktu nyata aman dan cepat. Pelajari lebih lanjut di element.io/ems + Ingin menghost server Anda sendiri\? + URL Server + Apa alamat server Anda\? Ini seperti rumah untuk semua data Anda + Pilih server Anda + Selamat datang kembali! + Edit + Atau + Di mana percakapan Anda akan tinggal + Harus 8 karakter atau lebih + Orang lain dapat menemukan Anda %s + Buat akun Anda + Gunakan bawaan sistem + Pilih secara manual + Atur secara otomatis + Pilih ukuran font \ No newline at end of file From 08a5d7ecead8d9ae5b5f2916a78ab95d3e588d4d Mon Sep 17 00:00:00 2001 From: random Date: Thu, 21 Jul 2022 08:16:22 +0000 Subject: [PATCH 023/190] Translated using Weblate (Italian) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- vector/src/main/res/values-it/strings.xml | 69 ++++++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 140b63e4c8..6dbdffd27e 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -1450,7 +1450,7 @@ Inviti spediti a %1$s e ad altri %2$d Impossibile invitare gli utenti. Controlla gli utenti che vuoi invitare e riprova. - Messaggio eliminato + Messaggio rimosso Mostra messaggi rimossi Mostra un segnaposto per i messaggi rimossi Ti abbiamo inviato un\'email di conferma a %s, controlla la tua posta e clicca il link di conferma @@ -2355,12 +2355,12 @@ Attiva messaggi in conversazioni Connetti al server Vuoi unirti ad un server esistente\? - saltare questa domanda - Ancora non lo sai\? Puoi %s + Salta questa domanda + Ancora non lo sai\? %s Comunità Squadre Amici e famiglia - Vi aiuteremo a connettervi. + Vi aiuteremo a connettervi Con chi parlerai di più\? Stai già visualizzando questa conversazione! Vedi nella stanza @@ -2417,16 +2417,16 @@ L\'homeserver non accetta nomi utente con solo numeri. Salta questo passo Salva e continua - Le tue preferenze sono state salvate. - Tutto pronto! + Vai nelle impostazioni quando vuoi per aggiornare il tuo profilo + Stai bene! Andiamo - Puoi cambiarla in qualsiasi momento. + È ora di dare una faccia al nome Aggiungi un\'immagine del profilo Puoi cambiarlo in seguito Nome da mostrare Verrà mostrato quando invii messaggi. Scegli un nome da mostrare - Il tuo account %s è stato creato. + Il tuo account %s è stato creato Congratulazioni! Personalizza profilo Disattiva @@ -2526,4 +2526,57 @@ Invia il primo messaggio per invitare %s a parlare I messaggi in questa conversazione saranno cifrati end-to-end. Vai + + %d messaggio rimosso + %d messaggi rimossi + + Condividi posizione + Devi avere le giuste autorizzazioni per potere condividere la posizione in tempo reale in questa stanza. + Non hai l\'autorizzazione di condividere la posizione in tempo reale + Impossibile aprire questo link: le comunità sono state sostituite dagli spazi + Nome utente / Email / Telefono + Sei un umano\? + Segui le istruzioni inviate a %s + Password reimpostata + Password dimenticata + Reinvia email + Non hai ricevuto un\'email\? + Per confermare l\'email, tocca il pulsante nell\'email che abbiamo appena inviato a %s + Controlla l\'email per verificare. + Reinvia codice + È stato inviato un codice a %s + Conferma il tuo numero di telefono + Disconnetti tutti i dispositivi + Reimposta la password + Assicurati che sia almeno di 8 caratteri. + Scegli una nuova password + Nuova password + Controlla la tua email. + %s ti invierà un link di verifica + Codice di conferma + Numero di telefono + %s deve verificare il tuo account + Inserisci il tuo numero di telefono + Email + %s deve verificare il tuo account + Inserisci la tua email + Leggi i termini e le condizioni di %s + Politiche del server + Mettiti in contatto + Element Matrix Services (EMS) è un servizio di hosting robusto e affidabile per comunicazioni veloci, sicure e in tempo reale. Scopri come su element.io/ems + Vuoi ospitare un tuo server\? + URL server + Qual è l\'indirizzo del tuo server\? È come una casa per tutti i tuoi dati + Seleziona il tuo server + Bentornato/a! + Modifica + O + Dove vivranno le tue conversazioni + Deve essere di almeno 8 caratteri + Gli altri ti possono trovare come %s + Crea il tuo account + Usa la predefinita di sistema + Scegli manualmente + Imposta automaticamente + Scegli dimensione caratteri \ No newline at end of file From d79e44d59f4056ae59f2d2a9362d0176e106b716 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 20 Jul 2022 19:52:21 +0000 Subject: [PATCH 024/190] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- vector/src/main/res/values-pt-rBR/strings.xml | 179 ++++++++++++------ 1 file changed, 119 insertions(+), 60 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index 00651ada32..8e1f95c37a 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -3,32 +3,32 @@ convite de %s %1$s convidou %2$s %1$s convidou você - %1$s entrou na sala + %1$s juntou-se à sala %1$s saiu da sala - %1$s recusou o convite - %1$s expulsou %2$s + %1$s rejeitou o convite + %1$s removeu %2$s %1$s desbaniu %2$s %1$s baniu %2$s - %1$s desfez o convite de %2$s - %1$s mudou seu avatar - %1$s definiu seu nome de exibição para %2$s - %1$s mudou seu nome de exibição de %2$s para %3$s - %1$s removeu seu nome de exibição (era %2$s) + %1$s retirou o convite de %2$s + %1$s mudou o avatar dela(e) + %1$s definiu o nome de exibição dela(e) para %2$s + %1$s mudou o nome de exibição dela(e) de %2$s para %3$s + %1$s removeu o nome de exibição dela(e) (era %2$s) %1$s mudou o tópico para: %2$s %1$s mudou o nome da sala para: %2$s %s começou uma chamada de vídeo. %s começou uma chamada de voz. %s atendeu a chamada. - %s encerrou a chamada. - %1$s deixou o histórico futuro da sala visível para %2$s - todos os membros da sala, desde quando foram convidadas/os. - todos os membros da sala, a partir de quando entraram. + %s terminou a chamada. + %1$s fez histórico futuro da sala visível para %2$s + todos os membros da sala, do ponto que foram convidados. + todos os membros da sala, do ponto que se juntaram. todos os membros da sala. qualquer pessoa. (avatar mudou também) %1$s removeu o nome da sala %1$s removeu o tópico da sala - %1$s enviou um convite para %2$s para entrar na sala + %1$s enviou um convite para %2$s para se juntar à sala %1$s aceitou o convite para %2$s ** Incapaz de decriptar: %s ** O dispositivo do/da enviador(a) não nos enviou as chaves para esta mensagem. @@ -43,13 +43,13 @@ %1$s criou a sala Você criou a sala Você convidou %1$s - Você entrou na sala + Você juntou-se à sala Você saiu da sala - Você recusou o convite - Você expulsou %1$s + Você rejeitou o convite + Você removeu %1$s Você desbaniu %1$s Você baniu %1$s - Você desfez o convite de %1$s + Você retirou o convite de %1$s Você mudou seu avatar Você definiu seu nome de exibição para %1$s Você mudou seu nome de exibição de %1$s para %2$s @@ -63,17 +63,17 @@ %s enviou dados para configurar a chamada. Você enviou dados para configurar a chamada. Você atendeu a chamada. - Você encerrou a chamada. - Você deixou o histórico futuro da sala visível para %1$s + Você terminou a chamada. + Você fez histórico futuro da sala visível para %1$s %s fez o upgrade desta sala. Você fez o upgrade desta sala. Você removeu o nome da sala Você removeu o tópico da sala %1$s removeu o avatar da sala Você removeu o avatar da sala - Você enviou um convite para %1$s para entrar na sala - %1$s revogou o convite para %2$s para entrar na sala - Você revogou o convite para %1$s para entrar na sala + Você enviou um convite para %1$s para se juntar à sala + %1$s revogou o convite para %2$s para se juntar à sala + Você revogou o convite para %1$s para se juntar à sala Você aceitou o convite para %1$s %1$s adicionou widget %2$s Você adicionou widget %1$s @@ -92,12 +92,12 @@ Sinc inicial: \nImportando conta… Sinc inicial: -\nImportando criptografia +\nImportando crypto Sinc inicial: -\nImportando Salas +\nImportando salas Sinc inicial: \nCarregando suas conversas -\nSe você entrou em muitas salas, isso pode demorar +\nSe você tem se juntado a muitas salas, isto podia levar um tempo Sinc inicial: \nImportando salas convidadas Sinc inicial: @@ -112,8 +112,8 @@ %1$s convidou %2$s. Razão: %3$s Você convidou %1$s. Razão: %2$s %1$s convidou você. Razão: %2$s - %1$s entrou na sala. Razão: %2$s - Você entrou na sala. Razão: %1$s + %1$s juntou-se à sala. Razão: %2$s + Você juntou-se à sala. Razão: %1$s %1$s saiu da sala. Razão: %2$s Você saiu da sala. Razão: %1$s %1$s rejeitou o convite. Razão: %2$s @@ -164,20 +164,20 @@ %1$s tem permitido visitantes se juntarem aqui. Você saiu. Razão: %1$s %1$s saiu. Razão: %2$s - Você entrou. Razão: %1$s - %1$s entrou. Razão: %2$s + Você juntou-se. Razão: %1$s + %1$s juntou-se. Razão: %2$s Você revogou o convite para %1$s %1$s revogou o convite para %2$s Você convidou %1$s %1$s convidou %2$s Você fez o upgrade aqui. %s fez o upgrade aqui. - Você deixou as mensagens futuras visíveis para %1$s - %1$s deixou as mensagens futuras visíveis para %2$s + Você fez mensagens futuras visíveis para %1$s + %1$s fez mensagens futuras visíveis para %2$s Você saiu da sala %1$s saiu da sala - Você entrou - %1$s entrou + Você juntou-se + %1$s juntou-se Você criou a discussão %1$s criou a discussão Sala vazia (era %s) @@ -411,7 +411,7 @@ Qualquer pessoa Membros somente (desde o ponto no tempo de seleção desta opção) Membros somente (desde que eles foram convidados) - Somente membros (desde que eles entraram) + Membros somente (desde que eles se juntaram) Usuárias(os) banidas(os) Avançadas ID interno desta sala @@ -981,7 +981,7 @@ Adicionar Reação Visualizar Reações Reações - Mensagem deletada + Mensagem removida Mostrar mensagens removidas Mostrar um placeholder para mensagens removidas Evento deletado por usuária(o) @@ -1012,7 +1012,7 @@ Regras de Push Nenhuma regra de push definida Nenhum gateway de push registrado - + app_id: push_key: app_display_name: session_name: @@ -1703,8 +1703,8 @@ Somente faça isto se você não tem nenhum outro dispositivo com o qual você pode verificar este dispositivo. Resettar tudo Esqueceu ou perdeu todas as opções de recuperação\? Resette tudo - Você entrou. - Mensagens nesta sala são encriptadas ponta-a-ponta. + Você juntou-se. + Mensagens neste chat são encriptadas ponta-a-ponta. Sair Configurações Mensagens aqui são encriptadas ponta-a-ponta. @@ -1727,7 +1727,7 @@ Resettar %1$s fez isto somente convite. Você fez isto somente convite. - %s entrou. + %s juntou-se. Filtrar usuárias(os) banidas(os) Testar Push @@ -1906,7 +1906,7 @@ Sinc inicial: \nFazendo download de dados… Sinc inicial: -\nEsperando pela resposta do servidor… +\nEsperando por resposta de servidor… Nível de confiança confiado Nível de confiança alerta Você tem certeza que você quer deletar todas as mensagens não-enviadas nesta sala\? @@ -1954,7 +1954,7 @@ Somente pessoas convidadas podem achar e se juntar Privada Configuração de acesso desconhecida (%s) - Qualquer pessoa pode tocar na sala, membros podem então aceitar ou rejeitar + Qualquer pessoa pode bater na porta na sala, membros podem então aceitar ou rejeitar Permitir visitantes se juntarem Usar como default e não perguntar de novo Sempre perguntar @@ -2014,8 +2014,8 @@ Adicionar salas Explorar salas - %d pessoa que você conhece já entrou - %d pessoas que você conhece já entraram + %d pessoa que você conhece já tem se juntado + %d pessoas que você conhece já têm se juntado Juntar-Se a Espaço Criar espaço @@ -2112,7 +2112,7 @@ Não dá para gravar uma mensagem de voz Não dá para tocar esta mensagem de voz Toque em sua gravação para parar ou escutar - %1$ds restantes + %1$ds restando Segure para gravar, solte para enviar Deletar gravação Gravando mensagem de voz @@ -2266,7 +2266,7 @@ Enviar emails e números de telefone para %s Seus contatos são privados. Para descobrir usuárias(os) de seus contatos, você precisa de permissão para enviar info de contato a seu servidor de identidade. O signout desta sessão tem sido feito! - Saiu da sala! + Esta sala tem sido saída! Você concorda em enviar esta info\? Para descobrir contatos existentes, você precisa enviar info de contato (emails e números de telefone) para seu servidor de identidade. Nós hashamos seus dados antes de enviar por privacidade. Não agora @@ -2317,7 +2317,7 @@ Habilitar Recomece o aplicativo para a mudançar tomar efeito. Habilitar matemática LaTeX - Você não tem permissão pra entrar nesta sala + Você não é permitida(o) se juntar a esta sala Criar sondagem Abrir contatos Enviar sticker @@ -2364,12 +2364,12 @@ Habilitar Mensagens de Thread Conectar a servidor Procurando se juntar a um servidor existente\? - pular esta pergunta - Não tem certeza ainda\? Você pode %s + Pular esta pergunta + Não tem certeza ainda\? %s Comunidades Times Amigas(os) e família - Nós vamos ajudá-la(o) a ficar conectada(o). + Nós vamos ajudá-la(o) a ficar conectada(o) Com quem você vai fazer chat mais\? Você já está visualizando esta thread! Visualizar Em Sala @@ -2425,16 +2425,16 @@ O servidorcasa não aceita nome de usuária(o) com somente dígitos. Pular este passo Salvar e continuar - Suas preferências têm sido salvas. - Você está pronta(o)! + Passe em configurações a qualquer momento para atualizar seu perfil + Tá com uma cara boa! Vamo lá - Você pode mudar isto a qualquer hora. + Hora de colocar um rosto ao nome Adicione uma imagem de perfil Você pode mudar isto mais tarde Nome de Exibição Isto vai ser mostrado quando você enviar mensagens. Escolha um nome de exibição - Sua conta %s tem sido criada. + Sua conta %s tem sido criada Parabéns! Me leve para casa Personalizar perfil @@ -2471,11 +2471,11 @@ ${app_name} Compartilhamento de Tela Parar compartilhamento de tela Compartilhar tela - - Alguns usuários foram designorados - ${app_name} precisa limpar o cache para estar atualizado, pelo seguinte motivo: + - Algumas(ns) usuárias(os) têm sido designoradas(os) + ${app_name} precisa performar uma limpa de cache para estar atualizado, pela seguinte razão: \n%s \n -\nNote que esta ação vai reiniciar o app e pode levar algum tempo. +\nNote que esta ação vai recomeçar o app e pode levar algum tempo. Requisição de sinc inicial Mostrar a info de perfil mais recente (avatar e nome de exibição) para todas as mensagens. Mostrar info de usuária(o) mais recente @@ -2485,7 +2485,7 @@ Parar de compartilhar Implementação tempoária: locais persistem em histórico de sala Habilitar Compartilhament de Localização Ao Vivo - %1$s restantes + %1$s restando Ao vivo até %1$s Ver localização ao vivo Localização ao vivo terminou @@ -2503,8 +2503,8 @@ Tag do perfil: Falhou ao registrar o token do endpoint ao servidorcasa: \n%1$s - - + Endpoint + Gateway Ativar compartilhamento de localização Compartilhamento de localização em tempo real Gateway atual: %s @@ -2529,4 +2529,63 @@ Endpoint registrado com sucesso ao servidor casa. Registro de Endpoint Próximo - + + %d mensagem removida + %d mensagens removidas + + Compartilhar localização + Você precisa ter as permissões certas a fim de compartilhar localização ao vivo nesta sala. + Você não tem permissão para compartilhar localização ao vivo + Resultados vão ser visíveis quando a sondagem estiver terminada + Quando convidando numa sala encriptada que está compartilhando histórico, histórico encriptada vai estar visível. + MSC3061: Compartilhando chaves de sala para mensagens passadas + Envie sua primeira mensagem para convidar %s a fazer chat + Mensagens neste chat vão ser encriptadas ponta-a-ponta. + Não dá para abrir este link: comunidades têm sido substituídas por espaços + Nome de Usuária(o) / Email / Telefone + Você é um/uma humano(a)\? + Siga as instruções enviadas para %s + Reset de senha + Esqueceu senha + Reenviar email + Não recebeu um email\? + Para confirmar seu email, toque no botão no email que nós acabamos de enviar para %s + Checar seu email para verificar. + Reenviar código + Um código foi enviado para %s + Confirmar seu número de telefone + Fazer signout de todos os dispositivos + Resettar senha + Garanta que seja 8 caracteres ou mais. + Escolher uma senha nova + Senha Nova + Checar seu email. + %s vai enviar para você um link de verificação + Código de confirmação + Número de Telefone + %s precisa verificar sua conta + Entrar seu número de telefone + Email + %s precisa verificar sua conta + Entrar seu email + Por favor leia todos os termos e políticas de %s + Políticas de servidor + Entrar em contato + Element Matrix Services (EMS) é um serviço de hospedagem robusto e confiável para comunicação rápida, segura e em tempo real. Descubra como em element.io/ems + Quer hospedar seu próprio servidor\? + URL de servidor + Qual é o endereço de seu servidor\? Isto é como uma casa para todos os seus dados + Selecionar seu servidor + Boas vindas de volta! + Editar + Ou + Onde suas conversas vão viver + Deve ser 8 caracteres ou mais + Outras(os) podem descobrir você %s + Criar sua conta + Ir + Usar default de sistema + Escolher manualmente + Definir automaticamente + Encolher tamanho de fonte + \ No newline at end of file From 60e1c7c573a855e304cb403b314a8708dbb69df7 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 20 Jul 2022 22:23:04 +0000 Subject: [PATCH 025/190] Translated using Weblate (Slovak) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 68 ++++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 9ddfa08aa4..f0cf54953e 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2269,12 +2269,12 @@ Zobraziť v miestnosti Toto vlákno si už prezeráte! S kým budete komunikovať najčastejšie\? - Pomôžeme vám pripojiť sa. + Pomôžeme vám pripojiť sa Priatelia a rodina Tímy Komunity - Ešte si nie ste istí\? Môžete %s - preskočiť túto otázku + Ešte si nie ste istí\? %s + Preskočiť túto otázku Pripojiť sa k serveru Povoliť správy vo vláknach Poznámka: aplikácia sa reštartuje @@ -2467,16 +2467,16 @@ \n \nPôjde o jednorazový prechod, keďže vlákna sú teraz súčasťou špecifikácie Matrix. Vlákna sa blížia k beta verzii 🎉 - Váš účet %s bol vytvorený. + Váš účet %s bol vytvorený Prebieha zdieľanie polohy ${app_name} Poloha v reálnom čase Domovský server neakceptuje používateľské meno obsahujúce iba číslice. Vynechať tento krok Uložiť a pokračovať - Vaše nastavenia boli uložené. - Všetko je pripravené! + Kedykoľvek prejdite do nastavení a aktualizujte svoj profil + Vyzerá to dobre! Poďme na to - Toto môžete kedykoľvek zmeniť. + Je čas priradiť k menu aj tvár Pridať profilový obrázok Neskôr to môžete zmeniť Zobrazované meno @@ -2583,4 +2583,58 @@ Odošlite svoju prvú správu a pozvite %s do konverzácie Správy v tejto miestnosti sú šifrované od vás až k príjemcovi. Spustiť + %s vám pošle overovací odkaz + + %d správa odstránená + %d správy odstránené + %d správ odstránených + + Zdieľať polohu + Musíte mať príslušné oprávnenia na zdieľanie polôh v reálnom čase v tejto miestnosti. + Nemáte oprávnenie na zdieľanie polohy v reálnom čase + Nie je možné otvoriť tento odkaz: komunity boli nahradené priestormi + Meno používateľa / Email / Telefón + Ste človek\? + Postupujte podľa pokynov zaslaných na adresu %s + Zmena hesla + Zabudnuté heslo + Opätovne odoslať e-mail + Nedostali ste e-mail\? + Ak chcete potvrdiť svoj e-mail, ťuknite na tlačidlo v e-maile, ktorý sme práve poslali na adresu %s + Pre overenie skontrolujte svoj e-mail. + Znovu odoslať kód + Kód bol odoslaný na %s + Potvrďte svoje telefónne číslo + Odhlásiť sa zo všetkých zariadení + Znovu nastaviť heslo + Uistite sa, že má 8 alebo viac znakov. + Vyberte si nové heslo + Nové heslo + Skontrolujte si e-mail. + Potvrdzovací kód + Telefónne číslo + %s potrebuje overiť vaše konto + Zadajte svoje telefónne číslo + Email + %s potrebuje overiť vaše konto + Zadajte svoj email + Prečítajte si prosím podmienky a zásady servera %s + Zásady používania servera + Kontaktujte nás + Element Matrix Services (EMS) je robustná a spoľahlivá hostingová služba na rýchlu, bezpečnú komunikáciu v reálnom čase. Zistite, ako na element.io/ems + Chcete hosťovať svoj vlastný server\? + URL adresa servera + Aká je adresa vášho servera\? Je to ako domov pre všetky vaše údaje + Vyberte svoj server + Vitajte späť! + Upraviť + alebo + Kde vaše rozhovory žijú + Musí obsahovať 8 alebo viac znakov + Ostatní vás môžu objaviť %s + Vytvorte si účet + Použiť predvolené nastavenie systému + Vybrať manuálne + Nastaviť automaticky + Vyberte veľkosť písma \ No newline at end of file From 6fc15ea1ab73483966a46450637a890624033c9c Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 20 Jul 2022 17:51:31 +0000 Subject: [PATCH 026/190] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 77 +++++++++++++++++++---- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index ed7a2c7438..45a057dd5f 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -564,7 +564,7 @@ Резервна копія ключа Використати резервну копію ключа Тут з\'явиться список бесід з вашими особистими повідомленнями. Торкніться + внизу праворуч щоб розпочати бесіду. - Повідомлення видалено + Повідомлення вилучено Особисті повідомлення Особисті повідомлення Надіслати нове особисте повідомлення @@ -2421,12 +2421,12 @@ Захищене спілкування. Ви контролюєте все. Володійте своїми розмовами. - Поділитися місцеперебуванням + Поділитися місцем перебування Відкрити за допомогою ${app_name} не може отримати доступ до вашого місцеперебування. Спробуйте пізніше. ${app_name} не може отримати доступ до вашого місцеперебування - Місцеперебування - Поділитися місцеперебуванням + Місце перебування + Поділитися місцем перебування Результати можна переглянути лише після завершення опитування Закрите опитування Усі, хто проголосує, побачать результати одразу після голосування @@ -2454,12 +2454,12 @@ Увімкнути гілки повідомлень Під\'єднатися до сервера Бажаєте приєднання до наявного сервера\? - пропустити це питання - Досі не впевнені\? Ви можете %s + Пропустити це запитання + Досі не впевнені\? %s Спільноти Команди Друзі й сім\'я - Ми допоможемо вам з\'єднатися. + Ми допоможемо вам з\'єднатися З ким ви спілкуватиметеся найчастіше\? Ви вже переглядаєте цю гілку! Переглянути у кімнаті @@ -2519,16 +2519,16 @@ Домашній сервер не приймає ім\'я користувача лише з цифр. Пропустити цей крок Зберегти й продовжити - Ваші налаштування збережено. - Усе налаштовано! + Будь-коли оновіть свій профіль у налаштуваннях + Все чудово! Поїхали - Ви можете змінити його будь-коли. + Час вказати ім’я Додати зображення профілю Ви можете змінити його пізніше Показуване ім\'я Його буде показано у надісланих повідомленнях. Виберіть показуване ім\'я - Ваш обліковий запис %s створено. + Ваш обліковий запис %s створений Вітаємо! На головну Персоналізувати профіль @@ -2631,4 +2631,59 @@ Надішліть своє перше повідомлення, щоб запросити %s до бесіди Повідомлення в цій бесіді будуть захищені наскрізним шифруванням. Уперед + + %d повідомлення вилучене + %d повідомлення вилучені + %d повідомлень вилучені + %d повідомлень вилучені + + Поділитися місцем перебування + Ви повинні мати відповідні дозволи, щоб ділитися місцем перебування наживо в цій кімнаті. + Ви не маєте дозволу ділитися поточним місцем перебування + Неможливо відкрити це посилання: спільноти замінено просторами + Ім\'я користувача / Е-пошта / Телефон + Ви людина\? + Виконайте вказівки, надіслані на %s + Скидання пароля + Забули пароль + Не отримали лист\? + Повторно надіслати електронний лист + Щоб підтвердити свою електронну адресу, торкніться кнопки в електронному листі, який ми щойно надіслали на адресу %s + Перейдіть до своєї електронної пошти для підтвердження. + Повторно надіслати код + Код було надіслано на %s + Підтвердьте свій номер телефону + Вийти на всіх пристроях + Скинути пароль + Переконайтеся, що він складається з 8 або більше символів. + Виберіть новий пароль + Новий пароль + Перегляньте свою електронну пошту. + %s надішле вам посилання для підтвердження + Код підтвердження + Введіть свій номер телефону + Е-пошта + %s потребує підтвердження вашого облікового запису + %s потребує підтвердження вашого облікового запису + Номер телефону + Введіть адресу електронної пошти + Ознайомтеся з умовами та правилами %s + Правила сервера + Будьте в курсі + Element Matrix Services (EMS) — це надійна служба розміщення для швидкого, безпечного зв’язку в реальному часі. Дізнайтеся, як на element.io/ems + Хочете розмістити власний сервер\? + URL-адреса сервера + Яка адреса вашого сервера\? Це як домівка всіх ваших даних + Виберіть свій сервер + З поверненням! + Редагувати + Або + Де відбуватимуться ваші розмови + Має бути 8 або більше символів + Інші бачитимуть вашим іменем %s + Створіть свій обліковий запис + Використовувати типовий для системи + Вибрати вручну + Установити автоматично + Виберіть розмір шрифту \ No newline at end of file From cc15c12c4109d454734c12332596313eaf999a6b Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 21 Jul 2022 02:34:47 +0000 Subject: [PATCH 027/190] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- vector/src/main/res/values-zh-rTW/strings.xml | 66 +++++++++++++++++-- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index c04e293787..e4e9708a5f 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -1432,7 +1432,7 @@ 邀請已傳送給 %1$s 與其他 %2$d 個人 我們無法邀請使用者。請檢查您想要邀請的使用者並再試一次。 - 訊息已刪除 + 訊息已移除 顯示已移除的訊息 為已移除的訊息顯示佔位符 我們已傳送確認電子郵件給 %s,請先檢查您的電子郵件並點擊確認連結 @@ -2320,11 +2320,11 @@ 連線至伺服器 想要加入現有的伺服器? 略過此問題 - 還不確定?您可以 %s + 還不確定?%s 社群 團隊 朋友與家人 - 我們將會協助您建立聯繫。 + 我們將會協助您建立聯繫 您與誰聊最多? 您已經在檢視此討論串了! 在聊天室中檢視 @@ -2378,16 +2378,16 @@ 家伺服器不接受僅有數字的使用者名稱。 略過此步驟 儲存並繼續 - 您的偏好設定已儲存。 - 準備好了! + 隨時前往設定以更新您的個人資料 + 看起來不錯! 走吧 - 您可以在任何時候變更這個。 + 是時候為名字加上臉了 新增個人資訊照片 您可以在稍後變更這個 顯示名稱 這將會在您傳送訊息時顯示。 選擇顯示名稱 - 您的帳號 %s 已建立。 + 您的帳號 %s 已建立 恭喜! 帶我回家 個人化檔案 @@ -2487,4 +2487,56 @@ 傳送您的第一則訊息以邀請 %s 來聊天 此聊天中的訊息將會是端到端加密。 + + 已移除 %d 則訊息 + + 分享位置 + 您必須擁有正確的權限才能在此聊天室中分享即時位置。 + 您無權分享即時位置 + 無法開啟此連結:社群已被空間取代 + 使用者名稱 / 電子郵件 / 電話 + 您是人類嗎? + 按照寄送到 %s 的說明操作 + 密碼重設 + 忘記密碼 + 重新傳送電子郵件 + 沒有收到電子郵件? + 要確認您的電子郵件,請點擊我們剛剛寄給 %s 的電子郵件中的按鈕 + 檢查您的電子郵件以驗證。 + 重新傳送驗證碼 + 驗證碼已傳送至 %s + 確認您的電話號碼 + 登出所有裝置 + 重設密碼 + 確認其為 8 個字元或更多。 + 選擇新密碼 + 新密碼 + 檢查您的電子郵件。 + %s 將會傳送給您驗證連結 + 確認代碼 + 電話號碼 + %s 必須驗證您的帳號 + 輸入您的電話號碼 + 電子郵件 + %s 必須驗證您的帳號 + 輸入您的電子郵件 + 請仔細閱讀 %s 的條款與政策 + 伺服器政策 + 保持聯絡 + Element Matrix Services (EMS) 是一個強大且可靠的主機託管服務,可實現快速、安全且即時的通訊。可在 element.io/ems 上了解如何使用 + 想要架設自己的伺服器? + 伺服器 URL + 您的伺服器位置是什麼?這就像您所有資料的家 + 選取您的伺服器 + 歡迎回來! + 編輯 + + 您的對話將在哪裡進行 + 必須是 8 個字元或更多 + 其他人可以探索您 %s + 建立您的帳號 + 使用系統預設值 + 手動選擇 + 自動設定 + 選擇字型大小 \ No newline at end of file From 25e21434849720b8ddafb87e166b4f46a31cff61 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 20 Jul 2022 19:07:50 +0000 Subject: [PATCH 028/190] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/ --- fastlane/metadata/android/pt-BR/changelogs/40104220.txt | 4 ++-- fastlane/metadata/android/pt-BR/changelogs/40104230.txt | 4 ++-- fastlane/metadata/android/pt-BR/changelogs/40104240.txt | 4 ++-- fastlane/metadata/android/pt-BR/changelogs/40104250.txt | 4 ++-- fastlane/metadata/android/pt-BR/changelogs/40104260.txt | 2 ++ fastlane/metadata/android/pt-BR/changelogs/40104270.txt | 2 ++ fastlane/metadata/android/pt-BR/changelogs/40104280.txt | 2 ++ 7 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104260.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104270.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104280.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104220.txt b/fastlane/metadata/android/pt-BR/changelogs/40104220.txt index 5c0d610ddd..6e11e92579 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/40104220.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/40104220.txt @@ -1,2 +1,2 @@ -Principais mudanças nesta versão: Várias correções de bugs e melhorias de estabilidade. -Registro de mudanças completo: https://github.com/vector-im/element-android/releases +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104230.txt b/fastlane/metadata/android/pt-BR/changelogs/40104230.txt index 5c0d610ddd..6e11e92579 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/40104230.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/40104230.txt @@ -1,2 +1,2 @@ -Principais mudanças nesta versão: Várias correções de bugs e melhorias de estabilidade. -Registro de mudanças completo: https://github.com/vector-im/element-android/releases +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104240.txt b/fastlane/metadata/android/pt-BR/changelogs/40104240.txt index 5c0d610ddd..6e11e92579 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/40104240.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/40104240.txt @@ -1,2 +1,2 @@ -Principais mudanças nesta versão: Várias correções de bugs e melhorias de estabilidade. -Registro de mudanças completo: https://github.com/vector-im/element-android/releases +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104250.txt b/fastlane/metadata/android/pt-BR/changelogs/40104250.txt index 5c0d610ddd..6e11e92579 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/40104250.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/40104250.txt @@ -1,2 +1,2 @@ -Principais mudanças nesta versão: Várias correções de bugs e melhorias de estabilidade. -Registro de mudanças completo: https://github.com/vector-im/element-android/releases +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104260.txt b/fastlane/metadata/android/pt-BR/changelogs/40104260.txt new file mode 100644 index 0000000000..25d02aee8b --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40104260.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Usar UnifiedPush e permite usuária(o) ter push sem FCM. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104270.txt b/fastlane/metadata/android/pt-BR/changelogs/40104270.txt new file mode 100644 index 0000000000..6e11e92579 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40104270.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104280.txt b/fastlane/metadata/android/pt-BR/changelogs/40104280.txt new file mode 100644 index 0000000000..6e11e92579 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade. +Changelog completo: https://github.com/vector-im/element-android/releases From 33dd5374ff2f8168d0d3e5c55994b29e945f303b Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 20 Jul 2022 22:10:51 +0000 Subject: [PATCH 029/190] Translated using Weblate (Slovak) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/ --- fastlane/metadata/android/sk/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/sk/changelogs/40104280.txt diff --git a/fastlane/metadata/android/sk/changelogs/40104280.txt b/fastlane/metadata/android/sk/changelogs/40104280.txt new file mode 100644 index 0000000000..50670f18c2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases From d198fbe559e8ae5f069c56a32c8ebfc6b6183dab Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 20 Jul 2022 17:28:01 +0000 Subject: [PATCH 030/190] Translated using Weblate (Ukrainian) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40104280.txt diff --git a/fastlane/metadata/android/uk/changelogs/40104280.txt b/fastlane/metadata/android/uk/changelogs/40104280.txt new file mode 100644 index 0000000000..82eef725e0 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність. +Перелік усіх змін://github.com/vector-im/element-android/releases From e260851f8d848f88dd0ea2f021b2f47741215e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 20 Jul 2022 20:29:06 +0000 Subject: [PATCH 031/190] Translated using Weblate (Estonian) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40104280.txt diff --git a/fastlane/metadata/android/et/changelogs/40104280.txt b/fastlane/metadata/android/et/changelogs/40104280.txt new file mode 100644 index 0000000000..1df5ac4176 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases From 4a436c3203d3b41ea40ce649d53ac5b179e907d1 Mon Sep 17 00:00:00 2001 From: random Date: Wed, 20 Jul 2022 14:31:14 +0000 Subject: [PATCH 032/190] Translated using Weblate (Italian) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/it/ --- fastlane/metadata/android/it-IT/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40104280.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40104280.txt b/fastlane/metadata/android/it-IT/changelogs/40104280.txt new file mode 100644 index 0000000000..556a6fc7ea --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità. +Cronologia completa: https://github.com/vector-im/element-android/releases From 6c7ed9abf7530d7243d374171bc675cd199e3786 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 20 Jul 2022 18:55:29 +0000 Subject: [PATCH 033/190] Translated using Weblate (Persian) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40104280.txt diff --git a/fastlane/metadata/android/fa/changelogs/40104280.txt b/fastlane/metadata/android/fa/changelogs/40104280.txt new file mode 100644 index 0000000000..29efb95925 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40104280.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش: رفع اشکال‌های مختلف و بهبودهای پایداری. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases From d768031c2114794d2456adfeaea419ac91ab7976 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 21 Jul 2022 01:38:06 +0000 Subject: [PATCH 034/190] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- fastlane/metadata/android/zh-TW/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40104280.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104280.txt b/fastlane/metadata/android/zh-TW/changelogs/40104280.txt new file mode 100644 index 0000000000..4bcca9a0b8 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40104280.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:多個臭蟲修復與穩定性改善。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases From 0078697d4b0ca54f0078560ce90596b619c10d8a Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 20 Jul 2022 22:08:13 +0000 Subject: [PATCH 035/190] Translated using Weblate (Indonesian) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- fastlane/metadata/android/id/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/id/changelogs/40104280.txt diff --git a/fastlane/metadata/android/id/changelogs/40104280.txt b/fastlane/metadata/android/id/changelogs/40104280.txt new file mode 100644 index 0000000000..1017951d47 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas. +Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases From 6c686351c45f340fda7a98a612f07e827dd9e4fe Mon Sep 17 00:00:00 2001 From: ssnfcmux Date: Fri, 22 Jul 2022 12:19:53 +0000 Subject: [PATCH 036/190] Translated using Weblate (Arabic) Currently translated at 42.0% (974 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/ --- vector/src/main/res/values-ar/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml index 044653f4ba..aa28d9f481 100644 --- a/vector/src/main/res/values-ar/strings.xml +++ b/vector/src/main/res/values-ar/strings.xml @@ -245,7 +245,7 @@ أزِل انضم ارفض - انتقل إلى غير المقروءة. + انتقل إلى الرسائل الغير مقروءة ترك الغرفة أمتأكّد من ترك الغرفة؟ امنع @@ -362,7 +362,7 @@ عضو واحد عضوان %d أعضاء - %d عضوا + %d عضو %d عضو ‏⁨%1$s⁩ و ⁨%2$s⁩ يكتبون… @@ -397,17 +397,17 @@ %d تغيير على العضوية يحتاج Element تصريحا منك للوصول إلى المِكرفون لإجراء المكالمات الصوتية. - يحتاج Element تصريحا منك للوصول إلى الكمرة والمِكرفون لإجراء المكالمات الصورية. - -رجاءً اسمح بالوصول في المنبثقة التالية لتقدر على إرسال إجراء المكالمات الصورية. + يحتاج ${app_name} تصريحا منك للوصول إلى الكاميرا والمايكروفون لإجراء المكالمات المرئية. +\n +\nرجاءً اسمح بالوصول في النافذة التالية لتتمكن من إجراء المكالمة. ادعُ انضم إلى الغرفة الأصلي لم يُجب الطرف البعيد. الدردشات المباشرة أشِر إليه - لن تستطيع العودة عن هذا التغيير إذ أنك تمنح المستخدم نفس مستوى السلطة الذي لك. -أمتأكد؟ + لا يمكن التراجع عن هذا التغيير إذ أنك تمنح المستخدم نفس مستوى الصلاحيات الخاص بك. +\nهل تريد تأكيد التغيير؟ حظر مستخدم عن هذه الغرفة سيمنعه من الانضمام إليها ثانية. ثِق لا تثق @@ -507,8 +507,8 @@ أرسِل صوتًا أرسِل ملصقًا ليس ثمة أية حزمة ملصقات مفعّلة حاليًا. - -أتريد إضافة حزمة الآن؟ +\n| +\nأتريد إضافة حزمة الآن؟ نأسف، لم نجد أي تطبيق خارجي لإكمال هذا الإجراء. أعِد طلب مفاتيح التعميةمن أجهزتك الأخرى. رجاءً أطلِق Element في جهاز آخر يقدر على فك تعمية الرسالة ليُرسل المفاتيح إلى هذا الجهاز. @@ -548,7 +548,7 @@ يدعو المستخدم حسب المعرّف المعطى إلى الغرفة الحالية شغّل/عطّل مارك‌داون ألغِ تفعيل الحساب - استُبدلت هذه الغرفة ولم تعد نشطة بعد الآن + استُبدلت هذه الغرفة ولم تعد نشطة بعد الآن. هذه الغرفة هي استمرار لمحادثة أخرى انقر هنا لرؤية الرسائل الأقدم راسِل مدير الخدمة @@ -567,7 +567,7 @@ استمرت المحادثة هنا تخطّ خادوم المنزل هذا حدود الموارد لديه بذلك لن يستطيع بعض المستخدمين الولوج. تخطّ خادوم المنزل هذا أحد حدود الموارد لديه. - وصل خادوم المنزل هذا حدّ المستخدمين النشطين شهريًا بذلك لن يستطيع بعض المستخدمين الولوج. + وصل هذا الخادم الحدّ الأقصى للمستخدمين النشطين شهريًا بذلك لن يستطيع بعض المستخدمين الولوج لحساباتهم. وصل خادوم المنزل هذا حدّ المستخدمين النشطين شهريًا. يجري وصل الاتصال… سيجعل هذا حسابك محال الاستخدام للأبد. لن تقدر على الولوج ولن يقدر أحد على إعادة التسجيل بنفس معرّف المستخدم. سيتسبب هذا بأن يترك حسابك كل الغرف التي تشارك فيها، وستُزال تفاصيل الحساب من خادوم التعريف. هذا إجراء لا عودة فيه. From 5a994e7314820b68c0eeeab14d2659b64d93c032 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 22 Jul 2022 06:15:05 +0000 Subject: [PATCH 037/190] Translated using Weblate (Czech) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- vector/src/main/res/values-cs/strings.xml | 68 ++++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index cd66940316..a9f177128f 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -2409,12 +2409,12 @@ Povolit zprávy ve vláknech Připojit se k serveru Chcete se připojit k existujícímu serveru\? - přeskočit tuto otázku - Ještě si nejste jisti\? Můžete %s + Přeskočit tuto otázku + Ještě si nejste jisti\? %s Komunity Týmy Přátelé a rodina - Pomůžeme vám se připojit. + Pomůžeme vám se připojit S kým si budete povídat nejčastěji\? Již si prohlížíte toto vlákno! Prohlédnout v místnosti @@ -2472,16 +2472,16 @@ Domovský server neakceptuje uživatelská jména obsahující pouze číslice. Přeskočit tento krok Uložit a pokračovat - Vaše předvolby byly uloženy. - Vše je připraveno! + Kdykoli přejděte do nastavení a aktualizujte svůj profil + Vypadá to dobře! Jdeme na to - Tuto můžete kdykoli změnit. + Je na čase dát jménu tvář Přidat profilový obrázek Později to můžete změnit Zobrazované jméno Toto se zobrazí při odesílání zpráv. Zvolte si zobrazované jméno - Váš účet %s byl založen. + Váš účet %s byl založen Gratulujeme! Vezmi mě domů Přizpůsobit profil @@ -2583,4 +2583,58 @@ Odesláním první zprávy pozvete %s do místnosti Zprávy v této místnosti budou koncově šifrovány. Přejít + + %d zpráva odstraněna + %d zprávy odstraněny + %d zpráv odstraněno + + Sdílet polohu + Abyste mohli sdílet polohu živě v této místnosti, musíte mít správná oprávnění. + Nemáte oprávnění ke sdílení polohy živě + Nelze otevřít tento odkaz: komunity byly nahrazeny prostory + Uživatelské jméno / e-mail / telefon + Jste člověk\? + Postupujte podle pokynů zaslaných na %s + Obnovení hesla + Zapomenuté heslo + Znovu poslat e-mail + Nepřišel vám e-mail\? + Pro potvrzení e-mailu klepněte na tlačítko ve zprávě, kterou jsme právě odeslali na adresu %s + Pro ověření si zkontrolujte svůj e-mail. + Znovu odeslat kód + Kód byl odeslán na %s + Potvrďte své telefonní číslo + Odhlásit všechna zařízení + Obnovit heslo + Ujistěte se, že má 8 nebo více znaků. + Zvolte si nové heslo + Nové heslo + Zkontrolujte si e-mailovou schránku. + %s vám zašle ověřovací odkaz + Potvrzovací kód + Telefonní číslo + %s potřebuje ověřit váš účet + Zadejte své telefonní číslo + E-mail + %s potřebuje ověřit váš účet + Zadejte svou e-mailovou adresu + Přečtěte si prosím podmínky a zásady serveru %s + Zásady serveru + Kontaktujte nás + Element Matrix Services (EMS) je robustní a spolehlivá hostingová služba pro rychlou a bezpečnou komunikaci v reálném čase. Jak na to, zjistíte na serveru element.io/ems + Chcete hostovat vlastní server\? + URL serveru + Jaká je adresa vašeho serveru\? Je to něco jako domov pro všechna vaše data + Vyberte si svůj server + Vítejte zpět! + Upravit + Nebo + Kde budou vaše konverzace probíhat + Musí obsahovat nejméně 8 znaků + Ostatní vás mohou objevit %s + Vytvořit účet + Použít výchozí nastavení systému + Zvolit ručně + Nastavit automaticky + Volba velikosti písma \ No newline at end of file From ab1d899e1f2de2ca0c52ea5b21558656c2092fec Mon Sep 17 00:00:00 2001 From: Glandos Date: Fri, 22 Jul 2022 11:43:12 +0000 Subject: [PATCH 038/190] Translated using Weblate (French) Currently translated at 100.0% (2315 of 2315 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- vector/src/main/res/values-fr/strings.xml | 67 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 3cfbd5f9bd..1039a66f32 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -2372,12 +2372,12 @@ Activer les messages en fils de discussion Se connecter au serveur Vous cherchez à joindre un serveur existant \? - passer cette question - Pas encore sûr \? Vous pouvez %s + Passer cette question + Pas encore sûr \? %s Communautés Équipes Famille et amis - Nous allons vous aider à vous connecter. + Nous allons vous aider à vous connecter À qui allez-vous le plus parler \? Vous êtes déjà en train de voir ce fil de discussion ! Voir dans le salon @@ -2419,16 +2419,16 @@ Le serveur hôte n’accepte pas de nom d’utilisateur avec seulement des chiffres. Ignorer cette étape Enregistrer et continuer - Vos préférences ont été enregistrées. - Tout est prêt ! + Dirigez vous dans les paramètres à tout moment pour mettre à jour votre profil + Ça a l’air correct ! Allons-y - Vous pouvez la changer à tout moment. + C’est le moment de mettre un visage sur ce nom Ajouter une photo de profil Vous pourrez le changer plus tard Nom d’affichage Il sera affiché quand vous enverrez des messages. Choisissez un nom d’affichage - Votre compte %s a été créé. + Votre compte %s a été créé Félicitations ! Aller à l’accueil Personnaliser le profil @@ -2535,4 +2535,57 @@ Envoyez votre premier message pour inviter %s à discuter Les messages de ce salon seront chiffrés de bout en bout. C’est parti + + %d message supprimé + %d messages supprimés + + Partager la position + Vous avez besoin d’une autorisation pour partager une position en direct dans ce salon. + Vous n’avez pas l’autorisation de partager une position en direct + Impossible d’ouvrir ce lien : les communautés ont été remplacées par les espaces + Nom d’utilisateur / Courriel / Téléphone + Êtes-vous un humain \? + Suivez les instructions envoyées à %s + Réinitialisation de mot de passe + Mot de passe oublié + Renvoyer le courriel + Pas reçu de courriel \? + Pour confirmer votre courriel, appuyez sur le bouton dans le courriel que nous venons d’envoyer à %s + Relevez vos courriels pour la vérification. + Renvoyer le code + Un code a été envoyé au %s + Confirmer votre numéro de téléphone + Déconnecter tous les appareils + Réinitialiser le mot de passe + Soyez sûr qu’il ait au moins 8 caractères. + Choisissez un nouveau mot de passe + Nouveau mot de passe + Vérifiez vos courriels. + %s va vous envoyer un lien de vérification + Code de confirmation + Numéro de téléphone + %s a besoin de vérifier votre compte + Saisissez votre numéro de téléphone + Courriel + %s a besoin de vérifier votre compte + Saisissez votre courriel + Veuillez lire les conditions et politiques de %s + Politiques du serveur + Prendre contact + Element Matrix Services (EMS) est un service d’hébergement fiable et robuste pour des communications rapides, sécurisées et en temps réel. Pour en savoir plus, rendez-vous sur element.io/ems + Héberger votre propre serveur \? + URL du serveur + Quelle est l’adresse de votre serveur \? C’est comme un domicile pour toutes vos données + Sélectionner votre serveur + Bon retour parmi nous ! + Modifier + Ou + Où vos conversations résideront + Doit contenir au moins 8 caractères + Les autres peuvent vous trouver en tant que %s + Créer votre compte + Utiliser la valeur du système + Choisir manuellement + Automatique + Choisir la taille de la police \ No newline at end of file From 26cfe9ff1ebf2c42f4602e2505e7d0df3987746d Mon Sep 17 00:00:00 2001 From: Glandos Date: Fri, 22 Jul 2022 11:27:11 +0000 Subject: [PATCH 039/190] Translated using Weblate (French) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/ --- fastlane/metadata/android/fr-FR/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40104280.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104280.txt b/fastlane/metadata/android/fr-FR/changelogs/40104280.txt new file mode 100644 index 0000000000..fe61fd021c --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Plusieurs corrections de bogues et d’améliorations de stabilité. +Intégralité des changements : https://github.com/vector-im/element-android/releases From 815033324164648fe0aa1137349678134cf49d73 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 22 Jul 2022 05:36:12 +0000 Subject: [PATCH 040/190] Translated using Weblate (Czech) Currently translated at 100.0% (71 of 71 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/ --- fastlane/metadata/android/cs-CZ/changelogs/40104280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40104280.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40104280.txt b/fastlane/metadata/android/cs-CZ/changelogs/40104280.txt new file mode 100644 index 0000000000..578549ce6c --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability. +Úplný seznam změn: https://github.com/vector-im/element-android/releases From d5fa6f188c0325cb3780584b3905fb9198c2a93d Mon Sep 17 00:00:00 2001 From: Suleman Tariq Date: Sat, 23 Jul 2022 18:23:13 +0000 Subject: [PATCH 041/190] Added translation using Weblate (Urdu) --- vector/src/main/res/values-ur/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vector/src/main/res/values-ur/strings.xml diff --git a/vector/src/main/res/values-ur/strings.xml b/vector/src/main/res/values-ur/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/vector/src/main/res/values-ur/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 3df337fa0761f1eb28b857e3acbd03a925012c02 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 26 Jul 2022 12:38:29 +0200 Subject: [PATCH 042/190] Adds new layout toolbar --- .../ui-styles/src/main/res/values/dimens.xml | 3 + .../src/main/res/values/styles_toolbar.xml | 11 ++- .../src/main/res/values/theme_common.xml | 2 +- .../src/main/res/values/theme_dark.xml | 3 + .../src/main/res/values/theme_light.xml | 4 + .../res/layout/fragment_new_home_detail.xml | 92 +++++++++++++++++++ vector/src/main/res/values/strings.xml | 1 + 7 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 vector/src/main/res/layout/fragment_new_home_detail.xml diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml index 70d051b457..53f1044a12 100644 --- a/library/ui-styles/src/main/res/values/dimens.xml +++ b/library/ui-styles/src/main/res/values/dimens.xml @@ -71,4 +71,7 @@ 8dp 12dp 22dp + + + 112dp diff --git a/library/ui-styles/src/main/res/values/styles_toolbar.xml b/library/ui-styles/src/main/res/values/styles_toolbar.xml index 505419c6fe..b822dd3db7 100644 --- a/library/ui-styles/src/main/res/values/styles_toolbar.xml +++ b/library/ui-styles/src/main/res/values/styles_toolbar.xml @@ -39,4 +39,13 @@ 12sp - \ No newline at end of file + + + + + diff --git a/library/ui-styles/src/main/res/values/theme_common.xml b/library/ui-styles/src/main/res/values/theme_common.xml index 2e9c2c5123..107534fe1a 100644 --- a/library/ui-styles/src/main/res/values/theme_common.xml +++ b/library/ui-styles/src/main/res/values/theme_common.xml @@ -25,4 +25,4 @@ false - \ No newline at end of file + diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml index f86a05ed66..9f4e5c1e28 100644 --- a/library/ui-styles/src/main/res/values/theme_dark.xml +++ b/library/ui-styles/src/main/res/values/theme_dark.xml @@ -149,6 +149,9 @@ @color/vctr_live_location_dark + + + @dimen/collapsing_toolbar_layout_medium_size diff --git a/library/ui-styles/src/main/res/values/text_appearances.xml b/library/ui-styles/src/main/res/values/text_appearances.xml index 1e60e05acf..570d26fdfd 100644 --- a/library/ui-styles/src/main/res/values/text_appearances.xml +++ b/library/ui-styles/src/main/res/values/text_appearances.xml @@ -32,6 +32,15 @@ ?vctr_content_primary + + + -