From 8f0074911aa6b6147d6ec08a8ecc174a6991d446 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Mon, 25 Oct 2021 19:00:39 +0300 Subject: [PATCH 001/319] Thread awareness, map threads events to replies --- .../network/ThreadToReplyMapInterceptor.kt | 105 +++++++++++++++++ .../sync/handler/room/RoomSyncHandler.kt | 3 + .../handler/room/ThreadsAwarenessHandler.kt | 108 ++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt new file mode 100644 index 0000000000..519e497e95 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.network + +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody +import okhttp3.ResponseBody.Companion.toResponseBody +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.network.ApiInterceptorListener +import org.matrix.android.sdk.api.network.ApiPath +import org.matrix.android.sdk.internal.di.MatrixScope +import timber.log.Timber +import javax.inject.Inject + +/** + * The goal of this interceptor is to map thread events to be handled as replies. + * The interceptor is responsible for mapping a thread event: + * "m.relates_to":{ + * "event_id":"$eventId", + * "rel_type":"io.element.thread" + * } + * to an equivalent reply event: + * m.relates_to":{ + * "m.in_reply_to":{ + * "event_id":"$eventId" + * } + */ +@MatrixScope +internal class ThreadToReplyMapInterceptor @Inject constructor() : Interceptor { + + init { + Timber.d("MapThreadToReplyInterceptor.init") + } + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + + val response = chain.proceed(request) + + if (isSyncRequest(request)) { + Timber.i(" ------> found SYNC REQUEST") + + return response.body?.let { + val contentType = it.contentType() + val rawBody = it.string() + Timber.i(" ------> $rawBody") + + if(rawBody.contains("\"rel_type\":\"io.element.thread\"")){ + Timber.i(" ------> Thread found") + val start = rawBody.indexOf("\"rel_type\":\"io.element.thread\"") - "\"m.relates_to\":{\"event_id\":\"-GoMTnxkfmZczOPvbjcK43WqNib3wiJVaeO_vRxwHIDA\",\"".length +1 + val end = rawBody.indexOf("\"rel_type\":\"io.element.thread\"") + "\"rel_type\":\"io.element.thread\"".length +2 + val substr = rawBody.subSequence(start,end) + val newRaw = rawBody.replaceRange(start,end,"\"m.relates_to\":{\"m.in_reply_to\":{\"event_id\":\"\$HDddlX2bJQmVS0bN5R9HDzcrGDap18b3cFDDYjTjctc\"}},") + Timber.i(" ------> ${substr}") + Timber.i(" ------> new raw $newRaw") + val newBody = newRaw.toResponseBody(contentType) + response.newBuilder().body(newBody).build() + + }else{ + val newBody = rawBody.toResponseBody(contentType) + response.newBuilder().body(newBody).build() + } + } ?: response + +// response.peekBody(Long.MAX_VALUE).string().let { networkResponse -> +// Timber.i(" ------> ThreadToReplyMapInterceptor $networkResponse") +// } + } + +// val path = request.url.encodedPath +// if(path.contains("/sync/")){ +// Timber.i("-----> SYNC REQUEST --> $responseBody") +// +// +// } + +// val body = ResponseBody.create() +// val newResponse = response.newBuilder().body(body) + return response + } + + /** + * Returns true if the request is a sync request, false otherwise + * Example of a sync request: + * https://matrix-client.matrix.org/_matrix/client/r0/sync?filter=0&set_presence=online&t... + */ + private fun isSyncRequest(request: Request): Boolean = + ApiPath.SYNC.method == request.method && request.url.encodedPath.contains(ApiPath.SYNC.path) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 8c4af81c99..db4e07a21a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -76,6 +76,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle private val cryptoService: DefaultCryptoService, private val roomMemberEventHandler: RoomMemberEventHandler, private val roomTypingUsersHandler: RoomTypingUsersHandler, + private val threadsAwarenessHandler: ThreadsAwarenessHandler, private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource, @UserId private val userId: String, private val timelineInput: TimelineInput) { @@ -366,6 +367,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle decryptIfNeeded(event, roomId) } + threadsAwarenessHandler.handleIfNeeded(realm, roomId, event, ::decryptIfNeeded) + val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType) if (event.stateKey != null) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt new file mode 100644 index 0000000000..cc01f62448 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.sync.handler.room + +import io.realm.Realm +import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.toContent +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageFormat +import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent +import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent +import org.matrix.android.sdk.api.session.room.model.tag.RoomTagContent +import org.matrix.android.sdk.api.util.JsonDict +import org.matrix.android.sdk.internal.database.mapper.EventMapper +import org.matrix.android.sdk.internal.database.model.EventEntity +import org.matrix.android.sdk.internal.database.model.EventInsertType +import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity +import org.matrix.android.sdk.internal.database.model.RoomTagEntity +import org.matrix.android.sdk.internal.database.query.getOrCreate +import org.matrix.android.sdk.internal.database.query.where +import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory +import timber.log.Timber +import javax.inject.Inject + +/** + * This handler is responsible for a smooth threads migration. It will map all incoming + * threads as replies. So a device without threads enabled/updated will be able to view + * threads response as replies to the orighinal message + */ +internal class ThreadsAwarenessHandler @Inject constructor( + private val permalinkFactory: PermalinkFactory +) { + + fun handleIfNeeded(realm: Realm, + roomId: String, + event: Event, + decryptIfNeeded: (event: Event, roomId: String) -> Unit) { + + if (!isThreadEvent(event)) return + val rootThreadEventId = getRootThreadEventId(event) ?: return + val payload = event.mxDecryptionResult?.payload?.toMutableMap() ?: return + val body = getValueFromPayload(payload, "body") ?: return + val msgType = getValueFromPayload(payload, "msgtype") ?: return + val rootThreadEventEntity = EventEntity.where(realm, eventId = rootThreadEventId).findFirst() ?: return + val rootThreadEvent = EventMapper.map(rootThreadEventEntity) + val rootThreadEventSenderId = rootThreadEvent.senderId ?: return + val rootThreadEventEventId = rootThreadEvent.eventId ?: return + + Timber.i("------> Thread event detected!") + + if (rootThreadEvent.isEncrypted()) { + decryptIfNeeded(rootThreadEvent, roomId) + } + + val rootThreadEventBody = getValueFromPayload(rootThreadEvent.mxDecryptionResult?.payload?.toMutableMap(),"body") + + val permalink = permalinkFactory.createPermalink(roomId, rootThreadEventEventId, false) + val userLink = permalinkFactory.createPermalink(rootThreadEventSenderId, false) ?: "" + + val replyFormatted = LocalEchoEventFactory.REPLY_PATTERN.format( + permalink, + userLink, + rootThreadEventSenderId, + // Remove inner mx_reply tags if any + rootThreadEventBody, + body) + + val messageTextContent = MessageTextContent( + msgType = msgType, + format = MessageFormat.FORMAT_MATRIX_HTML, + body = body, + formattedBody = replyFormatted + ).toContent() + + payload["content"] = messageTextContent + + event.mxDecryptionResult = event.mxDecryptionResult?.copy(payload = payload ) + + } + + private fun isThreadEvent(event: Event): Boolean = + event.content.toModel()?.relatesTo?.type == "io.element.thread" + + private fun getRootThreadEventId(event: Event): String? = + event.content.toModel()?.relatesTo?.eventId + + @Suppress("UNCHECKED_CAST") + private fun getValueFromPayload(payload: JsonDict?, key: String): String? { + val content = payload?.get("content") as? JsonDict + return content?.get(key) as? String + } +} From d1f3e3f958d827d3d1a6ac0b1cd496757e36a3d4 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Tue, 26 Oct 2021 18:59:01 +0300 Subject: [PATCH 002/319] Thread awareness, map threads events to replies --- .../session/sync/handler/room/RoomSyncHandler.kt | 11 +++++++++-- .../sync/handler/room/ThreadsAwarenessHandler.kt | 8 ++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index db4e07a21a..543783acac 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -363,11 +363,18 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } eventIds.add(event.eventId) - if (event.isEncrypted() && insertType != EventInsertType.INITIAL_SYNC) { + val isInitialSync = insertType == EventInsertType.INITIAL_SYNC + + if (event.isEncrypted() && !isInitialSync) { decryptIfNeeded(event, roomId) } - threadsAwarenessHandler.handleIfNeeded(realm, roomId, event, ::decryptIfNeeded) + threadsAwarenessHandler.handleIfNeeded( + realm = realm, + roomId = roomId, + event = event, + isInitialSync = isInitialSync, + ::decryptIfNeeded) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt index cc01f62448..1c45b16abf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -41,7 +41,7 @@ import javax.inject.Inject /** * This handler is responsible for a smooth threads migration. It will map all incoming * threads as replies. So a device without threads enabled/updated will be able to view - * threads response as replies to the orighinal message + * threads response as replies to the original message */ internal class ThreadsAwarenessHandler @Inject constructor( private val permalinkFactory: PermalinkFactory @@ -50,6 +50,7 @@ internal class ThreadsAwarenessHandler @Inject constructor( fun handleIfNeeded(realm: Realm, roomId: String, event: Event, + isInitialSync: Boolean, decryptIfNeeded: (event: Event, roomId: String) -> Unit) { if (!isThreadEvent(event)) return @@ -60,9 +61,8 @@ internal class ThreadsAwarenessHandler @Inject constructor( val rootThreadEventEntity = EventEntity.where(realm, eventId = rootThreadEventId).findFirst() ?: return val rootThreadEvent = EventMapper.map(rootThreadEventEntity) val rootThreadEventSenderId = rootThreadEvent.senderId ?: return - val rootThreadEventEventId = rootThreadEvent.eventId ?: return - Timber.i("------> Thread event detected!") + Timber.i("------> Thread event detected! - isInitialSync: $isInitialSync") if (rootThreadEvent.isEncrypted()) { decryptIfNeeded(rootThreadEvent, roomId) @@ -70,7 +70,7 @@ internal class ThreadsAwarenessHandler @Inject constructor( val rootThreadEventBody = getValueFromPayload(rootThreadEvent.mxDecryptionResult?.payload?.toMutableMap(),"body") - val permalink = permalinkFactory.createPermalink(roomId, rootThreadEventEventId, false) + val permalink = permalinkFactory.createPermalink(roomId, rootThreadEventId, false) val userLink = permalinkFactory.createPermalink(rootThreadEventSenderId, false) ?: "" val replyFormatted = LocalEchoEventFactory.REPLY_PATTERN.format( From 45a63b73bdc03e5051daef05566310e85ff218dd Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Tue, 2 Nov 2021 17:47:37 +0200 Subject: [PATCH 003/319] Make Android app thread aware. Handling also extreme cases like really old messages that the root thread message is not fetched in the device and initial sync --- .../internal/database/model/EventEntity.kt | 5 +- .../session/room/timeline/DefaultTimeline.kt | 22 ++ .../room/timeline/DefaultTimelineService.kt | 3 + .../room/timeline/TimelineEventDecryptor.kt | 19 +- .../session/sync/SyncResponseHandler.kt | 6 + .../sync/handler/room/RoomSyncHandler.kt | 4 +- .../handler/room/ThreadsAwarenessHandler.kt | 192 +++++++++++++++--- 7 files changed, 217 insertions(+), 34 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt index bcd30cb54b..836fc4efaf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt @@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.database.model import io.realm.RealmObject import io.realm.annotations.Index import org.matrix.android.sdk.api.session.room.send.SendState +import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.internal.crypto.MXEventDecryptionResult import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult import org.matrix.android.sdk.internal.di.MoshiProvider @@ -56,10 +57,10 @@ internal open class EventEntity(@Index var eventId: String = "", companion object - fun setDecryptionResult(result: MXEventDecryptionResult) { + fun setDecryptionResult(result: MXEventDecryptionResult, clearEvent: JsonDict? = null) { assertIsManaged() val decryptionResult = OlmDecryptionResult( - payload = result.clearEvent, + payload = clearEvent ?: result.clearEvent, senderKey = result.senderCurve25519Key, keysClaimed = result.claimedEd25519Key?.let { mapOf("ed25519" to it) }, forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index 0c917448cc..e9f992f295 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -23,6 +23,7 @@ import io.realm.RealmConfiguration import io.realm.RealmQuery import io.realm.RealmResults import io.realm.Sort +import kotlinx.coroutines.runBlocking import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull @@ -33,6 +34,7 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.api.util.CancelableBag import org.matrix.android.sdk.internal.database.RealmSessionProvider +import org.matrix.android.sdk.internal.database.mapper.EventMapper import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.RoomEntity @@ -43,6 +45,7 @@ import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.database.query.whereRoomId import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.sync.handler.room.ReadReceiptHandler +import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.configureWith import org.matrix.android.sdk.internal.util.Debouncer @@ -72,6 +75,7 @@ internal class DefaultTimeline( private val eventDecryptor: TimelineEventDecryptor, private val realmSessionProvider: RealmSessionProvider, private val loadRoomMembersTask: LoadRoomMembersTask, + private val threadsAwarenessHandler: ThreadsAwarenessHandler, private val readReceiptHandler: ReadReceiptHandler ) : Timeline, TimelineInput.Listener, @@ -577,6 +581,10 @@ internal class DefaultTimeline( } else { nextDisplayIndex = offsetIndex + 1 } + + // Prerequisite to in order for the ThreadsAwarenessHandler to work properly + fetchRootThreadEventsIfNeeded(offsetResults) + offsetResults.forEach { eventEntity -> val timelineEvent = buildTimelineEvent(eventEntity) @@ -601,6 +609,20 @@ internal class DefaultTimeline( return offsetResults.size } + /** + * This function is responsible to fetch and store the root event of a thread event + * in order to be able to display the event to the user appropriately + */ + private fun fetchRootThreadEventsIfNeeded(offsetResults: RealmResults) = runBlocking { + val eventEntityList = offsetResults + .mapNotNull { + it?.root + }.map { + EventMapper.map(it) + }.toList() + threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(eventEntityList) + } + private fun buildTimelineEvent(eventEntity: TimelineEventEntity): TimelineEvent { return timelineEventMapper.map( timelineEventEntity = eventEntity, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt index 47e8f7e3a3..75e7e774df 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt @@ -38,6 +38,7 @@ import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.sync.handler.room.ReadReceiptHandler +import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import org.matrix.android.sdk.internal.task.TaskExecutor internal class DefaultTimelineService @AssistedInject constructor( @@ -52,6 +53,7 @@ internal class DefaultTimelineService @AssistedInject constructor( private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask, private val timelineEventMapper: TimelineEventMapper, private val loadRoomMembersTask: LoadRoomMembersTask, + private val threadsAwarenessHandler: ThreadsAwarenessHandler, private val readReceiptHandler: ReadReceiptHandler ) : TimelineService { @@ -75,6 +77,7 @@ internal class DefaultTimelineService @AssistedInject constructor( fetchTokenAndPaginateTask = fetchTokenAndPaginateTask, realmSessionProvider = realmSessionProvider, loadRoomMembersTask = loadRoomMembersTask, + threadsAwarenessHandler = threadsAwarenessHandler, readReceiptHandler = readReceiptHandler ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDecryptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDecryptor.kt index 721dae0b1b..75d02dfd98 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDecryptor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDecryptor.kt @@ -26,6 +26,7 @@ import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent import org.matrix.android.sdk.internal.database.model.EventEntity import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.SessionDatabase +import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import timber.log.Timber import java.util.concurrent.ExecutorService import java.util.concurrent.Executors @@ -34,7 +35,8 @@ import javax.inject.Inject internal class TimelineEventDecryptor @Inject constructor( @SessionDatabase private val realmConfiguration: RealmConfiguration, - private val cryptoService: CryptoService + private val cryptoService: CryptoService, + private val threadsAwarenessHandler: ThreadsAwarenessHandler ) { private val newSessionListener = object : NewSessionListener { @@ -106,10 +108,19 @@ internal class TimelineEventDecryptor @Inject constructor( val result = cryptoService.decryptEvent(request.event, timelineId) Timber.v("Successfully decrypted event ${event.eventId}") realm.executeTransaction { - val eventId = event.eventId ?: "" - EventEntity.where(it, eventId = eventId) + val eventId = event.eventId ?: return@executeTransaction + val eventEntity = EventEntity + .where(it, eventId = eventId) .findFirst() - ?.setDecryptionResult(result) + + eventEntity?.apply { + val decryptedPayload = threadsAwarenessHandler.handleIfNeededDuringDecryption( + it, + roomId = event.roomId, + event, + result) + setDecryptionResult(result, decryptedPayload) + } } } catch (e: MXCryptoError) { Timber.v("Failed to decrypt event ${event.eventId} : ${e.localizedMessage}") diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index 335f619623..98d6323bb1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -39,6 +39,7 @@ import org.matrix.android.sdk.internal.session.sync.handler.PresenceSyncHandler import org.matrix.android.sdk.internal.session.sync.handler.SyncResponsePostTreatmentAggregatorHandler import org.matrix.android.sdk.internal.session.sync.handler.UserAccountDataSyncHandler import org.matrix.android.sdk.internal.session.sync.handler.room.RoomSyncHandler +import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import org.matrix.android.sdk.internal.util.awaitTransaction import org.matrix.android.sdk.internal.worker.WorkerParamsFactory import timber.log.Timber @@ -62,6 +63,7 @@ internal class SyncResponseHandler @Inject constructor( private val tokenStore: SyncTokenStore, private val processEventForPushTask: ProcessEventForPushTask, private val pushRuleService: PushRuleService, + private val threadsAwarenessHandler: ThreadsAwarenessHandler, private val presenceSyncHandler: PresenceSyncHandler ) { @@ -94,6 +96,10 @@ internal class SyncResponseHandler @Inject constructor( Timber.v("Finish handling toDevice in $it ms") } val aggregator = SyncResponsePostTreatmentAggregator() + + // Prerequisite for thread events handling in RoomSyncHandler + threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(syncResponse) + // Start one big transaction monarchy.awaitTransaction { realm -> measureTimeMillis { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 543783acac..1a7e15e14c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -372,9 +372,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle threadsAwarenessHandler.handleIfNeeded( realm = realm, roomId = roomId, - event = event, - isInitialSync = isInitialSync, - ::decryptIfNeeded) + event = event) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt index 1c45b16abf..12822aeb1d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -16,25 +16,32 @@ package org.matrix.android.sdk.internal.session.sync.handler.room +import com.zhuinden.monarchy.Monarchy import io.realm.Realm -import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.crypto.CryptoService +import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageFormat import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent -import org.matrix.android.sdk.api.session.room.model.tag.RoomTagContent +import org.matrix.android.sdk.api.session.room.send.SendState +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import org.matrix.android.sdk.api.util.JsonDict +import org.matrix.android.sdk.internal.crypto.MXEventDecryptionResult +import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult import org.matrix.android.sdk.internal.database.mapper.EventMapper +import org.matrix.android.sdk.internal.database.mapper.toEntity import org.matrix.android.sdk.internal.database.model.EventEntity import org.matrix.android.sdk.internal.database.model.EventInsertType -import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity -import org.matrix.android.sdk.internal.database.model.RoomTagEntity -import org.matrix.android.sdk.internal.database.query.getOrCreate +import org.matrix.android.sdk.internal.database.query.copyToRealmOrIgnore import org.matrix.android.sdk.internal.database.query.where +import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory +import org.matrix.android.sdk.internal.util.awaitTransaction import timber.log.Timber import javax.inject.Inject @@ -44,34 +51,137 @@ import javax.inject.Inject * threads response as replies to the original message */ internal class ThreadsAwarenessHandler @Inject constructor( - private val permalinkFactory: PermalinkFactory + private val permalinkFactory: PermalinkFactory, + private val cryptoService: CryptoService, + @SessionDatabase private val monarchy: Monarchy, + private val session: Session ) { + /** + * Fetch root thread events if they are missing from the local storage + * @param syncResponse the sync response + */ + suspend fun fetchRootThreadEventsIfNeeded(syncResponse: SyncResponse) { + val handlingStrategy = syncResponse.rooms?.join?.let { + RoomSyncHandler.HandlingStrategy.JOINED(it) + } + if (handlingStrategy !is RoomSyncHandler.HandlingStrategy.JOINED) return + val eventList = handlingStrategy.data + .mapNotNull { (roomId, roomSync) -> + roomSync.timeline?.events?.map { + it.copy(roomId = roomId) + } + }.flatten() + + fetchRootThreadEventsIfNeeded(eventList) + } + + /** + * Fetch root thread events if they are missing from the local storage + * @param eventList a list with the events to examine + */ + suspend fun fetchRootThreadEventsIfNeeded(eventList: List) { + if (eventList.isNullOrEmpty()) return + + val threadsToFetch = emptyMap().toMutableMap() + monarchy.awaitTransaction { realm -> + eventList.asSequence() + .filter { + isThreadEvent(it) && it.roomId != null + }.mapNotNull { event -> + getRootThreadEventId(event)?.let { + Pair(it, event.roomId!!) + } + }.forEach { (rootThreadEventId, roomId) -> + EventEntity.where(realm, rootThreadEventId).findFirst() ?: run { threadsToFetch[rootThreadEventId] = roomId } + } + } + fetchThreadsEvents(threadsToFetch) + } + + /** + * Fetch multiple unique events using the fetchEvent function + */ + private suspend fun fetchThreadsEvents(threadsToFetch: Map) { + val eventEntityList = threadsToFetch.mapNotNull { (eventId, roomId) -> + fetchEvent(eventId, roomId)?.let { + it.toEntity(roomId, SendState.SYNCED, it.ageLocalTs) + } + } + + if (eventEntityList.isNullOrEmpty()) return + + // Transaction should be done on its own thread, like below + monarchy.awaitTransaction { realm -> + eventEntityList.forEach { + it.copyToRealmOrIgnore(realm, EventInsertType.INCREMENTAL_SYNC) + } + } + } + + /** + * This function will fetch the event from the homeserver, this is mandatory when the + * initial thread message is too old and is not saved in the device, so in order to + * construct the "reply to" format we need to know the event thread. + * @return the Event or null otherwise + */ + private suspend fun fetchEvent(eventId: String, roomId: String): Event? { + return runCatching { + Timber.i("------> Fetching event[$eventId]....") + session.getEvent(roomId = roomId, eventId = eventId) + }.fold( + onSuccess = { + it + }, + onFailure = { + null + }) + } + fun handleIfNeeded(realm: Realm, roomId: String, - event: Event, - isInitialSync: Boolean, - decryptIfNeeded: (event: Event, roomId: String) -> Unit) { + event: Event) { + val payload = transformThreadToReplyIfNeeded( + realm = realm, + roomId = roomId, + event = event, + decryptedResult = event.mxDecryptionResult?.payload) ?: return - if (!isThreadEvent(event)) return - val rootThreadEventId = getRootThreadEventId(event) ?: return - val payload = event.mxDecryptionResult?.payload?.toMutableMap() ?: return - val body = getValueFromPayload(payload, "body") ?: return - val msgType = getValueFromPayload(payload, "msgtype") ?: return - val rootThreadEventEntity = EventEntity.where(realm, eventId = rootThreadEventId).findFirst() ?: return - val rootThreadEvent = EventMapper.map(rootThreadEventEntity) - val rootThreadEventSenderId = rootThreadEvent.senderId ?: return + event.mxDecryptionResult = event.mxDecryptionResult?.copy(payload = payload) + } - Timber.i("------> Thread event detected! - isInitialSync: $isInitialSync") + fun handleIfNeededDuringDecryption(realm: Realm, + roomId: String?, + event: Event, + result: MXEventDecryptionResult): JsonDict? { + return transformThreadToReplyIfNeeded( + realm = realm, + roomId = roomId, + event = event, + decryptedResult = result.clearEvent) + } - if (rootThreadEvent.isEncrypted()) { - decryptIfNeeded(rootThreadEvent, roomId) - } + /** + * If the event is a thread event then transform/enhance it to a visual Reply Event, + * If the event is not a thread event, null value will be returned + * If there is an error (ex. the root/origin thread event is not found), null willl be returend + */ + private fun transformThreadToReplyIfNeeded(realm: Realm, roomId: String?, event: Event, decryptedResult: JsonDict?): JsonDict? { + roomId ?: return null + if (!isThreadEvent(event)) return null + val rootThreadEventId = getRootThreadEventId(event) ?: return null + val payload = decryptedResult?.toMutableMap() ?: return null + val body = getValueFromPayload(payload, "body") ?: return null + val msgType = getValueFromPayload(payload, "msgtype") ?: return null + val rootThreadEvent = getEventFromDB(realm, rootThreadEventId) ?: return null + val rootThreadEventSenderId = rootThreadEvent.senderId ?: return null - val rootThreadEventBody = getValueFromPayload(rootThreadEvent.mxDecryptionResult?.payload?.toMutableMap(),"body") + decryptIfNeeded(rootThreadEvent, roomId) + + val rootThreadEventBody = getValueFromPayload(rootThreadEvent.mxDecryptionResult?.payload?.toMutableMap(), "body") val permalink = permalinkFactory.createPermalink(roomId, rootThreadEventId, false) - val userLink = permalinkFactory.createPermalink(rootThreadEventSenderId, false) ?: "" + val userLink = permalinkFactory.createPermalink(rootThreadEventSenderId, false) ?: "" val replyFormatted = LocalEchoEventFactory.REPLY_PATTERN.format( permalink, @@ -81,7 +191,7 @@ internal class ThreadsAwarenessHandler @Inject constructor( rootThreadEventBody, body) - val messageTextContent = MessageTextContent( + val messageTextContent = MessageTextContent( msgType = msgType, format = MessageFormat.FORMAT_MATRIX_HTML, body = body, @@ -90,8 +200,40 @@ internal class ThreadsAwarenessHandler @Inject constructor( payload["content"] = messageTextContent - event.mxDecryptionResult = event.mxDecryptionResult?.copy(payload = payload ) + return payload + } + /** + * Decrypt the event + */ + + private fun decryptIfNeeded(event: Event, roomId: String) { + try { + if (!event.isEncrypted() || event.mxDecryptionResult != null) return + + // Event from sync does not have roomId, so add it to the event first + val result = cryptoService.decryptEvent(event.copy(roomId = roomId), "") + event.mxDecryptionResult = OlmDecryptionResult( + payload = result.clearEvent, + senderKey = result.senderCurve25519Key, + keysClaimed = result.claimedEd25519Key?.let { k -> mapOf("ed25519" to k) }, + forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain + ) + } catch (e: MXCryptoError) { + if (e is MXCryptoError.Base) { + event.mCryptoError = e.errorType + event.mCryptoErrorReason = e.technicalMessage.takeIf { it.isNotEmpty() } ?: e.detailedErrorDescription + } + } + } + + /** + * Try to get the event form the local DB, if the event does not exist null + * will be returned + */ + private fun getEventFromDB(realm: Realm, eventId: String): Event? { + val eventEntity = EventEntity.where(realm, eventId = eventId).findFirst() ?: return null + return EventMapper.map(eventEntity) } private fun isThreadEvent(event: Event): Boolean = From 8ee3f2c6cb66afddb261ec955ea9c6658e2b69e2 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Wed, 3 Nov 2021 11:34:22 +0200 Subject: [PATCH 004/319] Delete ThreadToReplyMapInterceptor Add documentation comments --- .../network/ThreadToReplyMapInterceptor.kt | 105 ------------------ .../handler/room/ThreadsAwarenessHandler.kt | 14 +++ 2 files changed, 14 insertions(+), 105 deletions(-) delete mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt deleted file mode 100644 index 519e497e95..0000000000 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ThreadToReplyMapInterceptor.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2021 The Matrix.org Foundation C.I.C. - * - * 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 org.matrix.android.sdk.internal.network - -import okhttp3.Interceptor -import okhttp3.Request -import okhttp3.Response -import okhttp3.ResponseBody -import okhttp3.ResponseBody.Companion.toResponseBody -import org.matrix.android.sdk.api.extensions.tryOrNull -import org.matrix.android.sdk.api.network.ApiInterceptorListener -import org.matrix.android.sdk.api.network.ApiPath -import org.matrix.android.sdk.internal.di.MatrixScope -import timber.log.Timber -import javax.inject.Inject - -/** - * The goal of this interceptor is to map thread events to be handled as replies. - * The interceptor is responsible for mapping a thread event: - * "m.relates_to":{ - * "event_id":"$eventId", - * "rel_type":"io.element.thread" - * } - * to an equivalent reply event: - * m.relates_to":{ - * "m.in_reply_to":{ - * "event_id":"$eventId" - * } - */ -@MatrixScope -internal class ThreadToReplyMapInterceptor @Inject constructor() : Interceptor { - - init { - Timber.d("MapThreadToReplyInterceptor.init") - } - - override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request() - - val response = chain.proceed(request) - - if (isSyncRequest(request)) { - Timber.i(" ------> found SYNC REQUEST") - - return response.body?.let { - val contentType = it.contentType() - val rawBody = it.string() - Timber.i(" ------> $rawBody") - - if(rawBody.contains("\"rel_type\":\"io.element.thread\"")){ - Timber.i(" ------> Thread found") - val start = rawBody.indexOf("\"rel_type\":\"io.element.thread\"") - "\"m.relates_to\":{\"event_id\":\"-GoMTnxkfmZczOPvbjcK43WqNib3wiJVaeO_vRxwHIDA\",\"".length +1 - val end = rawBody.indexOf("\"rel_type\":\"io.element.thread\"") + "\"rel_type\":\"io.element.thread\"".length +2 - val substr = rawBody.subSequence(start,end) - val newRaw = rawBody.replaceRange(start,end,"\"m.relates_to\":{\"m.in_reply_to\":{\"event_id\":\"\$HDddlX2bJQmVS0bN5R9HDzcrGDap18b3cFDDYjTjctc\"}},") - Timber.i(" ------> ${substr}") - Timber.i(" ------> new raw $newRaw") - val newBody = newRaw.toResponseBody(contentType) - response.newBuilder().body(newBody).build() - - }else{ - val newBody = rawBody.toResponseBody(contentType) - response.newBuilder().body(newBody).build() - } - } ?: response - -// response.peekBody(Long.MAX_VALUE).string().let { networkResponse -> -// Timber.i(" ------> ThreadToReplyMapInterceptor $networkResponse") -// } - } - -// val path = request.url.encodedPath -// if(path.contains("/sync/")){ -// Timber.i("-----> SYNC REQUEST --> $responseBody") -// -// -// } - -// val body = ResponseBody.create() -// val newResponse = response.newBuilder().body(body) - return response - } - - /** - * Returns true if the request is a sync request, false otherwise - * Example of a sync request: - * https://matrix-client.matrix.org/_matrix/client/r0/sync?filter=0&set_presence=online&t... - */ - private fun isSyncRequest(request: Request): Boolean = - ApiPath.SYNC.method == request.method && request.url.encodedPath.contains(ApiPath.SYNC.path) -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt index 12822aeb1d..6579126140 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -138,6 +138,9 @@ internal class ThreadsAwarenessHandler @Inject constructor( }) } + /** + * Handle events mainly coming from the RoomSyncHandler + */ fun handleIfNeeded(realm: Realm, roomId: String, event: Event) { @@ -150,6 +153,9 @@ internal class ThreadsAwarenessHandler @Inject constructor( event.mxDecryptionResult = event.mxDecryptionResult?.copy(payload = payload) } + /** + * Handle events while they are being decrypted + */ fun handleIfNeededDuringDecryption(realm: Realm, roomId: String?, event: Event, @@ -236,9 +242,17 @@ internal class ThreadsAwarenessHandler @Inject constructor( return EventMapper.map(eventEntity) } + /** + * Returns True if the event is a thread + * @param event + */ private fun isThreadEvent(event: Event): Boolean = event.content.toModel()?.relatesTo?.type == "io.element.thread" + /** + * Returns the root thread eventId or null otherwise + * @param event + */ private fun getRootThreadEventId(event: Event): String? = event.content.toModel()?.relatesTo?.eventId From 4192c1cf81d055a11f7f23dfa39aca542812b045 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Wed, 3 Nov 2021 11:37:48 +0200 Subject: [PATCH 005/319] Add changelog file --- changelog.d/4246.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/4246.feature diff --git a/changelog.d/4246.feature b/changelog.d/4246.feature new file mode 100644 index 0000000000..6695edf590 --- /dev/null +++ b/changelog.d/4246.feature @@ -0,0 +1 @@ +Make Element Android Thread aware From ec366f1346763f58bce2507ae962d335bb2342c4 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Thu, 4 Nov 2021 12:15:22 +0200 Subject: [PATCH 006/319] PR Remarks --- .../android/sdk/api/session/events/model/RelationType.kt | 4 ++++ .../sdk/internal/session/room/timeline/DefaultTimeline.kt | 2 +- .../session/sync/handler/room/ThreadsAwarenessHandler.kt | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/RelationType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/RelationType.kt index 7d827f871b..f67efc50ba 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/RelationType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/RelationType.kt @@ -28,6 +28,10 @@ object RelationType { /** Lets you define an event which references an existing event.*/ const val REFERENCE = "m.reference" + /** Lets you define an thread event that belongs to another existing event.*/ +// const val THREAD = "m.thread" // m.thread is not yet released in the backend + const val THREAD = "io.element.thread" // io.element.thread will be replaced by m.thread when it is released + /** Lets you define an event which adds a response to an existing event.*/ const val RESPONSE = "org.matrix.response" } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index e9f992f295..2744b5129e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -619,7 +619,7 @@ internal class DefaultTimeline( it?.root }.map { EventMapper.map(it) - }.toList() + } threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(eventEntityList) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt index 6579126140..281b2c1761 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -22,6 +22,7 @@ import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.RelationType import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageFormat @@ -247,7 +248,7 @@ internal class ThreadsAwarenessHandler @Inject constructor( * @param event */ private fun isThreadEvent(event: Event): Boolean = - event.content.toModel()?.relatesTo?.type == "io.element.thread" + event.content.toModel()?.relatesTo?.type == RelationType.THREAD /** * Returns the root thread eventId or null otherwise From b7d040be9ff40b59262e9b76edeb4071244845e7 Mon Sep 17 00:00:00 2001 From: Zet Date: Fri, 5 Nov 2021 10:39:22 +0000 Subject: [PATCH 007/319] Translated using Weblate (Arabic) Currently translated at 39.8% (1066 of 2675 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 | 142 +++++++++++++--------- 1 file changed, 83 insertions(+), 59 deletions(-) diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml index 49d98fabb2..cc7ce149dc 100644 --- a/vector/src/main/res/values-ar/strings.xml +++ b/vector/src/main/res/values-ar/strings.xml @@ -8,27 +8,27 @@ غادرَ ⁨%1$s⁩ الغرفة رفضَ ⁨%1$s⁩ الدعوة طردَ ⁨%1$s⁩ ⁨%2$s⁩ - رفعَ ⁨%1$s⁩ المنع عن ⁨%2$s⁩ - منعَ ⁨%1$s⁩ ⁨%2$s⁩ + رفعَ ⁨%1$s⁩ الحظر عن ⁨%2$s⁩ + حظرَ ⁨%1$s⁩ ⁨%2$s⁩ غيّر ⁨%1$s⁩ صورته الشخصية - غيّر %1$s اسمه الظاهر من %2$s إلى %3$s - أزال %1$s اسمه الظاهر (كان %2$s) + غيّر %1$s اسمه العلنيّ من %2$s إلى %3$s + أزال %1$s اسمه العلنيّ(كان %2$s) غيّر %1$s الموضوع إلى: %2$s - إنَّ %1$s قد غيَّرَ اسم الغُرفة إلى: %2$s - إنَّ %s قد أجابَ على المُكالمة. - إنَّ %s قد أنهى المُكالمة. - إنَّ %1$s قد جعلَ التأريخ المُستقبلي للغُرفة مرئيًا لـ %2$s + غيّر %1$s اسم الغُرفة إلى: %2$s + أجابَ %s على المُكالمة. + أنهى %s المُكالمة. + جعلَ %1$s التأريخ المُستقبلي للغُرفة مرئيًا لـ %2$s جميع أعضاء الغُرفة، مِنَ اللَّحظة التي تمَّت دعوتهم. - جميع أعضاء الغُرفة، مِن لحظة انضمامهم. + جميع أعضاء الغُرفة، مِن لحظة إنضمامهم. جميع أعضاء الغُرفة. أيُّ شخص. - غير معروف (%s). - إنَّ %1$s قد فعَّلَ تعمية النهاية-إلى-النهاية (%2$s) - إنَّ %1$s قد طلبَ اجتماع VoIP - إنَّ اجتماع VoIP قد بدأ - إنَّ اجتماع VoIP قد انتهى - إنَّ %1$s قد أزالَ اسم الغُرفة - إنَّ %1$s قد أزالَ موضوع الغُرفة + مجهول (%s). + فعَّلَ %1$s تشفير طرف لطرف (%2$s) + طلبَ %1$s اجتماع VoIP + بدأ اجتماع VoIP + انتهى اجتماع VoIP + أزالَ %1$s اسم الغُرفة + أزالَ %1$s موضوع الغُرفة إنَّ %1$s قد حدَّثَ ملفه الشخصي %2$s إنَّ %1$s قد أرسلَ دعوة إلى %2$s للإنضمام إلى الغُرفة ** يتعذَّر فك تعمية: ⁨%s⁩ ** @@ -42,12 +42,12 @@ رقم الهاتف ‏‏⁨%1$s⁩: ‏⁨%2$s⁩ سحبَ ⁨%1$s⁩ الدعوة الموجّهة إلى ⁨%2$s - إنَّ %s قد أجرى مُكالمة مرئية. - إنَّ %s قد أجرى مُكالمة صوتية. + أجرى %s مُكالمة مرئية. + أجرى %s مُكالمة صوتية. إنَّ %1$s قد قَبَل دعوة %2$s يتعذَّر التنقيح أرسلَ ⁨%1$s⁩ ملصقًا. - (تمَّ تغيِّير الصُّورة أيضًا) + (غُيرت الصُّورة أيضًا) دَعوة مِن ⁨%s⁩ غُرفة فارِغة %1$s وَ %2$s @@ -70,30 +70,30 @@ غادرتَ الغرفة رفضتَ الدعوة طردتَ ⁨%1$s⁩ - رفعتَ المنع عن ⁨%1$s⁩ - منعتَ ⁨%1$s⁩ + رفعتَ الحظر عن ⁨%1$s⁩ + حظرتَ ⁨%1$s⁩ سحبتَ الدعوة الموجّهة إلى ⁨%1$s⁩ غيّرتَ صورتك الشخصية - عيَّنتَ اسمك الظاهر إلى %1$s - غيّرتَ اسمك الظاهر من ⁨%1$s⁩ إلى ⁨%2$s⁩ - أزلتَ اسمك الظاهر (كان ⁨%1$s⁩) + عيَّنتَ اسمك العلنيّ إلى %1$s + غيّرتَ اسمك العلنيّ من ⁨%1$s⁩ إلى ⁨%2$s⁩ + أزلتَ اسمك العلنيّ (كان ⁨%1$s⁩) غيَّرتَ الموضوع إلى: ⁨%1$s⁩ - إنَّ %1$s قد غيَّرَ صورة الغُرفة - أنتَ قد غيَّرتَ صورة الغُرفة - أنتَ قد غيَّرتَ اسم الغُرفة إلى: %1$s - أنتَ قد أجريتَ مُكالمة مرئية. - أنتَ قد أجريتَ مُكالمة صوتية. - إنَّ %s قد أرسلَ بيانات لإعداد مُكالمة. - أنتَ قد أرسلتَ بيانات لإعداد مُكالمة. - أنتَ قد أجبتَ على المُكالمة. - أنتَ قد أنهيتَ المُكالمة. - أنتَ قد جعلتَ التأريخ المُستقبلي للغُرفة مرئيًا لـ %1$s - أنتَ قد فعَّلتَ تعيمية النهاية-إلى-النهاية (%1$s) - إنَّ %s قد قامَ بترقية هذه الغرفة. - أنتَ قد رقَّيتَ هذه الغرفة. - أنتَ قد طلبتَ اجتماع VoIP - أنتَ قد أزلتَ اسم الغُرفة - أنتَ قد أزلتَ موضوع الغُرفة + غيَّرَ %1$s صورة الغُرفة + غيَّرتَ صورة الغُرفة + غيَّرتَ اسم الغُرفة إلى: %1$s + جريتَ مُكالمة مرئية. + أجريتَ مُكالمة صوتية. + أرسلَ %s بيانات لإعداد مُكالمة. + أرسلتَ بيانات لإعداد مُكالمة. + أجبتَ على المُكالمة. + أنهيتَ المُكالمة. + جعلتَ التأريخ المُستقبلي للغُرفة مرئيًا لـ %1$s + فعَّلتَ تشفير طرف لطرف (%1$s) + رقّى %s هذه الغرفة. + رقَّيتَ هذه الغرفة. + طلبتَ اجتماع VoIP + أزلتَ اسم الغُرفة + أزلتَ موضوع الغُرفة إنَّ %1$s قد أزالَ صورة الغُرفة أنتَ قد أزلتَ صورة الغُرفة تمَّت إزالة الرسالة @@ -118,7 +118,7 @@ إنَّ %1$s قد غيَّرَ مُستوى قوة %2$s. %1$s مِن %2$s إلى %3$s المُزامنة الأولية: -\nيجري إستيرد الحِساب… +\nيستورد الحِساب… 🎉 جميع الخوادِم محظورة مِنَ المُشاركة! لم يعُد من المُمكِن استخدام هذه الغُرفة. لا تغيير. • خوادِم مُطابقة IP الحرفية محظورة الآن. @@ -127,18 +127,18 @@ • الخوادِم المُطابقة لـ %s أُزيلت مِن قائمة الحظر. • الخوادِم المُطابقة لـ %s محظورة الآن. • خوادِم مُطابقة IP الحرفية مسموحة الآن. - أنتَ قد غيَّرتَ خادِم الـACLs لهذه الغُرفة. - إنَّ %s قد غيَّرَ خادِم الـACLs لهذه الغُرفة. - • الخوادِم تحظُر مُطابقة القيم الحرفية للـIP. + يَّرتَ خادِم الـACLs لهذه الغُرفة. + غيَّرَ %s خادِم الـACLs لهذه الغُرفة. + • الخوادِم المطابقة للقيم الحرفية للـIP محظورة. • الخوادِم المُطابقة لـ %s مسموحة. • الخوادِم المُطابقة لـ %s محظورة. - • الخوادِم تسمح بمُطابقة القيم الحرفية للـIP. - أنتَ قد عيَّنتَ خادِم الـACLs لهذه الغُرفة. - إنَّ %s قد عيَّنَ خادِم الـACLs لهذه الغُرفة. - أنتَ قد قمتَ بالترقية هُنا. - إنَّ %s قد قامَ بالترقية هُنا. - أنتَ قد جعلتَ الرسائل المُستقبلية مرئية لـ %1$s - إنَّ %1$s قد جعلَ الرسائل المُستقبلية مرئية لـ %2$s + • الخوادِم المطابقة للقيم الحرفية للـIP مسموحة. + عيَّنتَ خادِم الـACLs لهذه الغُرفة. + عيَّنَ %s خادِم الـACLs لهذه الغُرفة. + رقيتَ هُنا. + رقّى %s هُنا. + جعلتَ الرسائل المُستقبلية مرئية لـ %1$s + جعلَ %1$s الرسائل المُستقبلية مرئية لـ %2$s غادرتَ الغرفة غادرَ ⁨%1$s⁩ الغرفة انضممت @@ -177,17 +177,18 @@ محو قائمة انتظار الإرسال يجري إرسال الرِّسالة… المُزامنة الأولية: -\nيجري إستيرد مَعلومات الحِساب +\nيستورد بيانات الحِساب المُزامنة الأولية: -\nيجري إستيرد المُجتمعات +\nيستورد المُجتمعات المُزامنة الأولية: -\nيجري إستيرد الغُرف المُغادَر مِنها +\nيستورد الغُرف المُغادَر مِنها المُزامنة الأولية: -\nيجري إستيرد الغُرف المَدعو إليها +\nيستورد الغُرف المَدعو إليها المُزامنة الأولية: -\nيجري إستيرد الغُرف المُنضم فيها +\nيستورد المحادثات +\nهذا قد يستغرق بعض الوقت حسب عدد الغرف المنضم إليها المُزامنة الأولية: -\nيجري إستيرد الغُرف +\nيستورد الغُرف المُزامنة الأولية: \nيجري إستيرد التَعمية غُرفة فارِغة (كانت %s) @@ -1132,10 +1133,10 @@ غير %1$s عنوان الغرفة الى %2$s. أُرسلت الرسالة المزامنة الأولية: -\nينزل البيانات… +\nينزّل البيانات… المزامنة الأولية: \nينتظر رد الخادم… - غير %1$s اسمه الى %2$s + غير %1$s اسمه العلنيّ الى %2$s %1$s أضاف %2$s كعنوان لهذه الغرفة. %1$s أضاف %2$s كعنوان لهذه الغرفة. @@ -1336,4 +1337,27 @@ %1$s فعّل تشفير طرف لطرف (لم يُتعرف على خوارزمية %2$s). عطلتّ تشفير طرف لطرف. %1$s فعّل تشفير طرف لطرف. + غيّر الموضوع + عدّل الأذونات + غيّر اسم الفضاء + غيّر اسم الغرفة + فعّل تشفير الفضاء + غيّر العنوان الرئيسي للفضاء + غيّر العنوان الرئيسي للغرفة + غيّر الصورة الرمزية للفضاء + غيّر الصورة الرمزية للغرفة + عدّل الودجات + نبّه الكل + أزل رسائل الآخرين + احظر مستخدمين + أطرد مستخدمين + غيّر الإعدادات + أدعوا مستخدمين + أرسل رسائل + فعّل تشفير الغرفة + أُستعيد النسخ الاحتياطي %s ! + رجاءً أدخل مفتاح الاستعادة + فك قفل التأريخ + يستورد المفاتيح… + ينزّل المفاتيح… \ No newline at end of file From f17f4e123f4d3985d28b3d4ce469f575d533e2d9 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 5 Nov 2021 18:50:57 +0000 Subject: [PATCH 008/319] Translated using Weblate (Czech) Currently translated at 100.0% (2675 of 2675 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 | 26 +++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index b509b3a9e8..b33f15ba2e 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -69,7 +69,8 @@ Úvodní synchronizace: \nImportuji místnosti Úvodní synchronizace: -\nImportuji místností, jichž jste členy +\nNačítání konverzací +\nPokud jste se připojili k mnoha místnostem, může to chvíli trvat Úvodní synchronizace: \nImportuji místnost, jež jste opustili Úvodní synchronizace: @@ -78,7 +79,7 @@ \nImportuji data účtu Odesílám zprávu… Úvodní synchronizace: -\nImportuji pozvání +\nImportuji pozvánky do místností Vymazat frontu neodeslaných zpráv %1$s pozvali %2$s. Důvod: %3$s %1$s vás pozvali. Důvod: %2$s @@ -1623,7 +1624,7 @@ Ukázat historii úprav Všeobecné podmínky Pročíst všeobecné podmínky - Nechte se nalézt druhými + Nechte se najít druhými Použijte boty, můstky, widgety a nálepkové sady Čtěte na Server pro identity @@ -1631,11 +1632,11 @@ Nastavit server pro identity Změnit server pro identity Nyní používáte %1$s, abyste nalezli a byli nalezeni existujícími kontakty, které znáte. - Nyní nepoužíváte server pro identity. Abyste existující známé kontakty nalezli a nechali se jimi nalézt, nastavte nějaký níže. + Nyní nepoužíváte server pro identity. Abyste známé kontakty našli a nechali se jimi najít, nastavte nějaký níže. Emailová adresa k nalezení Volby pro nalezení se ukážou, jakmile doplníte email. Volby pro nalezení se ukážou, jakmile doplníte telefonní číslo. - Odpojení od serveru identit bude znamenat, že Vás jiní uživatelé nebudou moci nalézt a Vy nebudete moci pozvat druhé pomocí emailu nebo telefonního čísla. + Odpojení od serveru identit bude znamenat, že Vás jiní uživatelé nebudou moci najít a Vy nebudete moci pozvat druhé pomocí emailu nebo telefonního čísla. Telefonní čísla pro nalezení Poslali jsme Vám potvrzovací email na %s, podívejte se do emailu a klikněte na protvrzovací odkaz Nevyřízený @@ -2570,7 +2571,7 @@ Zveřejnit tuto adresu Přidat lokální adresu Tato místnost nemá žádné lokální adresy - Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost nalézt přes Váš domovský server (%1$s) + Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost najít přes Váš domovský server (%1$s) Lokální adresa Nová zveřejněná adresa (např. #alias:server) Zatím žádné zveřejněné adresy. @@ -2791,11 +2792,11 @@ Vstoupit do prostoru s daným id Založit prostor Hledat jméno - Kdokoli v prostoru s touto místností ji může nalézt a vstoupit. Jen správci místnosti ji mohou připojit k prostoru. + Kdokoli v prostoru s touto místností ji může najít a vstoupit do ní. Do prostoru ji mohou připojit jen správci místnosti. Pouze členové prostoru - Kdokoli může místnost nalézt a vstoupit - Veřejná - Pouze pozvaní mohou místnost nalézt a vstoupit + Kdokoliv může místnost najít a připojit se do ní + Veřejný + Pouze pozvaní mohou místnost najít a vstoupit do ní Privátní Neznámé nastavení přístupu (%s) Každý může na místnost zaklepat, členové pak mohou přijmout či odmítnout @@ -2930,7 +2931,7 @@ Prostory, které mají přístup Umožněte členům prostoru ho najít a zpřístupnit. Členové prostoru %s mohou vyhledávat, prohlížet a připojovat se. - Soukromé (pouze pro pozvané) + Soukromý (pouze pro pozvané) Chcete-li odesílat hlasové zprávy, povolte oprávnění mikrofonu. Aktualizace místnosti Zprávy od bota @@ -3061,4 +3062,7 @@ Nedostupný Offline Online + Naslouchání oznámením + Vyberte domovský server + Nelze se spojit s domovským serverem na adrese %s. Zkontrolujte prosím svůj odkaz nebo vyberte domovský server ručně. \ No newline at end of file From 2c5fe79596c2cf1f78c1d7536922dbf35298f9b9 Mon Sep 17 00:00:00 2001 From: Ultimator14 Date: Sat, 6 Nov 2021 11:02:31 +0000 Subject: [PATCH 009/319] Translated using Weblate (German) Currently translated at 98.3% (2632 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- vector/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 4312898f17..db652492e4 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1949,8 +1949,8 @@ Raum verlassen Verlasse den Raum… Administratoren - Moderierende - benutzerdefiniert + Moderatoren + Benutzerdefiniert Eingeladen Nutzer Admin in %1$s From 2306ac60cbd46eb3980c4a0701166667f960d529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 4 Nov 2021 15:47:30 +0000 Subject: [PATCH 010/319] Translated using Weblate (Estonian) Currently translated at 100.0% (2675 of 2675 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 | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 2585eaa15a..a74165ac95 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -61,21 +61,22 @@ %1$s ja %2$d muud Tühi jututuba - Alglaadimine: + Esmane laadimine: \nImpordin kontot… - Alglaadimine: + Esmane laadimine: \nImpordin krüptoseadistusi - Alglaadimine: + Esmane laadimine: \nImpordin jututubasid - Alglaadimine: -\nImpordin liitutud jututubasid - Alglaadimine: + Esmane laadimine: +\nLaadin sinu vestluste ja jtututubade andmeid +\nKui sa oled liitunud paljude jututubadega, siis kulub natuke aega + Esmane laadimine: \nImpordin kutsutud jututubasid - Alglaadimine: + Esmane laadimine: \nImpordin lahkutud jututubasid - Alglaadimine: + Esmane laadimine: \nImpordin kogukondi - Alglaadimine: + Esmane laadimine: \nImpordin kontoandmeid Saadan sõnumit… Tühjenda saatmisjärjekord @@ -3005,4 +3006,7 @@ Pole leitav Võrgust väljas Võrgus + Vali koduserver + Ei õnnestu ühendus koduserveriga aadressil %s. Palun kontrolli kas link on õige või lisa koduserver käsitsi. + Vaatan, kas leidub teavitusi \ No newline at end of file From b6b5e528f519d9e5f659868edfc0c00c5e313e05 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 4 Nov 2021 16:51:04 +0000 Subject: [PATCH 011/319] Translated using Weblate (Persian) Currently translated at 100.0% (2675 of 2675 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 | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index c2b55bb06c..f99084811e 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -62,21 +62,22 @@ اتاق خالی همگام‌سازی نخستین: -\nدر حال درون‌ریزی حساب… +\nدرون‌ریزی حساب… همگام‌سازی نخستین: -\nدر حال درون‌ریزی رمزنگاری +\nدرون‌ریزی رمزنگاری همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌ها +\nدرون‌ریزی اتاق‌ها همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های پیوسته +\nبار کردن گفت‌وگوهایتان +\nاگر به اتاق‌های زیادی پیوسته‌اید، ممکن است کمی طول بکشد همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های دعوت‌شده +\nدرون‌ریزی اتاق‌های دعوت‌شده همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های ترک‌شده +\nدرون‌ریزی اتاق‌های ترک شده همگام‌سازی نخستین: -\nدر حال درون‌ریزی انجمن‌ها +\nدرون‌ریزی اجتماع‌ها همگام‌سازی نخستین: -\nدر حال درون‌ریزی داده‌های حساب +\nدرون‌ریزی داده‌های حساب در حال فرستادن پیام… پاک‌سازی صفِ در حال ارسال دعوت %1$s. دلیل: %2$s @@ -2633,7 +2634,7 @@ %1$s یک نشانی جایگزین %2$s را برای این اتاق اضافه کرد. %1$s نشانی‌های جایگزین %2$s را برای این اتاق اضافه کرد. - همگام‌سازی اولیه: + همگام‌سازی نخستین: \nبارگیری داده‌ها… همگام‌سازی نخستین: \nمنتظر پاسخ کارساز… @@ -3005,4 +3006,7 @@ ناموجود برون‌خط برخط + گزینش کارساز خانگی + نتوانست در نشانی %s به کارساز خاتگی‌ای برسد. لطفاً پیوندتان را بررسی کرده یا کارساز خانگی‌ای را به صورت دستی برگزینید. + شنود کردن برای آگاهی‌ها \ No newline at end of file From 019ba178f56a88d80c4ec2dd194d22aa37633564 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 4 Nov 2021 21:20:48 +0000 Subject: [PATCH 012/319] Translated using Weblate (Hungarian) Currently translated at 100.0% (2675 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- vector/src/main/res/values-hu/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 1d9214f926..3c22d2b47f 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -68,7 +68,8 @@ Induló szinkronizáció: \nSzobák betöltése Induló szinkronizáció: -\nCsatlakozott szobák betöltése +\nBeszélgetések betöltése +\nHa sok szobában vagy jelen sokáig tarthat Induló szinkronizáció: \nMeghívott szobák betöltése Induló szinkronizáció: @@ -3010,4 +3011,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Elérhetetlen Kapcsolat nélkül Kapcsolódva + Matrix szerver kiválasztása + A matrix szervert nem sikerül elérni ezen az URL-en: %s. Ellenőrizd a kapcsolatodat vagy add meg a matrix szervert kézzel. + Értesítések figyelése \ No newline at end of file From 64e281ecc4c26f696399740dc6107329a7de59c1 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 5 Nov 2021 00:26:38 +0000 Subject: [PATCH 013/319] Translated using Weblate (Indonesian) Currently translated at 100.0% (2675 of 2675 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 | 50 ++++++++++++----------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index c087680eb4..d24990a2fa 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -403,7 +403,7 @@ Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yan Alasan laporan konten ini Apa Anda ingin menyembunyikan seluruh pesan dari pengguna ini\? \n -\nHarap diperhatikan bahwa tindakan ini akan me-restart aplikasi dan mungkin akan memakan waktu beberapa saat. +\nHarap diperhatikan bahwa tindakan ini akan memulai ulang aplikasi dan mungkin akan membutuhkan waktu beberapa saat. Batalkan Unggahan Batalkan Unduhan Cari @@ -764,7 +764,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kata sandi Anda telah diperbaharui Tunjukkan semua pesan dari %s\? \n -\nMohon perhatikan bahwa tindakan ini akan me-restart aplikasi dan mungkin akan memakan waktu. +\nMohon perhatikan bahwa tindakan ini akan me-restart aplikasi dan mungkin akan membutuhkan waktu. Apa benar Anda ingin menyingkirkan sasaran pemberitahuan ini? Apa benar Anda ingin menyingkirkan %1$s %2$s? Pilih negara @@ -1237,26 +1237,27 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Bersihkan antrian kiriman Mengirim pesan… Pesan terkirim - Sinkronisasi Awal: -\nMengimpor Data Akun - Sinkronisasi Awal: -\nMengimpor Komunitas + Sinkronisasi awal: +\nMengimpor data akun + Sinkronisasi awal: +\nMengimpor komunitas Sinkronisasi Awal: -\nMengimpor Ruangan yang Ditinggalkan - Sinkronisasi Awal: -\nMengimpor Ruangan yang Diundang - Sinkronisasi Awal: -\nMengimpor Ruangan Tergabung - Sinkronisasi Awal: -\nMengimpor Ruangan +\nMengimpor ruangan yang ditinggalkan + Sinkronisasi awal: +\nMengimpor ruangan yang diundang + Sinkronisasi awal: +\nMemuat obrolan Anda +\nJika Anda telah bergabung dengan banyak ruangan, ini mungkin membutuhkan waktu yang cukup lama + Sinkronisasi awal: +\nMengimpor ruangan Sinkronisasi awal: -\nMengimpor crypto +\nMengimpor kripto %1$s mengubah tingkat daya %2$s. - Sinkronisasi Awal: + Sinkronisasi awal: \nMengimpor akun… - Sinkronisasi Awal: + Sinkronisasi awal: \nMengunduh data… - Sinkronisasi Awal: + Sinkronisasi awal: \nMenunggu respons server… Ruangan kosong (tadi adalah %s) @@ -1872,7 +1873,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Semua kunci tercadangkan Siapkan Cadangan Aman - Mencadangkan kunci Anda. Ini mungkin memakan beberapa menit… + Mencadangkan kunci Anda. Ini mungkin membutuhkan beberapa menit… Kelola di Cadangan Kunci Kunci pesan aman baru Cadangan Kunci Baru @@ -1929,11 +1930,11 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Mengambil versi cadangan… Anda mungkin kehilangan akses ke pesan Anda jika Anda keluar atau kehilangan perangkat ini. Yakin\? - Kunci enkripsi Anda sekarang sedang dicadangkan di latar belakang ke homeserver Anda. Pencadangan awal dapat memakan waktu beberapa menit. + Kunci enkripsi Anda sekarang sedang dicadangkan di latar belakang ke homeserver Anda. Pencadangan awal dapat membutuhkan waktu beberapa menit. Pencadangan Dimulai Kesalahan tidak terduga Kunci Pemulihan - Membuat Kunci Pemulihan menggunakan frasa sandi, proses ini bisa memakan beberapa detik. + Membuat Kunci Pemulihan menggunakan frasa sandi, proses ini bisa membutuhkan beberapa detik. Bagikan kunci pemulihan ke… Mohon membuat salinan Berhenti @@ -2354,7 +2355,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tingkatkan ruangan publik Peningkatan dibutuhkan Tingkatkan - Mohon sabar, ini mungkin memakan waktu yang lama. + Mohon sabar, ini mungkin membutuhkan waktu yang lama. Bergabung ke ruangan yang diganti Saat ini orang-orang mungkin tidak dapat bergabung ke ruangan privat yang Anda buat. \n @@ -2571,7 +2572,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda tidak dapat mengakses pesan ini karena Anda telah diblokir oleh pengirim Karena enkripsi ujung-ke-ujung, Anda mungkin harus menunggu untuk pesan dari seseorang untuk datang karena kunci enkripsinya tidak dikirim secara benar ke Anda. Tidak Dapat Mendekripsi - Menunggu untuk pesan ini, mungkin memakan beberapa waktu + Menunggu untuk pesan ini, mungkin membutuhkan beberapa waktu Anda tidak dapat mengakses pesan ini Atur avatar Anda berhasil mengubah pengaturan ruangan @@ -2767,7 +2768,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda telah selesai! Kunci pemulihan Anda Mengatur pemulihan. - Ini mungkin memakan beberapa detik, mohon sabar. + Ini mungkin membutuhkan beberapa detik, mohon sabar. Masukkan frasa keamanan yang Anda tahu, digunakan untuk mengamankan rahasia di server Anda. Jangan menggunakan kata sandi Akun Anda. Masukkan %s Anda lagi untuk mengkonfirmasinya. @@ -2953,4 +2954,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tidak Tersedia Offline Online + Pilih homeserver + Tidak dapat menjangkau homeserver di URL %s. Silakan periksa tautan Anda atau pilih sebuah homeserver secara manual. + Mendengarkan notifikasi \ No newline at end of file From 0cbe8990078a4694ddfe28f6d72617e6db23e75d Mon Sep 17 00:00:00 2001 From: random Date: Fri, 5 Nov 2021 16:32:55 +0000 Subject: [PATCH 014/319] Translated using Weblate (Italian) Currently translated at 99.8% (2672 of 2675 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 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 663e186ddf..ca3b1dd19e 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -69,13 +69,14 @@ Sincronizzazione iniziale: \nImportazione stanze Sincronizzazione iniziale: -\nImportazione stanze partecipate +\nCaricamento delle conversazioni +\nSe sei dentro a molte stanze, potrebbe volerci un po\' Sincronizzazione iniziale: \nImportazione stanze con invito Sincronizzazione iniziale: -\nImportazione stanze lasciate +\nImportazione stanze abbandonate Sincronizzazione iniziale: -\nImportazione comunità +\nImportazione delle comunità Sincronizzazione iniziale: \nImportazione dati account %s ha aggiornato questa stanza. @@ -3058,4 +3059,7 @@ Non disponibile Offline Online + Scegli homeserver + Impossibile raggiungere un homeserver all\'URL %s. Controlla il link o scegli manualmente un homeserver. + Ascolto di notifiche \ No newline at end of file From 0e10793e591ca764b4ffa7ccc584eb01fc7314d7 Mon Sep 17 00:00:00 2001 From: Adam Tomaja Date: Thu, 4 Nov 2021 15:49:50 +0000 Subject: [PATCH 015/319] Translated using Weblate (Polish) Currently translated at 89.8% (2403 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 409 +++++++++++++++++++++- 1 file changed, 394 insertions(+), 15 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index d1428300e8..51894e9337 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -64,21 +64,22 @@ Wiadomość usunięta [powód: %1$s] Wiadomość usunięta przez %1$s [powód: %2$s] %s zakutalizował(a) ten pokój. - Synchronizacja początkowa: + Wstępna synchronizacja: \nImportowanie konta… - Synchronizacja początkowa: + Wstępna synchronizacja: \nImportowanie kryptografii - Synchronizacja początkowa: -\nImportowanie Pokoi - Synchronizacja początkowa: -\nImportowanie dołączonych Pokoi - Synchronizacja początkowa: -\nImportowanie zaproszonych Pokoi - Synchronizacja początkowa: -\nImportowanie opuszczonych Pokoi - Synchronizacja początkowa: -\nImportowanie Społeczności - Synchronizacja początkowa: + Wstępna synchronizacja: +\nImportowanie pokoi + Wstępna synchronizacja: +\nImportowanie Twoich konwersacji +\nJeśli dołączyłeś(aś) do wielu pokoi, może to zająć dłuższą chwilę + Wstępna synchronizacja: +\nImportowanie zaproszonych pokoi + Wstępna synchronizacja: +\nImportowanie opuszczonych pokoi + Wstępna synchronizacja: +\nImportowanie grup + Wstępna synchronizacja: \nImportowanie danych Konta Wysyłanie wiadomości… Wyczyść kolejkę wysyłania @@ -278,7 +279,7 @@ Przyznaj dostęp w następnym oknie. Dołącz Podgląd Odrzuć - Przejdź do pierwszej nieprzeczytanej wiadomości. + Przejdź do pierwszej nieprzeczytanej wiadomości Zostałeś(-aś) zaproszony(-a) do tego pokoju przez %s Próbujesz uzyskać dostęp do %s. Czy chcesz dołączyć do pokoju, aby wziąć udział w dyskusji? pokój @@ -796,7 +797,7 @@ Czy chcesz dodać teraz kilka? Brakujące user_id w żądaniu. Brakuje wymaganego parametru. Parametr jest niepoprawny. - Dodaj aplikacje Matrix + Zarządzaj integracjami Wyślij wiadomości głosowe Dodałeś(-aś) nową sesję \'%s\', która żąda kluczy szyfrujących. Twoje niezweryfikowana sesja \'%s\' żąda kluczy szyfrujących. @@ -2430,4 +2431,382 @@ Spróbuj uruchomić ponownie aplikację. Twoje zaproszenie Wysłałeś naklejkę. Wysłałeś zdjęcie. + Członkowie przestrzeni %s mogą znaleźć, podejrzeć i dołączyć. + Każdy w Przestrzeni z tym pokojem może go znaleźć i dołączyć. Tylko administratorzy mogą dodać go do przestrzeni. + Tylko członkowie Przestrzeni + Każdy może znaleźć Przestrzeń i do niej dołączyć + Każdy może znaleźć pokój i dołączyć + Publiczny + Tyko zaproszeni ludzie mogą znaleźć i dołączyć + Prywatny (Tylko z zaproszeniem) + Prywatny + Nieznane ustawienie dostępu (%s) + Każdy może zapukać do pokoju, członkowie mogą akceptować lub odrzucić + Przeglądaj i zarządzaj adresami tej Przestrzeni. + Adresy Przestrzeni + Zezwalaj gościom na dołączanie + Dostęp do Przestrzeni + Kto powinien mieć dostęp \? + Ustawienia konta + Możesz zarządzać notyfikacjami w %1$s. + Proszę zwrócić uwagę, że notyfikacje o wzmiankach i słowach kluczowych nie są dostępne w zaszyfrowanych pokojach na urządzeniach mobilnych. + Powiadamiaj mnie o + Zresetuj bezpieczną kopię zapasową + Skonfiguruj bezpieczną kopię zapasową + Bezpieczna kopia zapasowa + Dodaj przycisk otwierania klawiatury emoji w edytorze wiadomości + Pokaż klawiaturę emoji + Użyj komendy /confetti lub wyślij wiadomość zawierająca ❄️ lub 🎉 + Pokaż efekty chatu + Nie będziesz dostawać powiadomień od wzmianek i słów kluczowych, w zaszyfrowanym pokoju na urządzeniu mobilnym. + Wyświetlanie powiadomień + Aktywuj powiadomienia email dla %s + Powiadomienie email + Żadne + Tylko wzmianki i słowa kluczowe + Oczekiwanie na notyfikacje + %1$s zmienił(a) adresy tego pokoju. + Zmieniłeś(aś) głowny i alternatywny adres tego pokoju. + %1$s zmienił(a) główny i alternatywny adres tego pokoju. + Zmieniłeś alternatywny adres tego pokoju. + + Usunąłeś(aś) alternatywny adres %1$s dla tego pokoju. + Usunąłeś(aś) alternatywne adresy %1$s dla tego pokoju. + + + + %1$s ustawił(a) główny adres tego pokoju na %2$s. + + %1$s dodał(a) %2$s jako adres tego pokoju. + %1$s dodał(a) %2$s jako adresów tego pokoju. + %1$s dodał(a) %2$s adresów tego pokoju. + %1$s dodał(a) %2$s adresów tego pokoju. + + Zaakceptowałeś zaproszenie dla %1$s. Powód: %2$s + Dołączyłeś. Powód: %1$s + %1$s dołączył(a). Powód: %2$s + Dołączyłeś do pokoju. Powód: %1$s + %1$s dołączył do pokoju. Powód: %2$s + %1$s zaprosił Cię. Powód: %2$s + Zaprosiłeś %1$s. Powód: %2$s + %1$s zaprosił(a) %2$s. Powód: %3$s + Twoje zaproszenie. Powód: %1$s + Zaproszenie %1$s. Powód: %2$s + %1$s z %2$s na %3$s + %1$s zmienił(a) poziom mocy na %2$s. + Zmieniłeś poziom mocy na %1$s. + • Serwery z pasującymi literałami IP są teraz zablokowane. + • Serwery z pasującymi literałami IP są teraz dozwolone. + • Serwery pasujące do %s zostały usunięte z listy dozwolonych. + • Serwery pasujące do %s są teraz dozwolone. + • Serwery pasujące do %s zostały usunięte z listy zablokowanych. + • Serwery pasujące do %s są teraz zablokowane. + %1$s, %2$s i %3$s + %s w Ustawieniach, aby otrzymywać zaproszenia bezpośrednio w Elememencie. + Zmiana tematu + Aktualizacja Przestrzeni + Aktualizacja pokoju + Wysyłanie zdarzeń m.room.server_acl + Zmiana uprawnień + Zmiana nazwy Przestrzeni + Zmiana nazwy pokoju + Zmiana widoczności historii + Włączanie szyfrowania przestrzeni + Włączanie szyfrowania pokoju + Zmiana głównego adresu Przestrzeni + Zmiana głównego adresu pokoju + Zmiana awatara Przestrzeni + Zmiana awatara pokoju + Modyfikowanie widgetów + Powiadamianie wszystkich + Usuwanie wiadomości wysłanych przez inne osoby + Blokowanie użytkowników + Wyrzucanie użytkowników + Zmiana ustawień + Zapraszanie użytkowników + Wysyłanie wiadomości + Rola domyślna + Nie masz uprawnień do modyfikowania roli wymaganych aby zmieniać poszczególne części tej przestrzeni + "Nie masz uprawnieni do modyfikowania roli wymaganych do zmiany poszczególnych części pokoju" + Przeglądaj i modyfikuj role wymagane do zmiany różnych części przestrzeni. + Wybierz role wymagane do zmieniania poszczególnych części pokoju + Wybierz role wymagane do zmiany poszczególnych części tej przestrzeni + Uprawnienia + Przeglądaj i modyfikuj role wymagane do zmiany różnych funkcji pokoju. + Uprawnienia Przestrzeni + Uprawnienia pokoju + Odblokowanie użytkownika pozwoli mu na ponowne dołączenie do tej przestrzeni. + Blokowanie użytkowników wyrzuci ich z tej przestrzeni i uniemożliwi im dołączenie ponownie. + Ten pokój jest prywatny. Nie będziesz w stanie dołączyć bez zaproszenia. + Kontynuuj mimo wszystko + Zakańczanie połączenia… + Brak odpowiedzi + Użytkownik, do którego dzwoniłeś, jest teraz zajęty. + Użytkownik zajęty + Zawiesiłeś(aś) połączenie + %s zawiesił(a) połączenie + Zawieś + Wznów + Wróć do połączenia + Połączenie głosowe z %s + Połączenie wideo z %s + + Nieodebrane połączenie wideo + %d nieodebrane połączenia wideo + %d nieodebranych połączeń wideo + %d nieodebranych połączeń wideo + + + Nie odebrane połączenie głosowe + %d nie odebrane połączenia głosowe + %d nie odebranych połączeń głosowych + %d nie odebranych połączeń głosowych + + Połączenie przychodzące… + Błąd autoryzacji, niepoprawne dane logowania + Wybierz serwer domowy + Nie można było połączyć się z serwerem domowym %s. Proszę sprawdzić link lub wybrać serwer domowy manualnie. + Używaj jako domyślne i nie pytaj ponownie + Zawsze pytaj + Adres URL serwera domowego + Wyślij historię żądań udostępnienia klucza + Przestrzenie + Zaproszenia + Katalog pokoi + Sugerowane pokoje + Nowa wartość + Wróć + Przełącz + Brak uprawnień + Proszę nadać uprawnienia do mikrofonu, aby nagrywać wiadomości głosowe. + Aby wykonać tą akcję, proszę nadać uprawnienia do aparatu z poziomu ustawień systemowych. + Brakuje uprawnień do wykonania tej akcji, proszę je przydzielić z poziomu ustawień systemowych. + Przestrzenie + Dowiedz się więcej + Domyślny systemu + Włączyłeś(aś) szyfrowanie end-to-end (nierozpoznany algorytm %1$s). + %1$s włączył(a) szyfrowanie end-to-end (nierozpoznany algorytm: %2$s). + Włączyłeś(aś) szyfrowanie end-to-end. + %1$s włączył(a) szyfrowanie end-to-end. + Zabroniłeś(aś) gościom dołączać do pokoju. + %1$s zabronił(a) gościom dołączać do pokoju. + Zabroniłeś gościom dołączać do pokoju. + %1$s zabronił(a) gościom dołączać do pokoju. + Zezwoliłeś gościom na dołączanie tutaj. + + %1$s usunął(ęła) alternatywny adres %2$s dla tego pokoju. + %1$s usunął(ęła) alternatywne adresy %2$s dla tego pokoju. + %1$s usunął(ęła) alternatywne adresy %2$s dla tego pokoju. + %1$s usunął(ęła) alternatywne adresy %2$s dla tego pokoju. + + + Dodałeś(aś) alternatywny adres %1$s dla tego pokoju. + Dodałeś(aś) alternatywne adresy %1$s dla tego pokoju. + Dodałeś(aś) alternatywne adresy %1$s dla tego pokoju. + Dodałeś(aś) alternatywne adresy %1$s dla tego pokoju. + + + %1$s dodał(a) alternatywny adres %2$s dla tego pokoju. + %1$s dodał(a) alternatywne adresy %2$s dla tego pokoju. + %1$s dodał(a) alternatywne adresy %2$s dla tego pokoju. + %1$s dodał(a) alternatywne adresy %2$s dla tego pokoju. + + Usunąłeś(aś) główny adres tego pokoju. + %1$s usunął(a) główny adres tego pokoju. + Ustawiłeś(aś) główny adres tego pokoju na %1$s. + Zmodyfikowałeś(aś) wideokonferencję + Wideokonferencja zmodyfikowana przez %1$s + Zakończyłeś wideokonferencję + Zmodyfikowałeś(aś) widget %1$s + %1$s zmodyfikował(a) widget %2$s + Usunąłeś(aś) widget %1$s + %1$s usunął(ęła) widget %2$s + Dodałeś widget %1$s + %1$s dodał(a) widżet %2$s + Zaakceptowałeś zaproszenie dla %1$s + Anulowałeś zaproszenie dla %1$s + %1$s anulował zaproszenie dla %2$s + Anulowałeś zaproszenie dla %1$s do dołączenia do pokoju + %1$s odwołał zaproszenie dla %2$s do dołączenia do pokoju + Pokaż przydatne informacje aby pomóc w naprawianiu aplikacji + Pokazuj informacje diagnostyczne na ekranie + Moja nazwa wyświetlana + Moja nazwa użytkownika + Wiadomości bezpośrednie + Wiadomości od bota + Zaproszenia do pokoju + Słowa kluczowe + \@pokój + Zaszyfrowane wiadomości grupowe + Wiadomości grupowe + Zaszyfrowane wiadomości bezposrednie + Słowa kluczowe nie mogą zawierać \'%s\' + Słowa kluczowe nie mogą zaczynać się od \'.\' + Dodaj nowe słowo kluczowe + Twoje słowa kluczowe + Powiadamiaj mnie o + Inne + Wzmianki i słowa kluczowe + Domyślne powiadomienia + Aby otrzymywać emaile z notyfikacjami, proszę przypisać email do swojego konta Matrix + Wiadomość głosowa (%1$s) + Nie można odpowiadać lub edytować kiedy wiadomość głosowa jest aktywna + Nie udało się nagrać wiadomości głosowej + Nie można odtworzyć tej wiadomości głosowej + Włącz wiadomość głosową + Naciśnij na swoje nagranie aby zatrzymać lub przesłuchać + zostało %1$ds + Przytrzymaj aby nagrać, puść by wysłać + Przeciągnij aby anulować + Nagraj wiadomość głosową + Rozmowa grupowa rozpoczęta + Przepraszamy, wystąpił błąd podczas dołączania do: %s + Wymagana aktualizacja + Aktualizacja + Prosimy o cierpliwość, to może zając chwilę. + Pokój bez nazwy + Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia. + Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia. +\nNie masz uprawnień aby dodawać pokoje. + W tej Przestrzeni nie ma żadnych pokoi + Proszę skontaktować się z administratorem Twojego serwera domowego aby uzyskać więcej informacji + Wygląda na to, że Twój serwer domowy jeszcze nie obsługuje Przestrzeni + Lubisz eksperymentować\? +\nMożesz dodać istniejącą Przestrzeń do innej Przestrzeni. + Wszystkie pokoje, w których jesteś będą pokazywane na ekranie domowym. + Pokaż wszystkie pokoje w ekranie domowym + Zarządzaj pokojami oraz przestrzeniami + Oznacz jako nie sugerowana + Oznacz jako sugerowana + Sugerowane + Ustaw tą Przestrzeń jako publiczną + Zarządzaj pokojami + Szukasz kogoś , kto nie jest w %s\? + %s Cię zaprasza + Ostrzeżenie! Wymaga wsparcia serwera oraz eksperymentalnej wersji pokoju + Przestrzeń eksperymentalna - Pokój ograniczony. + Zostałeś zaproszony + Przestrzenie są nową metodą na zarządzanie pokojami i osobami. + Witamy w Przestrzeniach! + Dodaj pokoje + Dodaj przestrzeń do jakiejkolwiek przestrzeni którą zarządzasz. + Dodaj istniejące przestrzenie + Dodaj istniejące pokoje + Dodaj istniejące pokoje i przestrzenie + Wybierz aby opuścić + Opuść wybrane pokoje i przestrzenie… + Nie opuszczaj żadnych pokoi i przestrzeni + Opuścisz wszystkie pokoje i przestrzenie w %s. + Opuść wszystkie pokoje i przestrzenie + Jesteś jedynym administratorem tej przestrzeni. Opuszczenie jej oznacza brak kontroli nad nią. + Nie będziesz w stanie ponownie dołączyć, do momentu kiedy nie zostaniesz ponownie zaproszony. + Jesteś jedyną osoba tutaj. Jeśli wyjdziesz, nikt nie będzie w stanie dołączyć w przyszłości, włączając Ciebie. + Czy jesteś pewny, że chcesz opuścić %s\? + Opuść przestrzeń + Dodawaj pokoje + Przeglądaj pokoje + Witaj w %1$s, %2$s. + Jeszcze nie jesteś w żadnym pokoju. Poniżej znajdują się proponowane, możesz też zobaczyć więcej naciskając zielony przycisk na dole po prawej. + Ukończ konfigurację + Zaproś przez email, znajdź kontakty i więcej… + Aktualnie nie używasz serwera tożsamości. Aby zapraszać znajomych i być dla nich widoczny, skonfiguruj go poniżej. + Ten alias na razie nie jest dostępny. +\nSpróbuj ponownie później lub zapytaj administratora tego pokoju czy masz dostęp. + Dołącz pomimo to + Dołącz do przestrzeni + Stwórz przestrzeń + Na razie pomiń + Dołącz do mojej przestrzeni %1$s %2$s + Nie będą częścią %s + Tylko do tego pokoju + Będą w stanie przeglądać %s + Zaproś do %s + Udostępnij link + Zaproś przez nazwę użytkownika lub email + Zaproś przez nazwę użytkownika + Zaproś przez email + Aktualnie jesteś tylko Ty. %s będzie jeszcze lepsza kiedy dołączą inni. + Zaproś do %s + Zaproś osoby + Zaproś osoby do Twojej przestrzeni + Opis + Tworzenie przestrzeni… + Losowy + Ogólny + Kim są Twoi znajomi \? + Stworzymy dla nich pokoje. Możesz też dodać następne w późniejszym etapie. + Jaki rodzaj dyskusji chcesz mieć w %s\? + Nadaj nazwę aby kontynuować. + Stwórz przestrzeń + Tylko z zaproszeniem, najlepsza dla Ciebie lub zespołów + Prywatna + Otwarta dla każdego, najlepsza dla społeczności + Publiczna + Prywatna przestrzeń dla Ciebie i Twoich znajomych + Ja i moi znajomi + Prywatna przestrzeń do organizacji Twoich pokoi + Tylko ja + Upewnij się, że odpowiednie osoby mają dostęp do %s. Możesz zmienić to później. + Z kim pracujesz\? + Aby dołączyć do istniejącej przestrzeni, potrzebujesz zaproszenia. + Możesz zmienić to później + Jaki rodzaj przestrzeni chcesz stworzyć\? + Przestrzenie są nowym sposobem na organizację pokojów i osób + Wiadomość wysłana + Wstępna synchronizacja: +\nPobieranie danych… + Wstępna synchronizacja: +\nCzekanie na odpowiedź serwera… + Pusty pokój (było %s) + + %1$s, %2$s, %3$s i %4$d innych + %1$s, %2$s, %3$s i %4$d innych + + + + %1$s, %2$s, %3$s i %4$s + Niestandardowe + Niestandardowe (%1$d) + Domyślne + Moderator + Administrator + Wideokonferencja zakończona przez %1$s + Rozpocząłeś wideokonferencję + Wideokonferencja rozpoczęta przez %1$s + Wysłałeś zaproszenie do %1$s aby dołączył do pokoju + Zaktualizowałeś swój profil %1$s + Usunąłeś(aś) awatar pokoju + Usunąłeś(aś) nazwę pokoju + Zmieniłeś listę kontroli dostępu ACL dla tego pokoju. + %s zmienił listę kontroli dostępu (ACL) dla tego pokoju. + • Dopasowywanie serwerów po ciągach IP jest zabronione. + • Dozwolone jest dopasowywanie serwera po ciągach IP. + %1$s zbanował(a) %2$s. Powód: %3$s + Odbanowałeś(aś) %1$s. Powód: %2$s + %1$s zdjął(ęła) bana %2$s. Powód: %3$s + Wyrzuciłeś(aś) %1$s. Powód: %2$s + Zażądałeś konferencji VoIP + 🎉 Wszystkie serwery zostały zbanowane od uczestnictwa. Ten pokój nie może być już używany. + Bez zmian. + Zaprosiłeś %1$s + %1$s zaprosił %2$s + %1$s zezwolił gościom dołączać do tego pokoju. + Zezwoliłeś gościom na dołączanie do tego pokoju. + %1$s zezwolił gościom dołączać do tego pokoju. + Zmieniłeś adres tego pokoju. + %1$s usunął avatar pokoju + Usunąłeś temat pokoju + %1$s zaakceptował zaproszenie dla %2$s. Powód: %3$s + Wycofałeś zaproszenie do pokoju dla %1$s. Powód: %2$s + %1$s wycofał zaproszenie do pokoju dla %2$s. Powód: %3$s + Wysłałeś zaproszenie do pokoju do %1$s. Powód: %2$s + %1$s wysłał zaproszenie do pokoju do %2$s . Powód: %3$s + Zbanowałeś %1$s. Powód: %2$s + %1$s wyrzucił %2$s. Powód: %3$s + Odrzuciłeś/aś zaproszenie. Powód: %1$s + %1$s odrzucił/a zaproszenie. Powód: %2$s + Wyszedłeś. Powód: %1$s + %1$s wyszedł. Powód: %2$s + Opuściłeś/aś pokój. Powód: %1$s + %1$s opuścił/a pokój. Powód: %2$s \ No newline at end of file From 231172aa1947f67a5cde401c1dcc178ac2bd153a Mon Sep 17 00:00:00 2001 From: eman luff Date: Thu, 4 Nov 2021 15:38:23 +0000 Subject: [PATCH 016/319] Translated using Weblate (Polish) Currently translated at 89.8% (2403 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 51894e9337..9a7c63fc13 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2809,4 +2809,5 @@ Spróbuj uruchomić ponownie aplikację. %1$s wyszedł. Powód: %2$s Opuściłeś/aś pokój. Powód: %1$s %1$s opuścił/a pokój. Powód: %2$s + Spotkania wykorzystują polityki bezpieczeństwa i uprawnień Jitsi. Wszystkie osoby obecne w danej chwili w pokoju zobaczą zaproszenie do dołączenia w momencie rozpoczęcia spotkania. \ No newline at end of file From 5c59c5f82cc0512fa9f16af1eaba5e14a2cf2f8d Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 4 Nov 2021 12:40:09 +0000 Subject: [PATCH 017/319] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2675 of 2675 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 | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index 8ef17a33d9..e25319e426 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -124,22 +124,23 @@ Você mudou o nível de poder de %1$s. %1$s mudou o nível de poder de %2$s. %1$s de %2$s para %3$s - Sinc Inicial: + Sinc inicial: \nImportando conta… - Sinc Inicial: + Sinc inicial: \nImportando crypto - Sinc Inicial: + Sinc inicial: \nImportando Salas - Sinc Inicial: -\nImportando Salas Que Você Se Juntou - Sinc Inicial: -\nImportando Salas Que Você Foi Convidada(o) - Sinc Inicial: -\nImportando Salas de Que Você Saiu - Sinc Inicial: -\nImportando Comunidades - Sinc Inicial: -\nImportando Dados de Conta + Sinc inicial: +\nCarregando suas conversas +\nSe você tem se juntado a um monte de salas, isto poderia levar um momento + Sinc inicial: +\nImportando salas convidadas + Sinc inicial: +\nImportando salas saídas + Sinc inicial: +\nImportando comunidades + Sinc inicial: +\nImportando dados de conta Enviando mensagem… Limpar fila de envio Convite de %1$s. Razão: %2$s @@ -2697,9 +2698,9 @@ Diretório de salas Novo valor Alterar - Sinc Inicial: + Sinc inicial: \nFazendo download de dados… - Sinc Inicial: + Sinc inicial: \nEsperando por resposta de servidor… Nível de confiança confiado Nível de confiança alerta @@ -3075,4 +3076,7 @@ Indisponível Offline Online + Escolher servidorcasa + Não dá para alcançar um servidorcasa na URL %s. Por favor cheque seu link ou escolha um servidorcasa manualmente. + À escuta por notificações \ No newline at end of file From 1c836df20d52571755d156215018867730e49028 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 4 Nov 2021 19:43:53 +0000 Subject: [PATCH 018/319] Translated using Weblate (Albanian) Currently translated at 99.5% (2662 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/ --- vector/src/main/res/values-sq/strings.xml | 40 +++++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index 379cd4b1f1..8ca771cdfd 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -62,22 +62,23 @@ Mesazh i hequr [arsye: %1$s] Mesazh i hequr nga %1$s [arsye: %2$s] %s e përmirësoi këtë dhomë. - Njëkohësimi Fillestar: + Njëkohësimi fillestar: \nPo importohet llogaria… - Njëkohësimi Fillestar: + Njëkohësimi fillestar: \nPo importohet kriptografi - Njëkohësimi Fillestar: + Njëkohësimi fillestar: \nPo importohen Dhoma Njëkohësimi Fillestar: -\nPo importohen Dhoma Ku Është Bërë Hyrje - Njëkohësimi Fillestar: -\nPo importohen Dhoma Me Ftesë - Njëkohësimi Fillestar: -\nPo importohen Dhoma të Braktisura - Njëkohësimi Fillestar: -\nPo importohen Bashkësi - Njëkohësimi Fillestar: -\nPo importohet të Dhëna Llogarie +\nPo ngarkohen bisedat tuaja +\nNëse keni hyrë në shumë dhoma, kjo mund të zgjasë ca + Njëkohësimi fillestar: +\nPo importohen dhoma me ftesë + Njëkohësimi fillestar: +\nPo importohen dhoma të braktisura + Njëkohësimi fillestar: +\nPo importohen bashkësi + Njëkohësimi fillestar: +\nPo importohet të dhëna llogarie Po dërgohet mesazh… Spastro radhë pritjeje %1$s shfuqizoi ftesën për %2$s për pjesëmarrje te dhoma @@ -289,7 +290,7 @@ Shihni Burim të Shfshehtëzuar Fshije Riemërtojeni - Raportoni lëndë + Raportoni Lëndë Thirrje aktive S’fillohet dot thirrja, ju lutemi, riprovoni më vonë S’fillohet dot thirrja @@ -807,7 +808,7 @@ Dëbon përdoruesin me ID-në e dhënë I heq dëbimin përdoruesit me ID-në e dhënë Përcaktoni shkallë pushteti të një përdoruesi - Hyn në dhomë me aliasin e dhënë + Hyn te dhoma me adresën e dhënë Dilni nga dhoma Caktoni temë dhome Përzë përdoruesin me ID-në e dhënë @@ -2657,9 +2658,9 @@ Kthehuni Ndërroje Mesazh i dërguar - Njëkohësimi Fillestar: + Njëkohësimi fillestar: \nPo shkarkohen të dhëna… - Njëkohësimi Fillestar: + Njëkohësimi fillestar: \nPo pritet për përgjigje nga shërbyesi… Hapësirat janë mënyra për të grupuar dhoma dhe persona. Sinjalizimi lyp mbulim nga shërbyesi dhe version eksperimental dhome @@ -2846,13 +2847,13 @@ Që ta ndalni ose ta dëgjoni, prekni mbi incizimin tuaj Edhe %1$ds Mbajeni, që të incizojë, lëshojeni që të dërgohet - Fshije mesazhin zanor të incizuar + Fshije incizimin Po incizohet mesazh zanor Ndalni Mesazh Zanor Luani Mesazh Zanor Kyçje Mesazhi Zanor Rrëshqiteni që të anulohet - Nisni Mesazh Zanor + Incizoni Mesazh Zanor Lejo cilindo te %s ta gjejë dhe hyjë. Mund të përzgjidhni edhe hapësira të tjera. Lypset Domosdo Përmirësim @@ -2993,4 +2994,7 @@ Shpërfill një përdorues, duke fshehur mesazhet e tij prej jush Jo në linjë Në linjë + Zgjidhni shërbyes Home + Te URL-ja %s s’kapet dot një shërbyes Home. Ju lutemi, kontrolloni lidhjen tuaj, ose zgjidheni një shërbyes Home dorazi. + Po dëgjohet për njoftime \ No newline at end of file From 71e55692ae368fbe69eb61fc96ceaa6a2f4e0cdc Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Thu, 4 Nov 2021 13:03:03 +0000 Subject: [PATCH 019/319] Translated using Weblate (Swedish) Currently translated at 100.0% (2675 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- vector/src/main/res/values-sv/strings.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 0ec5b0d820..a6969464a2 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -123,7 +123,8 @@ Inledande synk: \nImporterar rum Inledande synk: -\nImporterar anslutna rum +\nLaddar dina konversationer +\nOm du har gått med i många rum så kan detta ta lite tid Inledande synk: \nImporterar inbjudna rum Inledande synk: @@ -2619,9 +2620,9 @@ Rumsversion Nytt värde Byt - Initial synk: + Inledande synk: \nLaddar ner data… - Initial synk: + Inledande synk: \nVäntar på serversvar… Visa läskvitton Avisera inte @@ -3005,4 +3006,7 @@ Otillgänglig Offline Online + Välj hemserver + Kan inte nå en hemserver på URL:en %s. Vänligen kontrollera din länk eller välj en hemserver manuellt. + Lyssnar efter aviseringar \ No newline at end of file From dca4b87ceda397cb419c9571db5c8e884943345f Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 4 Nov 2021 18:56:26 +0000 Subject: [PATCH 020/319] Translated using Weblate (Ukrainian) Currently translated at 91.5% (2449 of 2675 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index b6d52c59e4..6b5aeab167 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -148,7 +148,8 @@ Початкова синхронізація: \nІмпортування запрошень до кімнат Початкова синхронізація: -\nІмпортування кімнат, до яких ви приєдналися +\nЗавантаження ваших бесід +\nЯкщо ви приєдналися до багатьох кімнат, це може тривати досить довго Початкова синхронізація: \nІмпортування кімнат Початкова синхронізація: From 86b777b922c039aa2aac676aba87a6b5162a5fd3 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 4 Nov 2021 12:57:07 +0000 Subject: [PATCH 021/319] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (2675 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- vector/src/main/res/values-zh-rCN/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index feff737e27..72f86d24e5 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -67,13 +67,14 @@ 初始化同步: \n正在导入聊天室 初始化同步: -\n正在导入已加入的聊天室 +\n正在加载对话 +\n如果你加入了很多论聊天室,这可能需要一段时间 初始化同步: \n正在导入已邀请的聊天室 初始化同步: \n正在导入已离开的聊天室 初始化同步: -\n正在导入社群 +\n正在导入社区 初始化同步: \n正在导入账号数据 %s 升级了此聊天室。 @@ -2959,4 +2960,7 @@ 不可用 离线 在线 + 选择主服务器 + 无法访问 URL %s 上的主服务器。请检查您的链接或手动选择一个主服务器。 + 侦听通知 \ No newline at end of file From f2d12aa3d7f2791b0bed6d8666c7daab6e687680 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 5 Nov 2021 02:14:29 +0000 Subject: [PATCH 022/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2675 of 2675 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index df611eceb7..27fd4910cf 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -67,7 +67,8 @@ 初始化同步: \n正在匯入聊天室 初始化同步: -\n正在匯入已加入的聊天室 +\n正在載入您的對話 +\n若您加入了很多聊天室,這可能會花一點時間 初始化同步: \n正在匯入已邀請的聊天室 初始化同步: @@ -2949,4 +2950,7 @@ 不可用 離線 線上 + 選擇家伺服器 + 無法存取 URL %s 的家伺服器。請檢查您的連結或手動選擇家伺服器。 + 監聽通知 \ No newline at end of file From b50e1a477f0356aeb9dcc3c556c75df9c5ff359b Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 4 Nov 2021 18:51:27 +0000 Subject: [PATCH 023/319] Translated using Weblate (Hungarian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- fastlane/metadata/android/hu-HU/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/hu-HU/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40103060.txt diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103050.txt b/fastlane/metadata/android/hu-HU/changelogs/40103050.txt new file mode 100644 index 0000000000..e46bf39f83 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Állapot állítási lehetőség közvetlen beszélgetéseknél (megj.: a matrix.org-on az állapot jelzés ki van kapcsolva). Újra elérhető az Android Auto. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103060.txt b/fastlane/metadata/android/hu-HU/changelogs/40103060.txt new file mode 100644 index 0000000000..1fc6ce5b8a --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Állapot állítási lehetőség közvetlen beszélgetéseknél (megj.: a matrix.org-on az állapot jelzés ki van kapcsolva). Újra elérhető az Android Auto. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From fbd21de5c3f2ce655b86109383dd2099442d2f58 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 4 Nov 2021 12:34:35 +0000 Subject: [PATCH 024/319] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (37 of 37 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/40103050.txt | 2 ++ fastlane/metadata/android/pt-BR/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40103060.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103050.txt b/fastlane/metadata/android/pt-BR/changelogs/40103050.txt new file mode 100644 index 0000000000..e565d269ed --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Adicionar suporte a Presença, para sala de Mensagem Direta (nota: presença está desabilitada em matrix.org). Adicionar de novo suporte a Android Auto. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103060.txt b/fastlane/metadata/android/pt-BR/changelogs/40103060.txt new file mode 100644 index 0000000000..b246759d26 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Adicionar suporte a Presença, para sala de Mensagem Direta (nota: presença está desabilitada em matrix.org). Adicionar de novo suporte a Android Auto. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 4301bb704220fab92795f031c2f5a905372b35e2 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Thu, 4 Nov 2021 12:59:57 +0000 Subject: [PATCH 025/319] Translated using Weblate (Swedish) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/ --- fastlane/metadata/android/sv-SE/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40103060.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103050.txt b/fastlane/metadata/android/sv-SE/changelogs/40103050.txt new file mode 100644 index 0000000000..57ee7189e3 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Lägg till närvarostöd för direktmeddelanden (obs: närvaro är inaktiverat på matrix.org). Lägg till stöd för Android Auto igen. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103060.txt b/fastlane/metadata/android/sv-SE/changelogs/40103060.txt new file mode 100644 index 0000000000..bac3775a2a --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Lägg till närvarostöd för direktmeddelanden (obs: närvaro är inaktiverat på matrix.org). Lägg till stöd för Android Auto igen. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 2feb6e0541485361f698d2915057c23ec219577e Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 4 Nov 2021 19:00:37 +0000 Subject: [PATCH 026/319] Translated using Weblate (Ukrainian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40103040.txt | 2 +- fastlane/metadata/android/uk/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/uk/changelogs/40103060.txt | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/uk/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/uk/changelogs/40103060.txt diff --git a/fastlane/metadata/android/uk/changelogs/40103040.txt b/fastlane/metadata/android/uk/changelogs/40103040.txt index 3e65e0bc07..b6d237241b 100644 --- a/fastlane/metadata/android/uk/changelogs/40103040.txt +++ b/fastlane/metadata/android/uk/changelogs/40103040.txt @@ -1,2 +1,2 @@ -Основні зміни в цій версії: Додано підтримку присутності для кімнати особистих повідомлень (примітка: присутність вимкнено на matrix.org. Знову додано підтримку Android Auto. +Основні зміни в цій версії: Додано підтримку присутності для кімнати особистих повідомлень (примітка: присутність вимкнено на matrix.org). Знову додано підтримку Android Auto. Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/uk/changelogs/40103050.txt b/fastlane/metadata/android/uk/changelogs/40103050.txt new file mode 100644 index 0000000000..846d1a2d84 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Додано підтримку присутності для кімнати особистих повідомлень (примітка: присутність вимкнена на matrix.org). Знову додано підтримку Android Auto. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/uk/changelogs/40103060.txt b/fastlane/metadata/android/uk/changelogs/40103060.txt new file mode 100644 index 0000000000..a1eec4d4de --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Додано підтримку присутності для кімнати особистих повідомлень (примітка: присутність вимкнена на matrix.org). Знову додано підтримку Android Auto. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From e07c46a0303987c1f2677b2e8b78ff4495e8af05 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 4 Nov 2021 13:00:02 +0000 Subject: [PATCH 027/319] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hans/ --- fastlane/metadata/android/zh-CN/changelogs/40103040.txt | 2 +- fastlane/metadata/android/zh-CN/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/zh-CN/changelogs/40103060.txt | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/zh-CN/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/zh-CN/changelogs/40103060.txt diff --git a/fastlane/metadata/android/zh-CN/changelogs/40103040.txt b/fastlane/metadata/android/zh-CN/changelogs/40103040.txt index 0c3d4d57c3..c879c3d036 100644 --- a/fastlane/metadata/android/zh-CN/changelogs/40103040.txt +++ b/fastlane/metadata/android/zh-CN/changelogs/40103040.txt @@ -1,2 +1,2 @@ -此版本主要变化:为 Direct Message 聊天室添加 Presence 支持 (注意:Presence 在matrix.org 上是禁用的。再次添加 Android Auto 支持。 +此版本主要变化:为 Direct Message 聊天室添加 Presence 支持 (注意:presence 在 matrix.org 上是禁用的)。再次添加 Android Auto 支持。 完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40103050.txt b/fastlane/metadata/android/zh-CN/changelogs/40103050.txt new file mode 100644 index 0000000000..7343ae0b9f --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40103050.txt @@ -0,0 +1,2 @@ +此版本的主要变化:为私信聊天室添加 Presence 支持 (注意:在 matrix.org 上 Presence 是禁用的)。再次添加 Android Auto 支持。 +完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/zh-CN/changelogs/40103060.txt b/fastlane/metadata/android/zh-CN/changelogs/40103060.txt new file mode 100644 index 0000000000..8322539927 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40103060.txt @@ -0,0 +1,2 @@ +此版本的主要变化:为私信聊天室添加 Presence 支持(注意:在 matrix.org 上 Presence 是禁用的)。再次添加 Android Auto 支持。 +完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 5d665c1d4bea386642a59a88b8f0e215c5d171f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 4 Nov 2021 15:42:52 +0000 Subject: [PATCH 028/319] Translated using Weblate (Estonian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/et/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/et/changelogs/40103060.txt diff --git a/fastlane/metadata/android/et/changelogs/40103050.txt b/fastlane/metadata/android/et/changelogs/40103050.txt new file mode 100644 index 0000000000..c68db70b6a --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: Lisasime otsevestlustele kasutaja võrguolekute toe (matrix.org puhul on välja lülitatud) ja uuesti lisasime Android Auto toe. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/et/changelogs/40103060.txt b/fastlane/metadata/android/et/changelogs/40103060.txt new file mode 100644 index 0000000000..d1c44870fa --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: Lisasime otsevestlustele kasutaja võrguolekute toe (matrix.org puhul on välja lülitatud) ja uuesti lisasime Android Auto toe. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 2bd430b8592a8e92aeec3dfe2f9d7b85bd0e0f9e Mon Sep 17 00:00:00 2001 From: random Date: Fri, 5 Nov 2021 16:35:52 +0000 Subject: [PATCH 029/319] Translated using Weblate (Italian) Currently translated at 100.0% (37 of 37 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/40103050.txt | 2 ++ fastlane/metadata/android/it-IT/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/40103060.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40103050.txt b/fastlane/metadata/android/it-IT/changelogs/40103050.txt new file mode 100644 index 0000000000..2762949682 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: aggiunto supporto alla presenza per messaggi diretti (nota: la presenza è disattivata su matrix.org). Aggiunto di nuovo il supporto ad Android Auto. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/it-IT/changelogs/40103060.txt b/fastlane/metadata/android/it-IT/changelogs/40103060.txt new file mode 100644 index 0000000000..f241fa9e57 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: aggiunto supporto alla presenza per i messaggi diretti (nota: la presenza è disattivata su matrix.org). Aggiunto di nuovo il supporto a Android Auto. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From cd06ac1c3fe8373dbc856c75c8403c3f09aa74e6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 5 Nov 2021 01:55:07 +0000 Subject: [PATCH 030/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (37 of 37 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/40103050.txt | 2 ++ fastlane/metadata/android/zh-TW/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40103060.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103050.txt b/fastlane/metadata/android/zh-TW/changelogs/40103050.txt new file mode 100644 index 0000000000..659be479f5 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40103050.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103060.txt b/fastlane/metadata/android/zh-TW/changelogs/40103060.txt new file mode 100644 index 0000000000..e1223a40e5 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40103060.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 085c217fc06f6437233c3c6ec1cf4b3e248c2493 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 4 Nov 2021 12:09:34 +0000 Subject: [PATCH 031/319] Translated using Weblate (Czech) Currently translated at 100.0% (37 of 37 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/40103050.txt | 2 ++ fastlane/metadata/android/cs-CZ/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40103060.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103050.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103050.txt new file mode 100644 index 0000000000..6aee9110ef --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Přidání podpory přítomnosti pro místnost s přímými zprávami (poznámka: přítomnost je na matrix.org zakázána). Opět přidána podpora Android Auto. +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103060.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103060.txt new file mode 100644 index 0000000000..ef29377a46 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Přidání podpory přítomnosti pro místnost s přímými zprávami (poznámka: přítomnost je na matrix.org zakázána). Opět přidána podpora Android Auto. +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From c7c0eb6a0591bb87339c9ff9c9207f2b1356e7e4 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 5 Nov 2021 00:25:16 +0000 Subject: [PATCH 032/319] Translated using Weblate (Indonesian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- fastlane/metadata/android/id/changelogs/40103040.txt | 2 +- fastlane/metadata/android/id/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/id/changelogs/40103060.txt | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/id/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/id/changelogs/40103060.txt diff --git a/fastlane/metadata/android/id/changelogs/40103040.txt b/fastlane/metadata/android/id/changelogs/40103040.txt index 60e2e3a4de..0641f72ffd 100644 --- a/fastlane/metadata/android/id/changelogs/40103040.txt +++ b/fastlane/metadata/android/id/changelogs/40103040.txt @@ -1,2 +1,2 @@ -Perubahan utama di versi ini: Menambahkan dukungan presensi, untuk ruangan Pesan Langsung (diingat bahwa presensi dinonaktifkan di matrix.org). Menambahkan lagi dukungan Android Auto. +Perubahan utama di versi ini: Tambahkan dukungan presensi, untuk ruangan Pesan Langsung (diingat bahwa presensi dinonaktifkan di matrix.org). Tambahkan lagi dukungan Android Auto. Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/id/changelogs/40103050.txt b/fastlane/metadata/android/id/changelogs/40103050.txt new file mode 100644 index 0000000000..ec7c9423bf --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Tambahkan dukungan presensi, untuk ruangan Pesan Langsung (diingat bahwa presensi dinonaktifkan di matrix.org). Tambahkan lagi dukungan Android Auto. +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/id/changelogs/40103060.txt b/fastlane/metadata/android/id/changelogs/40103060.txt new file mode 100644 index 0000000000..4265699d2f --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Tambahkan dukungan presensi, untuk ruangan Pesan Langsung (catatan: presensi dinonaktifkan di matrix.org). Tambahkan lagi dukungan Android Auto. +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 71fbcaa226639a73ed359fd52cfbda18ca9676a0 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 4 Nov 2021 19:49:33 +0000 Subject: [PATCH 033/319] Translated using Weblate (Albanian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/ --- fastlane/metadata/android/sq/changelogs/40103040.txt | 2 +- fastlane/metadata/android/sq/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/sq/changelogs/40103060.txt | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/sq/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/sq/changelogs/40103060.txt diff --git a/fastlane/metadata/android/sq/changelogs/40103040.txt b/fastlane/metadata/android/sq/changelogs/40103040.txt index 7f37e82801..6ad044b6a4 100644 --- a/fastlane/metadata/android/sq/changelogs/40103040.txt +++ b/fastlane/metadata/android/sq/changelogs/40103040.txt @@ -1,2 +1,2 @@ -Ndryshimet kryesore në këtë version: Shtim mbulimi për Prani, për dhomë Mesazh i Drejtpërdrejtë (shënim: në matrix.org prania është e çaktivizuar. Shtim sërish i mbulimit për Android Auto. +Ndryshimet kryesore në këtë version: Shtim mbulimi për Prani, për dhomë Mesazh i Drejtpërdrejtë (shënim: në matrix.org prania është e çaktivizuar). Shtim sërish i mbulimit për Android Auto. Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/sq/changelogs/40103050.txt b/fastlane/metadata/android/sq/changelogs/40103050.txt new file mode 100644 index 0000000000..bb609da987 --- /dev/null +++ b/fastlane/metadata/android/sq/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Ndryshimet kryesore në këtë version: Shtim mbulimi për Prani, për dhomën Mesazh i Drejtpërdrejtë (shënim: prania është e çaktivizuar në matrix.org). Shtim sërish i mbulimit për Android Auto. +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/sq/changelogs/40103060.txt b/fastlane/metadata/android/sq/changelogs/40103060.txt new file mode 100644 index 0000000000..96afd47a5d --- /dev/null +++ b/fastlane/metadata/android/sq/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Ndryshimet kryesore në këtë version: Shtim mbulimi për Prani, për dhomën Mesazh i Drejtpërdrejtë (shënim: prania është e çaktivizuar në matrix.org). Shtim sërish i mbulimit për Android Auto. +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 053fd7b6bf52daf32668b33ffaaf122202ba9cff Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 6 Nov 2021 19:18:38 +0000 Subject: [PATCH 034/319] Translated using Weblate (Czech) Currently translated at 100.0% (2675 of 2675 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index b33f15ba2e..565dd0ca05 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -2143,7 +2143,7 @@ %1$s %2$s V této místnosti nejsou žádné soubory Jinak, máte-li již účet a znáte-li svůj identifikátor a heslo, můžete použít tuto metodu: - Přihlásit se s mým identifikátorem Matrixu + Přihlásit se identifikátorem Matrixu Přihlásit se Pokud založíte účet na domovském serveru, použijte své Matrix ID (např. @user:domain.com) a heslo níže. Identifikátor uživatele From d481f3b2860e6f1ec0d529230b571291a24c8457 Mon Sep 17 00:00:00 2001 From: Tvirin Date: Sun, 7 Nov 2021 22:27:51 +0000 Subject: [PATCH 035/319] Added translation using Weblate (Macedonian) --- vector/src/main/res/values-mk/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vector/src/main/res/values-mk/strings.xml diff --git a/vector/src/main/res/values-mk/strings.xml b/vector/src/main/res/values-mk/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/vector/src/main/res/values-mk/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From d58a8467075a8fcc128122c53b98224850da790c Mon Sep 17 00:00:00 2001 From: Glandos Date: Mon, 8 Nov 2021 12:28:14 +0000 Subject: [PATCH 036/319] Translated using Weblate (French) Currently translated at 100.0% (2675 of 2675 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 12eca6b823..8f4c4a9366 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -68,7 +68,8 @@ Synchronisation initiale : \nImportation des salons Synchronisation initiale : -\nImportation des salons que vous avez rejoints +\nChargement des conversations +\nCela peut prendre du temps si vous avez rejoint beaucoup de salons Synchronisation initiale : \nImportation des salons où vous avez été invité Synchronisation initiale : @@ -3012,4 +3013,7 @@ Indisponible Hors ligne En ligne + Choisir un serveur d’accueil + Impossible de contacter un serveur d’accueil à l’URL %s. Veuillez vérifier votre lien ou choisir manuellement un serveur d’accueil. + Écoute des notifications \ No newline at end of file From 9cbed204bc16b9d39ca119b46f969c973b6863cf Mon Sep 17 00:00:00 2001 From: Fjoerfoks Date: Tue, 9 Nov 2021 12:25:37 +0000 Subject: [PATCH 037/319] Translated using Weblate (Frisian) Currently translated at 36.6% (980 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fy/ --- vector/src/main/res/values-fy/strings.xml | 288 +++++++++++++--------- 1 file changed, 176 insertions(+), 112 deletions(-) diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml index 0e31fcbd00..2e3ac708d1 100644 --- a/vector/src/main/res/values-fy/strings.xml +++ b/vector/src/main/res/values-fy/strings.xml @@ -159,11 +159,11 @@ %1$s hat %2$s útnûge. Reden: %3$s Dyn útnûging. Reden: %1$s %1$s harren útnûging. Reden: %2$s - Ferstjoeringslist leech meitsje + Utgeande wachtrige wiskje Berjocht oan it fersjoeren… Berjocht ferstjoerd - Inisjele Syngronisaasje: -\nAkkount Data Binnenhelje + Inisjele syngronisaasje: +\nAccountgegevens ymportearje Inisjele Syngronisaasje: \nMienskippen Binnenhelje Inisjele Syngronisaasje: @@ -181,7 +181,7 @@ Inisjele syngronisaasje: \nWachtsjend op reaksje fan server… Lege keamer (wie %s) - Lege keamer + Leech petear E-mailadres Utnûging fan %s Telefoannûmer @@ -197,7 +197,7 @@ Berjocht fuortsmiten [reden: %1$s] Berjocht fuortsmiten troch %1$s Gjin feroaringen. - • Tsjinners dy foldoche oan %s bin tastien. + • Servers dy’t foldogge oan %s binne tastien. Do hast de ACLs foar de keamer opnij ynsteld. %s hat de ACLs foar disse keamer ynsteld. Do hast disse keamer opwurdeare. @@ -217,7 +217,7 @@ \'%s\' is net in jildich mienskips ID Ûnjildich mienskips ID Nije mienskips ID (b.v. +foo:matrix.org) - Do binst op it momint net lid fan in mienskip. + Jo binne op dit stuit net lid fan in mienskip. Sukses Brûkers ID, Namme of email Disse keamer ferlitte @@ -241,14 +241,14 @@ De ferifikaasje koade is net jildich. Koade In tekst berjocht is nei %s stjoerd. Graach de ferifikaasje koade ynfiere dyt der yn stiet. - Kin net ferbine mei identiteits tsjinner - Identiteits tsjinner URL ynfiere - Emails en tillefoan nûmers ferstjoere + Kin net ferbine mei identiteitsserver + Fier identiteitsserver-URL yn + E-mailadressen en telefoannûmers ferstjoere Tastimming jaan Tastimming wer ynlûke - Do hast gjin tastimming jûn emails en tillefoan nûmers nei disse identiteits tsjinner te stjoeren, om oare brûkers út dyn kontakten te finen. - Do hast tastimming jûn emails en tillefoan nûmers nei disse identiteits tsjinner te stjoeren, om oare brûkers út dyn kontakten te finen. - Emails en tillefoan nûmers ferstjoere + Om oare brûkers út dyn kontakten te finen, hawwe jo gjin tastimming jûn e-mailadressen en telefoannûmers nei dizze identiteitsserver te stjoeren. + Om oare brûkers út dyn kontakten te finen, hawwe jo tastimming jûn e-mailadressen en telefoannûmers nei dizze identiteitsserver te stjoeren. + E-mailadressen en telefoannûmers ferstjoere Yn ôfwachting Bots, brêgen, widgets en sticker paketten brûke Foar oaren fynber wéze @@ -257,7 +257,7 @@ Keamer wurd oanmakke… Nije keamer oanmeitsje Gjin feroaringen fûn - (feroare) + (bewurke) Wachtsjend… Hulp & Oer Flugge Reaksjes @@ -282,7 +282,7 @@ Gjin netwurk. Kontroleerje dyn internet ferbyning. Nije Keamer Meitsje Net gûd foarme evenemint, kin net sjen litten wurde - Foar it letst feroare troch %1$s op %2$s + Foar it lêst troch %1$s wizige op %2$s Evenemint troch brûker fuortsmiten Fuortsmiten berjiochten sjen litte Berjocht fuortsmiten @@ -373,7 +373,7 @@ Feiligens & Privacy Tastean Keamer ferzje - Avanseare + Avansearre Rômtes Eltsenien kin de keamer fyne en der yn komme Eltsenien @@ -384,7 +384,7 @@ 1 moanne 1 wike 3 dagen - Foar oltiid + Altyd Tafoegje Notifikaasjes Olgemien @@ -392,7 +392,7 @@ Netwurkflater Kin it berjocht net ferstjoere Berjocht fuortsmiten - Waskôging hat ûndersteuning fan\'e tsjinner en in eksperimintele keamer nedich + Warskôging hat serverstipe en in eksperimintele keamer nedich Eksperiminteel Rômte - Beheinde Keamer. Do bist útnûge eltsenien. @@ -409,16 +409,16 @@ %s hat in fideo petear oanmakke. Do hast in fideo petear oanmakke. %s hat in fideo petear oanmakke. - Do hast de namme fan\'e keamer feroare nei: %1$s - %1$s hat de namme fan\'e keamer feroare nei: %2$s - Do hast it ûnderwerp feroare nei: %1$s - %1$s hat it ûnderwerp feroare nei: %2$s - Do hast dyn namme fuortsmiten (it wie %1$s) - %1$s hat syn namme fuortsmiten (it wie %2$s) - Do hast dyn namme fan %1$s nei %2$s feroare - %1$s hat syn namme fan %2$s nei %3$s feroare - Do hast dyn namme nei %1$s feroare - %1$s hat syn namme nei %2$s feroare + Jo hawwe de keamernamme wizige nei: %1$s + %1$s hat de keamernamme wizige nei: %2$s + Jo hawwe it ûnderwerp wizige nei: %1$s + %1$s hat it ûnderwerp wizige nei: %2$s + Jo hawwe jo werjeftenamme fuortsmiten (wie %1$s) + %1$s hat de werjeftenamme fuortsmiten (wie %2$s) + Jo hawwe jo werjeftenamme fan %1$s wizige nei %2$s + %1$s hat de werjeftenamme fan %2$s wizige nei %3$s + Jo hawwe jo werjeftenamme wizige nei %1$s + %1$s hat de werjeftenamme wizige nei %2$s Do hast de útnûging foar %1$s wer ynlutsen %1$s hat de útnûging foar %2$s wer ynlutsen Do hast %1$s ferbonne @@ -448,7 +448,7 @@ %1$s hat in sticker stjoerd. Do hast in ôfbylding stjoerd. %1$s hat in ôfbylding stjoerd. - Gjin jildiche Google Play Services APK fûn. Notifikaasjes kinne wol ris net wurkje. + Gjin jildige Google Play Services APK fûn. Notifikaasjes kinne wolris net wurkje. %d+ +%d %1$s: %2$s @@ -466,13 +466,13 @@ It petear giet hjir troch Disse keamer is ferfong en is net mear aktyf. Graach dyn wachtwurd ynfiere. - Graach in brûkersnamme ynfiere. - Akkount Útskeakelje + Fier in brûkersnamme yn. + Account útskeakelje Om troch te gean, fier dyn wachtwurd yn: - Graach alle berjochten ferjitte dyt ik ferstjoerd ha wannear myn akkount útskeakele is (Warskôging: hjir troch kin oare brûkers in ûnfolslein byld fan konversaasjes krijge) - Akkount Deaktivearje + Ferjit alle berjochten dy’t ik ferstjoerd haw wannear myn account útskeakele is (Warskôging: hjirtroch kinne oare brûkers in ûnfolslein byld fan petearen krije) + Account deaktivearje No besjen - Om de %1$s thústsjinner brûken te blieuwen mast de betingsten besjen en befestigje. + Om de %1$s-thússerver brûke te bliuwen, moatte jo de betingsten lêze en befêstigje. Keamer ferjitte Reden: %1$s Do binst út %1$s weiballe troch %2$s @@ -480,10 +480,10 @@ Skilje… Brûkers Aksje sjen litte - Do hast neat feroare - Do hast it keamerûnderwerp fuortsmiten - %1$s hat it keamerûnderwerp fuortsmiten - Do hast de keamernamme fuortsmiten + Jo hawwe neat wizige + Jo hawwe it keamerûnderwerp fuortsmiten + %1$s hat it petearûnderwerp fuortsmiten + Jo hawwe de keamernamme fuortsmiten %1$s hat de keamernamme fuortsmiten %1$s hat %2$s der út skopt. Reden: %3$s Do hast %1$s fuortskopt. Reden: %2$s @@ -494,8 +494,8 @@ Oare beskikbere talen Jou it ûnderwerp fan de keamer oan Dit is spam - Der befyne sich gjin triemen yn disse keamer - TRIEMEN + Der binne gjin bestannen yn dizze keamer + BESTANNEN Der befynt sich gjin media yn disse keamer MEDIA Omdraaie en bysnije @@ -503,7 +503,7 @@ Lûd Kamera Kontakt - Triem + Bestân Ôfbylding tafoege út In flater die sich foar wylst it taheaksel ophelle waard. Spring nei it ein @@ -514,13 +514,13 @@ Fideo Taal útsykje Taal - Skakel \'integraasjes tastean\' yn Ynstellings yn om dit te dwaan. - Integraasjes bin útskakele + Skeakelje yn Ynstellingen ‘Yntegraasjes tastean’ yn om dit te dwaan. + Yntegraasjes binne útskeakele Integraasje Behearder - Integraasje tastean - Identiteits Tsjinner - Thús Tsjinner - Ynloggd as + Yntegraasjes tastean + Identiteitsserver + Thússerver + Oanmeld as Ferstjoere Wachtwurd: Authentikaasje @@ -535,8 +535,8 @@ Tastimming jaan In oare opsje kieze Tastimming jaan - Dyn sichtberens ynstellings beheare. - Sichtberens + Jo ûntdekynstellingen beheare. + Untdekke Ja, ik wol graach helpe! Tillefoan nûmer Algemien @@ -550,7 +550,7 @@ Skoftsje Ôfspylje Ferstjoere - Do brûkst gjin Identiteits Tsjinner + Do brûkst gjin identiteitsserver Ûnbekende flater Interactieve Sesje Ferifikaasje De ferifikaasje is ôfbrutsen. @@ -585,7 +585,7 @@ Klear Feiligje dyn reservekopy mei in Wachtwurdssin. Kaaien mei de hân eksportearje - (Avanseare) + (Avansearre) Reitsje jo fersifere gegevens nea kwyt Gjin Matrix sesje beskikber Graach de wachtwurdssin fuortsmite ast wolst dot ${app_name} in nije herstel kaai foar dy oanmakket. @@ -598,8 +598,8 @@ Mislearre %s fuortsmite\? PIN feroarje - Avanseare - Avanseare Ynstellings Foar Notifikaasjes + Avansearre + Avansearre notifikaasjeynstellingen Ferjitte Favorite Útsykje @@ -610,7 +610,7 @@ Dit emailadres koe net fûn wurde. Dit emailadres wurd ol brûkt. Dit telefoannûmer wurd ol brûkt. - Emails en telefoannûmers + E-mailadressen en telefoannûmers Dyn wachtwurd is fernijd It wachtwurd is net jildich Fernijen fan it wachtwurd is mislearre @@ -635,14 +635,14 @@ Stim & Fideo Avansearre ynstellingen Oanpaste en avansearre ynstellingen - Akkount Tafoegje + Account tafoegje Oanpaste Ynstellingen. Ynskeakelje Ynskeakelje - Notifikaasjes binne ynskeakele foar dyn akkount. - Akkount Ynstellingen. + Notifikaasjes binne foar dyn account ynskeakele. + Accountynstellingen. Ynstellingen Iepenje - Notifikaasjes binne ynskeakele yn de systeem ynstellingen. + Notifikaasjes binne ynskeakele yn de systeemynstellingen. Systeem Ynstellingen. Tests Útfiere Telefoannûmers @@ -651,20 +651,20 @@ Applikaasje informaasje yn de systeem ynstellingen sjen litte. Applikaasje informaasje Telefoannûmer tafoegje - Der is gjin telefoannûmer tafoege oan syn akkount + Der is gjin telefoannûmer oan jo account tafoege E-mailadres tafoegje Email Ynstellingen - Petear Ferlitte + Petear ferlitte Direkt Petear Alle berjochten Alle berjochten (lûd) Ynstellingen - Ynstellingen feroarje - Keamer rjochten - Do hast de tsjinner ACLs foar dizze keamer feroare. - %s hat de server-ACL\'s foar dizze keamer feroare. - Do hast dyn profyl ôfbylding feroare + Ynstellingen wizigje + Petearrjochten + Jo hawwe de server-ACLs foar dizze keamer wizige. + %s hat de server-ACL\'s foar dizze keamer wizige. + Do hast dyn profylôfbylding wizige Koe de suggestje net ferstjoere (%s) Dankewol, it ferstjoeren fan de suggestje is slagge Skriuw jo suggestje hjir @@ -713,7 +713,7 @@ Gjin brûkers Keamers Minsken - Thús + Startskerm foarbyld Foarbyld Oanmeitsje @@ -765,17 +765,17 @@ %d keamers Typ hjir… - De tsjinner stiet al yn de list - Kin dizze tsjinner, as de rômte list fan dizze tsjinner net fine - Fier de namme yn fan de tsjinner dy jo ûntdekke wolle. - In nije tsjinner tafoegje - Jo tsjinner - Alle keamers op %s tsjinner - Tsjinner namme + Dizze server stiet al yn de list + Kin dizze server of de keamerlist fan dizze server net fine + Fier de namme yn fan de server dy’t jo ûntdekke wolle. + In nije server tafoegje + Jo server + Alle petearen op server %s + Servernamme Keamer hat ûnbekend sesjes Ik befêstigje dat de kaaien oerien komme As dit net oerienkomt, kin de feiligens fan jo kommunikaasje kompromittearre wêze. - Befêstigje troch dit te fergelykjen mei Brûkers Ynstellingen fan jo oare sesje: + Befêstigje troch dit te fergelykjen mei de Brûkersynstellingen fan jo oare sesje: Fan de swarte list ôf helje Sesje ferifiearre Op de swarte list set @@ -803,59 +803,59 @@ Keamer Skiednis Lêsberheid Keamer Tagong Dizze keamer yn it keamer oersjoch sjen litte - Tagong en sichtberens + Tagonklikheid en sichtberheid Lege prioriteit Standert komprimearing Media In ativaasje koade ynfiere Telefoan nûmer Binne jo der wis fan dat jo de %1$s %2$s fuort smite wolle\? - E-mail adressen en telefoan nûmers dy oan jo Matrix account keppele binne behearre + E-mailadressen en telefoannûmers dy’t oan jo Matrix-account keppele binne beheare Der die harren in flater foar wylst jo e-mail adres ferifiearre waard. - Hjoeddeistich wachtwurd + Aktuele wachtwurd %1$s @ %2$s Myn account deaktivearje Account deaktivearje Behearre Berjochten mei enter ferstjoere Trilje wannear jo neamd wurde - Account eveneminten sjen litte + Accountbarrens toane Sjen litte wannear oft minsken de keamer yn kaam binne, as der út gien binne Brûk it /confetti kommando as ferstjoer in berjocht mei ❄️ as 🎉 Chat effekten sjen litte Sjen kinne dat berjochten lêzen binne Lit oare minsken witte dat jo oan it typen binne. - Typ notifikaasjes ferstjoere - Tiid stimpels foar alle berjochten sjen litte + Typenotifikaasjes ferstjoere + Tiidstimpels foar alle berjochten toane Fersifering Kaai Behear Fersifering Oare ynstellingen Notifikaasjes - Brûkers ynstellingen + Brûkersynstellingen olm ferzje Ferzje Eftergrûn Syngronisaasje Modus Optimalisearje foar batterij gebrûk Wannear ik útnûge wurd foar in keamer - Stille Notifikaasjes Ynstelle - • Notifikaasjes befetsje allinich metadata + Stille notifikaasjes ynstelle + • Notifikaasjes befetsje allinnich metadata • Notifikaasjes wurde mei Firebase Cloud Messaging ferstjoerd Dizze applikaasje hat tastimming nedich om op de eftergrûn te starten Restriksjes útskeakelje - • Notifikaasje sil de ynhâld fan it berjocht net sjen litte - LED kleur útsykje, triljen, lûd… - Lûde Notifikaasjes Ynstelle + • Notifikaasjes sille de ynhâld fan it berjocht net toane + LED-kleur, triljen, lûd… + Lûde notifikaasjes ynstelle It skerm foar 3 sekonden ynskeakelje Notifikaasjes foar dizze sesje ynskeakelje - Notifikaasjes foar dit account ynskeakelje + Notifikaasjes foar dizze account ynskeakelje Notifikaasje lûd Gewoan Tsjinst Starte - Notifikaasje Tsjinst + Notifikaasjetsjinst Ynstellingen Kontrolearje Sesje Ynstellingen. Oan it útfieren… (%1$d of %2$d) - Profyl Ôfbylding + Profylôfbylding Ferzje %s Ferzje ÚTNOEGINGEN @@ -873,7 +873,7 @@ ÚTNÛGE Permisjes feroarje Keamer namme feroarje - Skiednis sichtberens feroarje + Sichtberens skiednis wizigje Keamer fersifering ynskeakelje Haad adres fan de keamer feroarje Keamer ôfbylding feroarje @@ -895,7 +895,7 @@ Alles ôfbrekke Alles opnij ferstjoere Berjocht net ferstjoerd. %1$s as %2$s no\? - Ferbining mei de tsjinner is ferlern. + Ferbining mei de server is ferbrutsen. In reaksje ferstjoere (net fersifere)… In fersifere reaksje ferstjoere… In berjocht ferstjoere (net fersifere)… @@ -1005,37 +1005,37 @@ %1$s, %2$s, %3$s en %4$s %1$s, %2$s en %3$s %1$s en %2$s - Keamerútnûging + Petearútnûging It is no net mooglik om in lege keamer wer binnen te gean. - Jo hawwe de útnûging nei %1$s oannaam - %1$s hat de útnûging nei %2$s oannaam - Jo hawwe de útnûging nei %1$s ynlutsen - %1$s hat de útnûging nei %2$s wer ynlutsen + Jo hawwe de útnûging nei %1$s akseptearre + %1$s hat de útnûging oan %2$s akseptearre + Jo hawwe de útnûging oan %1$s ynlutsen + %1$s hat de útnûging oan %2$s wer ynlutsen Jo hawwe de útnûging nei %1$s om de keamer binnen te gean wer ynlutsen %1$s hat de útnûging nei %2$s om de keamer binnen te gean wer ynlutsen Jo hawwe %1$s útnûge %1$s hat %2$s útnûge Jo hawwe in útnûging nei %1$s stjoerd om de keamer binnen te gean - %1$s hat in útnûging nei %2$s stjoerd om de keamer binnen te gean - %1$s hat de keamerôfbylding fuortsmiten - VoIP-konferinsje ôfrûn + %1$s hat in útnûging nei %2$s stjoerd om mei it petear mei te dwaan + %1$s hat de keameravatar fuortsmiten + VoIP-konferinsje foltôge VoIP-konferinsje begûn Jo hawwe in VoIP-konferinsje oanfrege %1$s hat in VoIP-konferinsje oanfrege - 🎉 Alle servers bin ferballe fan it meidwaan! Dizze keamer kin net mear brûkt wurde. - • Tsjinners dy oerien komme mei IP adressen binne no ferballe. - • Tsjinners dy oerien komme mei IP adressen binne no tastien. - • Tsjinners dy oerien komme mei %s binne út de list mei tastiene tsjinners wei helle. - • Tsjinners dy oerien komme mei %s binne no tastien. - • Tsjinners dy oerien komme mei %s binne út de list mei ferballe tsjinners wei helle. - • Tsjinners dy oerien komme mei %s binne no ferballe. - • Tsjinners dy oerien komme mei IP adressen binne ferballe. - • Tsjinners dy oerien komme mei IP adressen binne tastien. - • Tsjinners dy oerien komme mei %s binne ferballe. - Jo hawwe de keamerôfbylding fuortsmiten - Jo hawwe de keamer ôfbylding feroare - %1$s hat de keamer ôfbylding feroare - %1$s hat syn profylfoto feroare + 🎉 Alle servers binne ferballe fan dielname! Dizze keamer kin net mear brûkt wurde. + • Servers dy’t oerienkomme mei IP-adressen binne no ferballe. + • Servers dy’t oerienkomme mei IP-adressen binne no tastien. + • Servers dy’t oerienkomme mei %s binne út de list mei tastiene servers fuorthelle. + • Servers dy’t oerienkomme mei %s binne no tastien. + • Servers dy’t oerienkomme mei %s binne út de list mei ferballe servers fuorthelle. + • Servers dy’t oerienkomme mei %s binne no ferballe. + • Servers dy’t oerienkomme mei IP-adressen binne ferballe. + • Servers dy’t oerienkomme mei IP-adressen binne tastien. + • Servers dy’t oerienkomme mei %s binne ferballe. + Jo hawwe de keameravatar fuortsmiten + Jo hawwe de keamerôfbylding wizige + %1$s hat de keamerôfbylding wizige + %1$s hat syn profylfoto wizige Jo hawwe %1$s harren útnûging ynlutsen. Reden: %2$s %1$s hat %2$s harren útnûging ynlutsen. Reden: %3$s Jo hawwe de útnûging foar %1$s akseptearre. Reden: %2$s @@ -1065,4 +1065,68 @@ Mear ynfo Opnij ynstelle Slute + Jo binne op dit stuit yn dit petear + Jo aktuele pinkoade wizigje + Aktuele taal + Aktuele sesje + Allinnich werjeftenûmer fan oantal berjochten yn in ienfâldige notifikaasje. + Details as keamernamme en berjochtynhâld toane. + Ynhâld yn notifikaasjes toane + Besjoch jo ynstellingen om pushnotifikaasjes yn te skeakeljen + Pushnotifikaasjes binne útskeakele + Konfiguraasje notifikaasjes + Notifikaasjes + Dôvje + Allinnich fermeldingen + Alle berjochten + Alle berjochten (drok) + Accountynstellingen + Jo kinne notifikaasjes beheare yn %1$s. + Petearen mei miste notifikaasjes fêstsette + Notifikaasjedoelen + Opropnotifikaasjes konfigurearje + • Notifikaasjes befetsje meta- en berjochtgegevens + Notifikaasjetsjinst automatysk opnij starte + Notifikaasjetsjinst is net aktyf. +\nProbearje de app opnij te starten. + Notifikaasjetsjinst is aktyf. + Notifikaasjes binne foar dizze sesje ynskeakele. + Problemen mei notifikaasjes oplosse + Standert notifikaasjes + Gegevens wiskje + Gegevens wiskje + Alle gegevens wiskje + Persoanlike gegevens wiskje + Skiednis wiskje + Om Matrix-appbehear te werstellen + Mediabuffer wiskje + Buffer wiskje + Yntegraasjes beheare + Yntegraasjes + Te finen e-mailadressen + E-mailnotifikaasjes ynskeakelje foar %s + Foegje in e-mailadres ta oan jo Matrix-account, om e-mailnotifikaasjes te ûntfangen + E-mailnotifikaasje + Der is gjin e-mailadres oan jo account tafoege + Werjeftenamme + Wiziget jo werjeftenamme allinnich yn de aktuele keamer + Wiziget jo werjeftenamme + Jo werjeftenamme + Befettet wizigingen yn avatar en werjeftenamme. + Befettet útnûging/meidwaan/ferlitten/skopt/ferballe-barrens en wizigingen avatar/werjeftenamme. + ${app_name} sil periodyk op de eftergrûn syngronisearje (konfigurearber). +\nDit hat in negative ynfloed op jo batterij- en datagebrûk. Der sil in melding toand wurde ta ynformaasje. + Myn werjeftenamme + Berjochten dy’t myn werjeftenamme befetsje + 🔐️ Doch mei my mei op ${app_name} + Ah goeie, praat mei my op ${app_name}: %s + Freonen útnûgje + Lege prioriteit + Favoryt + Gjin + Dôvje + Allinnich fermeldingen + Spacerjochten + Foegje in identiteitsserver ta yn de ynstellingen om dit te dwaan. + Oproppen \ No newline at end of file From 0ec022f8179d7ec642362c21261030a5c4f93cda Mon Sep 17 00:00:00 2001 From: Michael Mihai Date: Tue, 9 Nov 2021 11:26:55 +0000 Subject: [PATCH 038/319] Translated using Weblate (Romanian) Currently translated at 12.8% (343 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ro/ --- vector/src/main/res/values-ro/strings.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index 1c45088417..8ef802f034 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -358,7 +358,7 @@ Sincronizare inițială: \nSe importa camerele Sincronizare inițială: -\nSe importă crypto +\nSe importă datele criptografice Sincronizare inițială: \nSe importă contul… Sincronizare inițială: @@ -393,4 +393,13 @@ Acum sunt permise serverele ce au adrese IP ce se potrivesc. Sunt blocate serverele ce au adrese IP ce se potrivesc. Sunt permise serverele ce au adrese IP ce se potrivesc. + Se creează o copie a cheilor criptografice.… + Dacă vă deconectați acum, veți pierde mesajele criptate + Copierea cheilor nu sa încheiat, vă rugăm așteptați… + Folosește cheia de rezervă + Copia cheii de criptare + Detalii despre comunitate + Raport de erori + Istoricul activitățiilor + Detalii despre membri \ No newline at end of file From 620a6cad2a55e3586b932bc8527224e31e230251 Mon Sep 17 00:00:00 2001 From: Glandos Date: Mon, 8 Nov 2021 12:21:03 +0000 Subject: [PATCH 039/319] Translated using Weblate (French) Currently translated at 100.0% (37 of 37 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/40103050.txt | 2 ++ fastlane/metadata/android/fr-FR/changelogs/40103060.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103060.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103050.txt b/fastlane/metadata/android/fr-FR/changelogs/40103050.txt new file mode 100644 index 0000000000..08143ead2f --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : ajout du support pour les indicateurs de présence, dans les conversations privées (attention : les indicateurs de présence sont désactivés sur matrix.org). Réactivation de la prise en charge de Android Auto. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103060.txt b/fastlane/metadata/android/fr-FR/changelogs/40103060.txt new file mode 100644 index 0000000000..0187c4bf88 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40103060.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : ajout du support pour les indicateurs de présence, dans les conversations privées (attention : les indicateurs de présence sont désactivés sur matrix.org). Réactivation de la prise en charge de Android Auto. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.6 From 80a42d0a554c6157de01cc1aa4b788cb3f1c1133 Mon Sep 17 00:00:00 2001 From: yostyle Date: Mon, 25 Oct 2021 17:23:13 +0200 Subject: [PATCH 040/319] Add content scanner APIs --- .../content/ElementContentUrlResolver.kt | 112 +++++++++++++ .../session/contentscanning/ContentScanApi.kt | 35 ++++ .../contentscanning/ContentScannerModule.kt | 74 +++++++++ .../ContentScanningApiProvider.kt | 15 ++ .../DefaultContentScannerService.kt | 150 ++++++++++++++++++ .../contentscanning/ScanEncryptorUtils.kt | 53 +++++++ .../data/ContentScanningStore.kt | 30 ++++ .../db/ContentScanResultEntity.kt | 45 ++++++ .../db/ContentScannerEntityQueries.kt | 31 ++++ .../db/ContentScannerInfoEntity.kt | 17 ++ .../db/ContentScannerRealmModule.kt | 19 +++ .../db/RealmContentScannerStore.kt | 132 +++++++++++++++ .../contentscanning/model/DownloadBody.kt | 30 ++++ .../contentscanning/model/ScanResponse.kt | 23 +++ .../model/ServerPublicKeyResponse.kt | 16 ++ .../tasks/DownloadEncryptedTask.kt | 41 +++++ .../tasks/GetServerPublicKeyTask.kt | 29 ++++ .../tasks/ScanEncryptedTask.kt | 57 +++++++ .../contentscanning/tasks/ScanMediaTask.kt | 65 ++++++++ .../android/sdk/api/failure/Extensions.kt | 18 +++ .../matrix/android/sdk/api/session/Session.kt | 6 + .../api/session/content/ContentUrlResolver.kt | 16 ++ .../contentscanning/ContentScanError.kt | 39 +++++ .../contentscanning/ContentScannerService.kt | 35 ++++ .../DisabledContentScannerService.kt | 69 ++++++++ .../api/session/contentscanning/ScanState.kt | 20 +++ .../internal/auth/login/DefaultLoginWizard.kt | 3 +- .../android/sdk/internal/di/DbQualifiers.kt | 4 + .../sdk/internal/network/NetworkConstants.kt | 3 + .../sdk/internal/session/DefaultSession.kt | 4 + .../sdk/internal/session/SessionComponent.kt | 2 + .../content/DefaultContentUrlResolver.kt | 11 +- 32 files changed, 1202 insertions(+), 2 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt new file mode 100644 index 0000000000..e2f0ac2499 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2020 The Matrix.org Foundation C.I.C. + * + * 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.matrix.android.sdk.internal.session.content + +import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toJson +import org.matrix.android.sdk.api.MatrixUrls +import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl +import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig +import org.matrix.android.sdk.api.session.content.ContentUrlResolver +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.network.NetworkConstants +import org.matrix.android.sdk.internal.util.ensureTrailingSlash +import javax.inject.Inject + +internal class ElementContentUrlResolver @Inject constructor( + homeServerConnectionConfig: HomeServerConnectionConfig, + private val scannerService: ContentScannerService +) : ContentUrlResolver { + + private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash() + + override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload" + + override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { + return if (scannerService.isScannerEnabled() && elementToDecrypt != null) { + val baseUrl = scannerService.getContentScannerServer() + val sep = if (baseUrl?.endsWith("/") == true) "" else "/" + + val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted" + + ContentUrlResolver.ResolvedMethod.POST( + url = url, + jsonBody = ScanEncryptorUtils + .getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt) + .toJson() + ) + } else { + resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) } + } + } + + override fun resolveFullSize(contentUrl: String?): String? { + return contentUrl + // do not allow non-mxc content URLs + ?.takeIf { it.isMxcUrl() } + ?.let { + resolve( + contentUrl = it, + toThumbnail = false + ) + } + } + + override fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ContentUrlResolver.ThumbnailMethod): String? { + return contentUrl + // do not allow non-mxc content URLs + ?.takeIf { it.isMxcUrl() } + ?.let { + resolve( + contentUrl = it, + toThumbnail = true, + params = "?width=$width&height=$height&method=${method.value}" + ) + } + } + + private fun resolve(contentUrl: String, + toThumbnail: Boolean, + params: String = ""): String? { + var serverAndMediaId = contentUrl.removePrefix(MatrixUrls.MATRIX_CONTENT_URI_SCHEME) + + val apiPath = if (scannerService.isScannerEnabled()) { + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + } else { + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + } + val prefix = if (toThumbnail) { + apiPath + "thumbnail/" + } else { + apiPath + "download/" + } + val fragmentOffset = serverAndMediaId.indexOf("#") + var fragment = "" + if (fragmentOffset >= 0) { + fragment = serverAndMediaId.substring(fragmentOffset) + serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset) + } + + val resolvedUrl = if (scannerService.isScannerEnabled()) { + scannerService.getContentScannerServer()!!.ensureTrailingSlash() + } else { + baseUrl + } + return resolvedUrl + prefix + serverAndMediaId + params + fragment + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt new file mode 100644 index 0000000000..44745e4c50 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning + +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse +import okhttp3.ResponseBody +import org.matrix.android.sdk.internal.network.NetworkConstants +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Path + +/** + * https://github.com/matrix-org/matrix-content-scanner + */ +internal interface ContentScanApi { + + @POST(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted") + suspend fun downloadEncrypted(@Body info: DownloadBody): ResponseBody + + @POST(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "scan_encrypted") + fun scanFile(@Body info: DownloadBody): ScanResponse + + @GET(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "public_key") + fun getServerPublicKey(): ServerPublicKeyResponse + + @GET(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "scan/{domain}/{mediaId}") + fun scanMedia(@Path(value = "domain") domain: String, @Path(value = "mediaId") mediaId: String): ScanResponse +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt new file mode 100644 index 0000000000..02a0c49455 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning + +import dagger.Binds +import dagger.Module +import dagger.Provides +import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import im.vector.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule +import im.vector.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask +import io.realm.RealmConfiguration +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.internal.database.RealmKeysUtils +import org.matrix.android.sdk.internal.di.ContentScannerDatabase +import org.matrix.android.sdk.internal.di.SessionFilesDirectory +import org.matrix.android.sdk.internal.di.UserMd5 +import org.matrix.android.sdk.internal.session.SessionModule +import org.matrix.android.sdk.internal.session.SessionScope +import java.io.File + +@Module +internal abstract class ContentScannerModule { + @Module + companion object { + + @JvmStatic + @Provides + @ContentScannerDatabase + @SessionScope + fun providesContentScannerRealmConfiguration(realmKeysUtils: RealmKeysUtils, + @SessionFilesDirectory directory: File, + @UserMd5 userMd5: String): RealmConfiguration { + return RealmConfiguration.Builder() + .directory(directory) + .name("matrix-sdk-content-scanning.realm") + .apply { + realmKeysUtils.configureEncryption(this, SessionModule.getKeyAlias(userMd5)) + } + .allowWritesOnUiThread(true) + .modules(ContentScannerRealmModule()) + .build() + } + } + + @Binds + abstract fun bindContentScannerService(service: DefaultContentScannerService): ContentScannerService + + @Binds + abstract fun bindContentScannerStore(store: RealmContentScannerStore): ContentScanningStore + + @Binds + abstract fun bindDownloadEncryptedTask(task: DefaultDownloadEncryptedTask): DownloadEncryptedTask + + @Binds + abstract fun bindGetServerPublicKeyTask(task: DefaultGetServerPublicKeyTask): GetServerPublicKeyTask + + @Binds + abstract fun bindScanMediaTask(task: DefaultScanMediaTask): ScanMediaTask + + @Binds + abstract fun bindScanEncryptedTask(task: DefaultScanEncryptedTask): ScanEncryptedTask +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt new file mode 100644 index 0000000000..44330ce2d0 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning + +import org.matrix.android.sdk.internal.session.SessionScope +import javax.inject.Inject + +@SessionScope +internal class ContentScanningApiProvider @Inject constructor() { + var contentScannerApi: ContentScanApi? = null +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt new file mode 100644 index 0000000000..e632e8873a --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt @@ -0,0 +1,150 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning + +import androidx.lifecycle.LiveData +import dagger.Lazy +import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask +import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.NoOpMatrixCallback +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.di.Unauthenticated +import org.matrix.android.sdk.internal.network.RetrofitFactory +import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.task.TaskExecutor +import org.matrix.android.sdk.internal.task.launchToCallback +import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers +import org.matrix.android.sdk.internal.util.awaitCallback +import timber.log.Timber +import javax.inject.Inject + +@SessionScope +internal class DefaultContentScannerService @Inject constructor( + private val retrofitFactory: RetrofitFactory, + @Unauthenticated + private val okHttpClient: Lazy, + private val contentScanningApiProvider: ContentScanningApiProvider, + private val contentScanningStore: ContentScanningStore, +// private val sessionParams: SessionParams, + private val getServerPublicKeyTask: GetServerPublicKeyTask, + private val scanEncryptedTask: ScanEncryptedTask, + private val scanMediaTask: ScanMediaTask, + private val taskExecutor: TaskExecutor, + private val coroutineDispatchers: MatrixCoroutineDispatchers +) : ContentScannerService { + + // Cache public key in memory + override var serverPublicKey: String? = null + private set + + override fun getContentScannerServer(): String? { + return contentScanningStore.getScannerUrl() + } + + override fun getServerPublicKey(forceDownload: Boolean, callback: MatrixCallback) { + val api = contentScanningApiProvider.contentScannerApi ?: return Unit.also { + callback.onFailure(IllegalArgumentException("No content scanner defined")) + } + + if (!forceDownload && serverPublicKey != null) { + callback.onSuccess(serverPublicKey) + return + } + taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { + getServerPublicKeyTask.execute(GetServerPublicKeyTask.Params(api)).also { + serverPublicKey = it + } + } + } + + override fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) { + taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { + val serverPublicKey = serverPublicKey ?: awaitCallback { + getServerPublicKey(false, it) + } + + val result = scanEncryptedTask.execute(ScanEncryptedTask.Params( + mxcUrl = mxcUrl, + publicServerKey = serverPublicKey, + encryptedInfo = fileInfo + )) + + ScanStatusInfo( + state = if (result.clean) ScanState.TRUSTED else ScanState.INFECTED, + humanReadableMessage = result.info, + scanDateTimestamp = System.currentTimeMillis() + ) + } + } + + override fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) { + taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { + val result = scanMediaTask.execute(ScanMediaTask.Params(mxcUrl)) + + ScanStatusInfo( + state = if (result.clean) ScanState.TRUSTED else ScanState.INFECTED, + humanReadableMessage = result.info, + scanDateTimestamp = System.currentTimeMillis() + ) + } + } + + override fun setScannerUrl(url: String?) = contentScanningStore.setScannerUrl(url).also { + if (url == null) { + contentScanningApiProvider.contentScannerApi = null + serverPublicKey = null + } else { + val api = retrofitFactory + .create(okHttpClient, url) + .create(ContentScanApi::class.java) + contentScanningApiProvider.contentScannerApi = api + + taskExecutor.executorScope.launch(coroutineDispatchers.io) { + try { + awaitCallback { + getServerPublicKey(true, it) + } + } catch (failure: Throwable) { + Timber.e("Failed to get public server api") + } + } + } + } + + override fun enableScanner(enabled: Boolean) = contentScanningStore.enableScanning(enabled) + + override fun isScannerEnabled(): Boolean = contentScanningStore.isScanEnabled() + + override fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? { + return contentScanningStore.getScanResult(mxcUrl) + } + + override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean): LiveData> { + val data = contentScanningStore.getLiveScanResult(mxcUrl) + if (fetchIfNeeded && !contentScanningStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { + getScanResultForAttachment(mxcUrl, NoOpMatrixCallback()) + } + return data + } + + override fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean): LiveData> { + val data = contentScanningStore.getLiveScanResult(mxcUrl) + if (fetchIfNeeded && !contentScanningStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { + getScanResultForAttachment(mxcUrl, fileInfo, NoOpMatrixCallback()) + } + return data + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt new file mode 100644 index 0000000000..7d9f833954 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning + +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo +import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileKey +import org.matrix.android.sdk.internal.crypto.tools.withOlmEncryption +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson + +object ScanEncryptorUtils { + + fun getDownloadBodyAndEncryptIfNeeded(publicServerKey: String?, mxcUrl: String, elementToDecrypt: ElementToDecrypt): DownloadBody { + // TODO, upstream refactoring changed the object model here... + // it's bad we have to recreate and use hardcoded values + val encryptedInfo = EncryptedFileInfo( + url = mxcUrl, + iv = elementToDecrypt.iv, + hashes = mapOf("sha256" to elementToDecrypt.sha256), + key = EncryptedFileKey( + k = elementToDecrypt.k, + alg = "A256CTR", + keyOps = listOf("encrypt", "decrypt"), + kty = "oct", + ext = true + ), + v = "v2" + ) + return if (publicServerKey != null) { + // We should encrypt + withOlmEncryption { olm -> + olm.setRecipientKey(publicServerKey) + + val olmResult = olm.encrypt(DownloadBody(encryptedInfo).toCanonicalJson()) + DownloadBody( + encryptedBody = EncryptedBody( + cipherText = olmResult.mCipherText, + ephemeral = olmResult.mEphemeralKey, + mac = olmResult.mMac + ) + ) + } + } else { + DownloadBody(encryptedInfo) + } + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt new file mode 100644 index 0000000000..74bd3e6db3 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.data + +import androidx.lifecycle.LiveData +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.util.Optional + +internal interface ContentScanningStore { + + fun getScannerUrl(): String? + + fun setScannerUrl(url: String?) + + fun enableScanning(enabled: Boolean) + + fun isScanEnabled(): Boolean + + fun getScanResult(mxcUrl: String): ScanStatusInfo? + fun getLiveScanResult(mxcUrl: String): LiveData> + fun isScanResultKnownOrInProgress(mxcUrl: String, scannerUrl: String?): Boolean + + fun updateStateForContent(mxcUrl: String, state: ScanState, scannerUrl: String?) + fun updateScanResultForContent(mxcUrl: String, scannerUrl: String?, state: ScanState, humanReadable: String) +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt new file mode 100644 index 0000000000..6765461fb1 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.db + +import io.realm.RealmObject +import io.realm.annotations.Index +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo + +internal open class ContentScanResultEntity( + @Index + var mediaUrl: String? = null, + var scanStatusString: String? = null, + var humanReadableMessage: String? = null, + var scanDateTimestamp: Long? = null, + var scannerUrl: String? = null +) : RealmObject() { + + var scanResult: ScanState + get() { + return scanStatusString + ?.let { + tryOrNull { ScanState.valueOf(it) } + } + ?: ScanState.UNKNOWN + } + set(result) { + scanStatusString = result.name + } + + fun toModel() : ScanStatusInfo { + return ScanStatusInfo( + state = this.scanResult, + humanReadableMessage = humanReadableMessage, + scanDateTimestamp = scanDateTimestamp + ) + } + + companion object +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt new file mode 100644 index 0000000000..5056f1d1ba --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.db + +import io.realm.Realm +import io.realm.kotlin.createObject +import io.realm.kotlin.where + +internal fun ContentScanResultEntity.Companion.get(realm: Realm, attachmentUrl: String, contentScannerUrl: String?): ContentScanResultEntity? { + return realm.where() + .equalTo(ContentScanResultEntityFields.MEDIA_URL, attachmentUrl) + .apply { + contentScannerUrl?.let { + equalTo(ContentScanResultEntityFields.SCANNER_URL, it) + } + } + .findFirst() +} + +internal fun ContentScanResultEntity.Companion.getOrCreate(realm: Realm, attachmentUrl: String, contentScannerUrl: String?): ContentScanResultEntity { + return ContentScanResultEntity.get(realm, attachmentUrl, contentScannerUrl) + ?: realm.createObject().also { + it.mediaUrl = attachmentUrl + it.scanDateTimestamp = System.currentTimeMillis() + it.scannerUrl = contentScannerUrl + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt new file mode 100644 index 0000000000..c54d4e3139 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.db + +import io.realm.RealmObject + +internal open class ContentScannerInfoEntity( + var serverUrl: String? = null, + var enabled: Boolean? = null +) : RealmObject() { + + companion object +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt new file mode 100644 index 0000000000..eb40fa13fb --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.db + +import io.realm.annotations.RealmModule + +/** + * Realm module for content scanner classes + */ +@RealmModule(library = true, + classes = [ + ContentScannerInfoEntity::class, + ContentScanResultEntity::class + ]) +internal class ContentScannerRealmModule diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt new file mode 100644 index 0000000000..a09343139a --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt @@ -0,0 +1,132 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.db + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import io.realm.Realm +import io.realm.RealmConfiguration +import io.realm.kotlin.createObject +import io.realm.kotlin.where +import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.api.util.toOptional +import org.matrix.android.sdk.internal.di.ContentScannerDatabase +import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.util.isValidUrl +import javax.inject.Inject + +@SessionScope +internal class RealmContentScannerStore @Inject constructor( + @ContentScannerDatabase + private val realmConfiguration: RealmConfiguration +) : ContentScanningStore { + + private val monarchy = Monarchy.Builder() + .setRealmConfiguration(realmConfiguration) + .build() + + override fun getScannerUrl(): String? { + return monarchy.fetchAllMappedSync( + { realm -> + realm.where() + }, { + it.serverUrl + } + ).firstOrNull() + } + + override fun setScannerUrl(url: String?) { + monarchy.runTransactionSync { realm -> + val info = realm.where().findFirst() + ?: realm.createObject() + info.serverUrl = url + } + } + + override fun enableScanning(enabled: Boolean) { + monarchy.runTransactionSync { realm -> + val info = realm.where().findFirst() + ?: realm.createObject() + info.enabled = enabled + } + } + + override fun isScanEnabled(): Boolean { + return monarchy.fetchAllMappedSync( + { realm -> + realm.where() + }, { + it.enabled.orFalse() && it.serverUrl?.isValidUrl().orFalse() + } + ).firstOrNull().orFalse() + } + + override fun updateStateForContent(mxcUrl: String, state: ScanState, scannerUrl: String?) { + monarchy.runTransactionSync { + ContentScanResultEntity.getOrCreate(it, mxcUrl, scannerUrl).scanResult = state + } + } + + override fun updateScanResultForContent(mxcUrl: String, scannerUrl: String?, state: ScanState, humanReadable: String) { + monarchy.runTransactionSync { + ContentScanResultEntity.getOrCreate(it, mxcUrl, scannerUrl).apply { + scanResult = state + scanDateTimestamp = System.currentTimeMillis() + humanReadableMessage = humanReadable + } + } + } + + override fun isScanResultKnownOrInProgress(mxcUrl: String, scannerUrl: String?): Boolean { + var isKnown = false + monarchy.runTransactionSync { + val info = ContentScanResultEntity.get(it, mxcUrl, scannerUrl)?.scanResult + isKnown = when (info) { + ScanState.IN_PROGRESS, + ScanState.TRUSTED, + ScanState.INFECTED -> true + else -> false + } + } + return isKnown + } + + override fun getScanResult(mxcUrl: String): ScanStatusInfo? { + return monarchy.fetchAllMappedSync({ realm -> + realm.where() + .equalTo(ContentScanResultEntityFields.MEDIA_URL, mxcUrl) + .apply { + getScannerUrl()?.let { + equalTo(ContentScanResultEntityFields.SCANNER_URL, it) + } + } + }, { + it.toModel() + }).firstOrNull() + } + + override fun getLiveScanResult(mxcUrl: String): LiveData> { + val liveData = monarchy.findAllMappedWithChanges( + { realm: Realm -> + realm.where() + .equalTo(ContentScanResultEntityFields.MEDIA_URL, mxcUrl) + .equalTo(ContentScanResultEntityFields.SCANNER_URL, getScannerUrl()) + }, + { entity -> + entity.toModel() + } + ) + return Transformations.map(liveData) { + it.firstOrNull().toOptional() + } + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt new file mode 100644 index 0000000000..1dac0a9ced --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo +import org.matrix.android.sdk.internal.di.MoshiProvider +import org.matrix.android.sdk.internal.util.JsonCanonicalizer + +@JsonClass(generateAdapter = true) +data class DownloadBody( + @Json(name = "file") val file: EncryptedFileInfo? = null, + @Json(name = "encrypted_body") val encryptedBody: EncryptedBody? = null +) + +@JsonClass(generateAdapter = true) +data class EncryptedBody( + @Json(name = "ciphertext") val cipherText: String, + @Json(name = "mac") val mac: String, + @Json(name = "ephemeral") val ephemeral: String +) + +fun DownloadBody.toJson(): String = MoshiProvider.providesMoshi().adapter(DownloadBody::class.java).toJson(this) + +fun DownloadBody.toCanonicalJson() = JsonCanonicalizer.getCanonicalJson(DownloadBody::class.java, this) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt new file mode 100644 index 0000000000..ca4c072b84 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * { + * "clean": true, + * "info": "File clean at 6/7/2018, 6:02:40 PM" + * } + */ +@JsonClass(generateAdapter = true) +data class ScanResponse( + @Json(name = "clean") val clean: Boolean, + /** Human-readable information about the result. */ + @Json(name = "info") val info: String? +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt new file mode 100644 index 0000000000..57ba2f8263 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class ServerPublicKeyResponse( + @Json(name = "public_key") + val publicKey : String? +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt new file mode 100644 index 0000000000..04f2174e67 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks + +import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import okhttp3.ResponseBody +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task +import javax.inject.Inject + +internal interface DownloadEncryptedTask : Task { + data class Params( + val publicServerKey: String?, + val encryptedInfo: ElementToDecrypt, + val mxcUrl: String + ) +} + +internal class DefaultDownloadEncryptedTask @Inject constructor( + private val contentScanningApiProvider: ContentScanningApiProvider +) : DownloadEncryptedTask { + + override suspend fun execute(params: DownloadEncryptedTask.Params): ResponseBody { + val dlBody = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded( + params.publicServerKey, + params.mxcUrl, + params.encryptedInfo + ) + + val api = contentScanningApiProvider.contentScannerApi ?: throw IllegalArgumentException() + return executeRequest(null) { + api.downloadEncrypted(dlBody) + } + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt new file mode 100644 index 0000000000..bcf1fadb47 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks + +import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanApi +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task + +import javax.inject.Inject + +internal interface GetServerPublicKeyTask : Task { + data class Params( + val contentScanApi: ContentScanApi + ) +} + +internal class DefaultGetServerPublicKeyTask @Inject constructor() : GetServerPublicKeyTask { + + override suspend fun execute(params: GetServerPublicKeyTask.Params): String? { + return executeRequest(null) { + params.contentScanApi.getServerPublicKey() + }.publicKey + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt new file mode 100644 index 0000000000..1078a131e2 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks + +import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import org.matrix.android.sdk.api.failure.toScanFailure +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task +import javax.inject.Inject + +internal interface ScanEncryptedTask : Task { + data class Params( + val mxcUrl: String, + val publicServerKey: String?, + val encryptedInfo: ElementToDecrypt + ) +} + +internal class DefaultScanEncryptedTask @Inject constructor( + private val contentScanningApiProvider: ContentScanningApiProvider, + private val contentScanningStore: ContentScanningStore +) : ScanEncryptedTask { + + override suspend fun execute(params: ScanEncryptedTask.Params): ScanResponse { + val mxcUrl = params.mxcUrl + val dlBody = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded(params.publicServerKey, params.mxcUrl, params.encryptedInfo) + + val scannerUrl = contentScanningStore.getScannerUrl() + contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.IN_PROGRESS, scannerUrl) + + try { + val api = contentScanningApiProvider.contentScannerApi ?: throw IllegalArgumentException() + val executeRequest = executeRequest(null) { + api.scanFile(dlBody) + } + contentScanningStore.updateScanResultForContent( + mxcUrl, + scannerUrl, + ScanState.TRUSTED.takeIf { executeRequest.clean } ?: ScanState.INFECTED, + executeRequest.info ?: "" + ) + return executeRequest + } catch (failure: Throwable) { + contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) + throw failure.toScanFailure() ?: failure + } + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt new file mode 100644 index 0000000000..b7ed948afc --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks + +import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import org.matrix.android.sdk.api.failure.toScanFailure +import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task +import javax.inject.Inject + +internal interface ScanMediaTask : Task { + data class Params( + val mxcUrl: String + ) +} + +internal class DefaultScanMediaTask @Inject constructor( + private val contentScanningApiProvider: ContentScanningApiProvider, + private val contentScanningStore: ContentScanningStore +) : ScanMediaTask { + + override suspend fun execute(params: ScanMediaTask.Params): ScanResponse { + // "mxc://server.org/QNDpzLopkoQYNikJfoZCQuCXJ" + if (!params.mxcUrl.startsWith("mxc://")) { + throw IllegalAccessException("Invalid mxc url") + } + val scannerUrl = contentScanningStore.getScannerUrl() + contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.IN_PROGRESS, scannerUrl) + + var serverAndMediaId = params.mxcUrl.removePrefix("mxc://") + val fragmentOffset = serverAndMediaId.indexOf("#") + if (fragmentOffset >= 0) { + serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset) + } + + val split = serverAndMediaId.split("/") + if (split.size != 2) { + throw IllegalAccessException("Invalid mxc url") + } + + try { + val scanResponse = executeRequest(null) { + val api = contentScanningApiProvider.contentScannerApi ?: throw IllegalArgumentException() + api.scanMedia(split[0], split[1]) + } + contentScanningStore.updateScanResultForContent( + params.mxcUrl, + scannerUrl, + ScanState.TRUSTED.takeIf { scanResponse.clean } ?: ScanState.INFECTED, + scanResponse.info ?: "" + ) + return scanResponse + } catch (failure: Throwable) { + contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) + throw failure.toScanFailure() ?: failure + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt index b2035bb2eb..dec396ad1b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt @@ -18,6 +18,8 @@ package org.matrix.android.sdk.api.failure import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.contentscanning.ContentScanError +import org.matrix.android.sdk.api.session.contentscanning.ScanFailure import org.matrix.android.sdk.internal.di.MoshiProvider import java.io.IOException import javax.net.ssl.HttpsURLConnection @@ -100,3 +102,19 @@ fun Throwable.isRegistrationAvailabilityError(): Boolean { error.code == MatrixError.M_INVALID_USERNAME || error.code == MatrixError.M_EXCLUSIVE) } + +/** + * Try to convert to a ScanFailure. Return null in the cases it's not possible + */ +fun Throwable.toScanFailure(): ScanFailure? { + return if (this is Failure.OtherServerError) { + tryOrNull { + MoshiProvider.providesMoshi() + .adapter(ContentScanError::class.java) + .fromJson(errorBody) + } + ?.let { ScanFailure(it, httpCode, this) } + } else { + null + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index dfe43aed6f..97197a3933 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -31,6 +31,7 @@ import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker import org.matrix.android.sdk.api.session.content.ContentUrlResolver +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker @@ -192,6 +193,11 @@ interface Session : */ fun cryptoService(): CryptoService + /** + * Returns the ContentScanningService associated with the session + */ + fun contentScanningService(): ContentScannerService + /** * Returns the identity service associated with the session */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt index 36c471bb2b..56e3cd9796 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt @@ -16,6 +16,8 @@ package org.matrix.android.sdk.api.session.content +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt + /** * This interface defines methods for accessing content from the current session. */ @@ -39,6 +41,15 @@ interface ContentUrlResolver { */ fun resolveFullSize(contentUrl: String?): String? + /** + * Get the ResolvedMethod to download a URL + * + * @param contentUrl the Matrix media content URI (in the form of "mxc://..."). + * @param elementToDecrypt Encryption data may be required if you use a content scanner + * @return the Method to access resource, or null if invalid + */ + fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt? = null): ResolvedMethod? + /** * Get the actual URL for accessing the thumbnail image of a given Matrix media content URI. * @@ -49,4 +60,9 @@ interface ContentUrlResolver { * @return the URL to access the described resource, or null if the url is invalid. */ fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ThumbnailMethod): String? + + sealed class ResolvedMethod { + data class GET(val url: String) : ResolvedMethod() + data class POST(val url:String, val jsonBody: String): ResolvedMethod() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt new file mode 100644 index 0000000000..aeb4d3c287 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package org.matrix.android.sdk.api.session.contentscanning + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class ContentScanError( + @Json(name = "info") val info: String? = null, + @Json(name = "reason") val reason: String? = null +) { + companion object { + // 502 The server failed to request media from the media repo. + const val REASON_MCS_MEDIA_REQUEST_FAILED = "MCS_MEDIA_REQUEST_FAILED" + + /* 400 The server failed to decrypt the encrypted media downloaded from the media repo.*/ + const val REASON_MCS_MEDIA_FAILED_TO_DECRYPT = "MCS_MEDIA_FAILED_TO_DECRYPT" + + /* 403 The server scanned the downloaded media but the antivirus script returned a non-zero exit code.*/ + const val REASON_MCS_MEDIA_NOT_CLEAN = "MCS_MEDIA_NOT_CLEAN" + + /* 403 The provided encrypted_body could not be decrypted. The client should request the public key of the server and then retry (once).*/ + const val REASON_MCS_BAD_DECRYPTION = "MCS_BAD_DECRYPTION" + + /* 400 The request body contains malformed JSON.*/ + const val REASON_MCS_MALFORMED_JSON = "MCS_MALFORMED_JSON" + } +} + +class ScanFailure(val error: ContentScanError, val httpCode: Int, cause: Throwable? = null) : Throwable(cause = cause) + +// For Glide, which deals with Exception and not with Throwable +fun ScanFailure.toException() = Exception(this) +fun Throwable.toScanFailure() = this.cause as? ScanFailure diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt new file mode 100644 index 0000000000..53975f3706 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package org.matrix.android.sdk.api.session.contentscanning + +import androidx.lifecycle.LiveData +import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt + +interface ContentScannerService { + + val serverPublicKey: String? + + fun getContentScannerServer(): String? + /** + * Get the current public curve25519 key that the AV server is advertising. + * @param callback on success callback containing the server public key + */ + fun getServerPublicKey(forceDownload: Boolean = false, callback: MatrixCallback) + + fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) + fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) + + fun setScannerUrl(url: String?) + + fun enableScanner(enabled: Boolean) + fun isScannerEnabled(): Boolean + fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean = true): LiveData> + fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean = true): LiveData> + fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt new file mode 100644 index 0000000000..9b003b65fd --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021 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 org.matrix.android.sdk.internal.session.contentscanning + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt + +/** + * Created to by-pass ProfileTask execution in LoginWizard. + */ +class DisabledContentScannerService : ContentScannerService { + + override val serverPublicKey: String? + get() = null + + override fun getContentScannerServer(): String? { + return null + } + + override fun getServerPublicKey(forceDownload: Boolean, callback: MatrixCallback) { + } + + override fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) { + } + + override fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) { + } + + override fun setScannerUrl(url: String?) { + } + + override fun enableScanner(enabled: Boolean) { + } + + override fun isScannerEnabled(): Boolean { + return false + } + + override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean): LiveData> { + return MutableLiveData() + } + + override fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean): LiveData> { + return MutableLiveData() + } + + override fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? { + return null + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt new file mode 100644 index 0000000000..3371878221 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2020 New Vector Ltd - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + */ + +package org.matrix.android.sdk.api.session.contentscanning + +enum class ScanState { + TRUSTED, + INFECTED, + UNKNOWN, + IN_PROGRESS +} + +data class ScanStatusInfo( + val state : ScanState, + val scanDateTimestamp: Long?, + val humanReadableMessage: String? +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt index b72cff3cf1..111d1263fb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt @@ -33,6 +33,7 @@ import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistration import org.matrix.android.sdk.internal.auth.registration.RegisterAddThreePidTask import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.content.DefaultContentUrlResolver +import org.matrix.android.sdk.internal.session.contentscanning.DisabledContentScannerService internal class DefaultLoginWizard( private val authAPI: AuthAPI, @@ -44,7 +45,7 @@ internal class DefaultLoginWizard( private val getProfileTask: GetProfileTask = DefaultGetProfileTask( authAPI, - DefaultContentUrlResolver(pendingSessionData.homeServerConnectionConfig) + DefaultContentUrlResolver(pendingSessionData.homeServerConnectionConfig, DisabledContentScannerService()) ) override suspend fun getProfileInfo(matrixId: String): LoginProfileInfo { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/DbQualifiers.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/DbQualifiers.kt index 49e155add8..8b78cd0d42 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/DbQualifiers.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/DbQualifiers.kt @@ -37,3 +37,7 @@ internal annotation class CryptoDatabase @Qualifier @Retention(AnnotationRetention.RUNTIME) internal annotation class IdentityDatabase + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +internal annotation class ContentScannerDatabase diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt index 361a306d4f..1ab1042129 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt @@ -38,6 +38,9 @@ internal object NetworkConstants { // Integration const val URI_INTEGRATION_MANAGER_PATH = "_matrix/integrations/v1/" + // Content scanner + const val URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE = "_matrix/media_proxy/unstable/" + // Federation const val URI_FEDERATION_PATH = "_matrix/federation/v1/" } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index c52462612a..7c352a8f99 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -35,6 +35,7 @@ import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker import org.matrix.android.sdk.api.session.content.ContentUrlResolver +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker @@ -124,6 +125,7 @@ internal class DefaultSession @Inject constructor( private val _sharedSecretStorageService: Lazy, private val accountService: Lazy, private val eventService: Lazy, + private val contentScannerService: Lazy, private val identityService: IdentityService, private val integrationManagerService: IntegrationManagerService, private val thirdPartyService: Lazy, @@ -275,6 +277,8 @@ internal class DefaultSession @Inject constructor( override fun cryptoService(): CryptoService = cryptoService.get() + override fun contentScanningService(): ContentScannerService = contentScannerService.get() + override fun identityService() = identityService override fun fileService(): FileService = defaultFileService.get() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt index bc8a707530..7280744eeb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt @@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session import dagger.BindsInstance import dagger.Component +import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.session.Session @@ -94,6 +95,7 @@ import org.matrix.android.sdk.internal.util.system.SystemModule AccountModule::class, FederationModule::class, CallModule::class, + ContentScannerModule::class, SearchModule::class, ThirdPartyModule::class, SpaceModule::class, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt index 5c8cf99dc6..05abc372b4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt @@ -20,11 +20,16 @@ import org.matrix.android.sdk.api.MatrixUrls import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.session.content.ContentUrlResolver +import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.NetworkConstants import org.matrix.android.sdk.internal.util.ensureTrailingSlash import javax.inject.Inject -internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver { +internal class DefaultContentUrlResolver @Inject constructor( + homeServerConnectionConfig: HomeServerConnectionConfig, + private val scannerService: ContentScannerService +) : ContentUrlResolver { private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash() @@ -55,6 +60,10 @@ internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectio } } + override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { + return resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) } + } + private fun resolve(contentUrl: String, prefix: String, params: String = ""): String? { From 0ad66446e7918669d434539b4cbe0de862a77497 Mon Sep 17 00:00:00 2001 From: yostyle Date: Tue, 2 Nov 2021 08:47:08 +0100 Subject: [PATCH 041/319] Move to content scanner matrix SDK to FOSS --- .../content/ElementContentUrlResolver.kt | 112 ------------------ .../sdk/internal/session/SessionComponent.kt | 2 +- .../content/DefaultContentUrlResolver.kt | 48 ++++++-- .../session/contentscanning/ContentScanApi.kt | 8 +- .../contentscanning/ContentScannerModule.kt | 24 ++-- .../ContentScanningApiProvider.kt | 3 +- .../DefaultContentScannerService.kt | 12 +- .../DisabledContentScannerService.kt | 0 .../contentscanning/ScanEncryptorUtils.kt | 8 +- .../data/ContentScanningStore.kt | 2 +- .../db/ContentScanResultEntity.kt | 2 +- .../db/ContentScannerEntityQueries.kt | 2 +- .../db/ContentScannerInfoEntity.kt | 2 +- .../db/ContentScannerRealmModule.kt | 2 +- .../db/RealmContentScannerStore.kt | 4 +- .../contentscanning/model/DownloadBody.kt | 2 +- .../contentscanning/model/ScanResponse.kt | 2 +- .../model/ServerPublicKeyResponse.kt | 2 +- .../tasks/DownloadEncryptedTask.kt | 6 +- .../tasks/GetServerPublicKeyTask.kt | 7 +- .../tasks/ScanEncryptedTask.kt | 10 +- .../contentscanning/tasks/ScanMediaTask.kt | 8 +- 22 files changed, 94 insertions(+), 174 deletions(-) delete mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt (76%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt (66%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt (73%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt (92%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{api => internal}/session/contentscanning/DisabledContentScannerService.kt (100%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt (85%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt (93%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt (94%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt (94%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt (83%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt (86%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt (96%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt (93%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt (87%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt (83%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt (83%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt (75%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt (82%) rename matrix-sdk-android/src/main/java/{im/vector => org}/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt (87%) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt deleted file mode 100644 index e2f0ac2499..0000000000 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/content/ElementContentUrlResolver.kt +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2020 The Matrix.org Foundation C.I.C. - * - * 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.matrix.android.sdk.internal.session.content - -import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toJson -import org.matrix.android.sdk.api.MatrixUrls -import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl -import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig -import org.matrix.android.sdk.api.session.content.ContentUrlResolver -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService -import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt -import org.matrix.android.sdk.internal.network.NetworkConstants -import org.matrix.android.sdk.internal.util.ensureTrailingSlash -import javax.inject.Inject - -internal class ElementContentUrlResolver @Inject constructor( - homeServerConnectionConfig: HomeServerConnectionConfig, - private val scannerService: ContentScannerService -) : ContentUrlResolver { - - private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash() - - override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload" - - override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { - return if (scannerService.isScannerEnabled() && elementToDecrypt != null) { - val baseUrl = scannerService.getContentScannerServer() - val sep = if (baseUrl?.endsWith("/") == true) "" else "/" - - val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted" - - ContentUrlResolver.ResolvedMethod.POST( - url = url, - jsonBody = ScanEncryptorUtils - .getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt) - .toJson() - ) - } else { - resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) } - } - } - - override fun resolveFullSize(contentUrl: String?): String? { - return contentUrl - // do not allow non-mxc content URLs - ?.takeIf { it.isMxcUrl() } - ?.let { - resolve( - contentUrl = it, - toThumbnail = false - ) - } - } - - override fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ContentUrlResolver.ThumbnailMethod): String? { - return contentUrl - // do not allow non-mxc content URLs - ?.takeIf { it.isMxcUrl() } - ?.let { - resolve( - contentUrl = it, - toThumbnail = true, - params = "?width=$width&height=$height&method=${method.value}" - ) - } - } - - private fun resolve(contentUrl: String, - toThumbnail: Boolean, - params: String = ""): String? { - var serverAndMediaId = contentUrl.removePrefix(MatrixUrls.MATRIX_CONTENT_URI_SCHEME) - - val apiPath = if (scannerService.isScannerEnabled()) { - NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE - } else { - NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 - } - val prefix = if (toThumbnail) { - apiPath + "thumbnail/" - } else { - apiPath + "download/" - } - val fragmentOffset = serverAndMediaId.indexOf("#") - var fragment = "" - if (fragmentOffset >= 0) { - fragment = serverAndMediaId.substring(fragmentOffset) - serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset) - } - - val resolvedUrl = if (scannerService.isScannerEnabled()) { - scannerService.getContentScannerServer()!!.ensureTrailingSlash() - } else { - baseUrl - } - return resolvedUrl + prefix + serverAndMediaId + params + fragment - } -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt index 7280744eeb..8e6310026f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session import dagger.BindsInstance import dagger.Component -import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule +import org.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.session.Session diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt index 05abc372b4..4124d5c437 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt @@ -23,6 +23,8 @@ import org.matrix.android.sdk.api.session.content.ContentUrlResolver import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.NetworkConstants +import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import org.matrix.android.sdk.internal.session.contentscanning.model.toJson import org.matrix.android.sdk.internal.util.ensureTrailingSlash import javax.inject.Inject @@ -35,6 +37,24 @@ internal class DefaultContentUrlResolver @Inject constructor( override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload" + override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { + return if (scannerService.isScannerEnabled() && elementToDecrypt != null) { + val baseUrl = scannerService.getContentScannerServer() + val sep = if (baseUrl?.endsWith("/") == true) "" else "/" + + val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted" + + ContentUrlResolver.ResolvedMethod.POST( + url = url, + jsonBody = ScanEncryptorUtils + .getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt) + .toJson() + ) + } else { + resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) } + } + } + override fun resolveFullSize(contentUrl: String?): String? { return contentUrl // do not allow non-mxc content URLs @@ -42,7 +62,7 @@ internal class DefaultContentUrlResolver @Inject constructor( ?.let { resolve( contentUrl = it, - prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "download/" + toThumbnail = false ) } } @@ -54,20 +74,27 @@ internal class DefaultContentUrlResolver @Inject constructor( ?.let { resolve( contentUrl = it, - prefix = NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "thumbnail/", + toThumbnail = true, params = "?width=$width&height=$height&method=${method.value}" ) } } - override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { - return resolveFullSize(contentUrl)?.let { ContentUrlResolver.ResolvedMethod.GET(it) } - } - private fun resolve(contentUrl: String, - prefix: String, + toThumbnail: Boolean, params: String = ""): String? { var serverAndMediaId = contentUrl.removePrefix(MatrixUrls.MATRIX_CONTENT_URI_SCHEME) + + val apiPath = if (scannerService.isScannerEnabled()) { + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + } else { + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + } + val prefix = if (toThumbnail) { + apiPath + "thumbnail/" + } else { + apiPath + "download/" + } val fragmentOffset = serverAndMediaId.indexOf("#") var fragment = "" if (fragmentOffset >= 0) { @@ -75,6 +102,11 @@ internal class DefaultContentUrlResolver @Inject constructor( serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset) } - return baseUrl + prefix + serverAndMediaId + params + fragment + val resolvedUrl = if (scannerService.isScannerEnabled()) { + scannerService.getContentScannerServer()!!.ensureTrailingSlash() + } else { + baseUrl + } + return resolvedUrl + prefix + serverAndMediaId + params + fragment } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt similarity index 76% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt index 44745e4c50..81cff8a177 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanning -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse import okhttp3.ResponseBody import org.matrix.android.sdk.internal.network.NetworkConstants +import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody +import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import org.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt similarity index 66% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt index 02a0c49455..0143a16937 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt @@ -4,22 +4,11 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanning import dagger.Binds import dagger.Module import dagger.Provides -import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import im.vector.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule -import im.vector.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask import io.realm.RealmConfiguration import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService import org.matrix.android.sdk.internal.database.RealmKeysUtils @@ -28,6 +17,17 @@ import org.matrix.android.sdk.internal.di.SessionFilesDirectory import org.matrix.android.sdk.internal.di.UserMd5 import org.matrix.android.sdk.internal.session.SessionModule import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule +import org.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask import java.io.File @Module diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt similarity index 73% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt index 44330ce2d0..3f81c04173 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt @@ -4,9 +4,10 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanning import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.session.contentscanning.ContentScanApi import javax.inject.Inject @SessionScope diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt similarity index 92% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt index e632e8873a..b7292605b1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt @@ -4,17 +4,14 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanning import androidx.lifecycle.LiveData import dagger.Lazy -import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask -import im.vector.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask import kotlinx.coroutines.launch import okhttp3.OkHttpClient import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService import org.matrix.android.sdk.api.session.contentscanning.ScanState @@ -24,9 +21,12 @@ import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.di.Unauthenticated import org.matrix.android.sdk.internal.network.RetrofitFactory import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.launchToCallback -import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers import org.matrix.android.sdk.internal.util.awaitCallback import timber.log.Timber import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DisabledContentScannerService.kt similarity index 100% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/DisabledContentScannerService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DisabledContentScannerService.kt diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt similarity index 85% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt index 7d9f833954..b96305f5ce 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt @@ -4,15 +4,15 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanning import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileKey import org.matrix.android.sdk.internal.crypto.tools.withOlmEncryption -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson +import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody +import org.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody +import org.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson object ScanEncryptorUtils { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt similarity index 93% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt index 74bd3e6db3..f0db66def4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.data +package org.matrix.android.sdk.internal.session.contentscanning.data import androidx.lifecycle.LiveData import org.matrix.android.sdk.api.session.contentscanning.ScanState diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt similarity index 94% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt index 6765461fb1..3125e6c8a6 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanning.db import io.realm.RealmObject import io.realm.annotations.Index diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt similarity index 94% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt index 5056f1d1ba..402fc98e17 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanning.db import io.realm.Realm import io.realm.kotlin.createObject diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt similarity index 83% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt index c54d4e3139..d0a815cc44 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanning.db import io.realm.RealmObject diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt similarity index 86% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt index eb40fa13fb..3d6380c642 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanning.db import io.realm.annotations.RealmModule diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt similarity index 96% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt index a09343139a..16c0ce5075 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt @@ -4,12 +4,12 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanning.db import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import com.zhuinden.monarchy.Monarchy -import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore import org.matrix.android.sdk.api.session.contentscanning.ScanState import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo import io.realm.Realm diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt similarity index 93% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt index 1dac0a9ced..6d0d401fd8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanning.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt similarity index 87% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt index ca4c072b84..549419f3ca 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanning.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt similarity index 83% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt index 57ba2f8263..2706286f56 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanning.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt similarity index 83% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt index 04f2174e67..8bd83b553d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanning.tasks -import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils import okhttp3.ResponseBody import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt similarity index 75% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt index bcf1fadb47..6510065d79 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/GetServerPublicKeyTask.kt @@ -4,13 +4,12 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanning.tasks -import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanApi -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.session.contentscanning.ContentScanApi +import org.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse import org.matrix.android.sdk.internal.task.Task - import javax.inject.Inject internal interface GetServerPublicKeyTask : Task { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt similarity index 82% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt index 1078a131e2..900f40f7c1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt @@ -4,16 +4,16 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanning.tasks -import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import im.vector.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils -import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse import org.matrix.android.sdk.api.failure.toScanFailure import org.matrix.android.sdk.api.session.contentscanning.ScanState import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt similarity index 87% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt index b7ed948afc..5570e218fa 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt @@ -4,14 +4,14 @@ * Proprietary and confidential */ -package im.vector.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanning.tasks -import im.vector.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import im.vector.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import im.vector.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse import org.matrix.android.sdk.api.failure.toScanFailure import org.matrix.android.sdk.api.session.contentscanning.ScanState import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider +import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore +import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject From 016f3faeea5dfd430e43209d1a021244987aa6f9 Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 4 Nov 2021 17:35:02 +0100 Subject: [PATCH 042/319] Update file service --- .../internal/session/DefaultFileService.kt | 24 +++++++++++++++---- .../session/contentscanning/ContentScanApi.kt | 6 ++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt index 46c5967876..14dfc097cf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt @@ -23,8 +23,10 @@ import androidx.core.content.FileProvider import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.completeWith import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.content.ContentUrlResolver @@ -118,12 +120,24 @@ internal class DefaultFileService @Inject constructor( val cachedFiles = getFiles(url, fileName, mimeType, elementToDecrypt != null) if (!cachedFiles.file.exists()) { - val resolvedUrl = contentUrlResolver.resolveFullSize(url) ?: throw IllegalArgumentException("url is null") + val resolvedUrl = contentUrlResolver.resolveForDownload(url, elementToDecrypt) ?: throw IllegalArgumentException("url is null") - val request = Request.Builder() - .url(resolvedUrl) - .header(DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER, url) - .build() + val request = when (resolvedUrl) { + is ContentUrlResolver.ResolvedMethod.GET -> { + Request.Builder() + .url(resolvedUrl.url) + .header(DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER, url) + .build() + } + + is ContentUrlResolver.ResolvedMethod.POST -> { + Request.Builder() + .url(resolvedUrl.url) + .header(DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER, url) + .post(resolvedUrl.jsonBody.toRequestBody("application/json".toMediaType())) + .build() + } + } val response = try { okHttpClient.newCall(request).execute() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt index 81cff8a177..f4ce3b440e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt @@ -25,11 +25,11 @@ internal interface ContentScanApi { suspend fun downloadEncrypted(@Body info: DownloadBody): ResponseBody @POST(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "scan_encrypted") - fun scanFile(@Body info: DownloadBody): ScanResponse + suspend fun scanFile(@Body info: DownloadBody): ScanResponse @GET(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "public_key") - fun getServerPublicKey(): ServerPublicKeyResponse + suspend fun getServerPublicKey(): ServerPublicKeyResponse @GET(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "scan/{domain}/{mediaId}") - fun scanMedia(@Path(value = "domain") domain: String, @Path(value = "mediaId") mediaId: String): ScanResponse + suspend fun scanMedia(@Path(value = "domain") domain: String, @Path(value = "mediaId") mediaId: String): ScanResponse } From 98ae9d0e8afa476da98aebe6bddb792fd4af25da Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 4 Nov 2021 18:00:42 +0100 Subject: [PATCH 043/319] Refactoring --- .../android/sdk/api/failure/Extensions.kt | 6 +-- .../matrix/android/sdk/api/session/Session.kt | 6 +-- .../ContentScannerError.kt} | 6 +-- .../ContentScannerService.kt | 2 +- .../ScanState.kt | 2 +- .../internal/auth/login/DefaultLoginWizard.kt | 2 +- .../sdk/internal/session/DefaultSession.kt | 4 +- .../sdk/internal/session/SessionComponent.kt | 2 +- .../content/DefaultContentUrlResolver.kt | 6 +-- .../ContentScannerApi.kt} | 10 ++-- .../ContentScannerApiProvider.kt} | 7 ++- .../ContentScannerModule.kt | 28 +++++------ .../DefaultContentScannerService.kt | 46 +++++++++---------- .../DisabledContentScannerService.kt | 6 +-- .../ScanEncryptorUtils.kt | 8 ++-- .../data/ContentScannerStore.kt} | 8 ++-- .../db/ContentScanResultEntity.kt | 6 +-- .../db/ContentScannerEntityQueries.kt | 2 +- .../db/ContentScannerInfoEntity.kt | 2 +- .../db/ContentScannerRealmModule.kt | 2 +- .../db/RealmContentScannerStore.kt | 10 ++-- .../model/DownloadBody.kt | 2 +- .../model/ScanResponse.kt | 2 +- .../model/ServerPublicKeyResponse.kt | 2 +- .../tasks/DownloadEncryptedTask.kt | 10 ++-- .../tasks/GetServerPublicKeyTask.kt | 10 ++-- .../tasks/ScanEncryptedTask.kt | 26 +++++------ .../tasks/ScanMediaTask.kt | 24 +++++----- 28 files changed, 123 insertions(+), 124 deletions(-) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/{contentscanning/ContentScanError.kt => contentscanner/ContentScannerError.kt} (87%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/{contentscanning => contentscanner}/ContentScannerService.kt (96%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/{contentscanning => contentscanner}/ScanState.kt (86%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning/ContentScanApi.kt => contentscanner/ContentScannerApi.kt} (75%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning/ContentScanningApiProvider.kt => contentscanner/ContentScannerApiProvider.kt} (51%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/ContentScannerModule.kt (64%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/DefaultContentScannerService.kt (72%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/DisabledContentScannerService.kt (90%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/ScanEncryptorUtils.kt (86%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning/data/ContentScanningStore.kt => contentscanner/data/ContentScannerStore.kt} (76%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/db/ContentScanResultEntity.kt (84%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/db/ContentScannerEntityQueries.kt (94%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/db/ContentScannerInfoEntity.kt (84%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/db/ContentScannerRealmModule.kt (87%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/db/RealmContentScannerStore.kt (93%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/model/DownloadBody.kt (93%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/model/ScanResponse.kt (88%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/model/ServerPublicKeyResponse.kt (84%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/tasks/DownloadEncryptedTask.kt (73%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/tasks/GetServerPublicKeyTask.kt (66%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/tasks/ScanEncryptedTask.kt (59%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{contentscanning => contentscanner}/tasks/ScanMediaTask.kt (64%) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt index dec396ad1b..13a26c89c1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt @@ -18,8 +18,8 @@ package org.matrix.android.sdk.api.failure import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse import org.matrix.android.sdk.api.extensions.tryOrNull -import org.matrix.android.sdk.api.session.contentscanning.ContentScanError -import org.matrix.android.sdk.api.session.contentscanning.ScanFailure +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerError +import org.matrix.android.sdk.api.session.contentscanner.ScanFailure import org.matrix.android.sdk.internal.di.MoshiProvider import java.io.IOException import javax.net.ssl.HttpsURLConnection @@ -110,7 +110,7 @@ fun Throwable.toScanFailure(): ScanFailure? { return if (this is Failure.OtherServerError) { tryOrNull { MoshiProvider.providesMoshi() - .adapter(ContentScanError::class.java) + .adapter(ContentScannerError::class.java) .fromJson(errorBody) } ?.let { ScanFailure(it, httpCode, this) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index 97197a3933..3f817ec4d2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -31,7 +31,7 @@ import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker import org.matrix.android.sdk.api.session.content.ContentUrlResolver -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker @@ -194,9 +194,9 @@ interface Session : fun cryptoService(): CryptoService /** - * Returns the ContentScanningService associated with the session + * Returns the ContentScannerService associated with the session */ - fun contentScanningService(): ContentScannerService + fun contentScannerService(): ContentScannerService /** * Returns the identity service associated with the session diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt similarity index 87% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt index aeb4d3c287..31c512721c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScanError.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.api.session.contentscanning +package org.matrix.android.sdk.api.session.contentscanner import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class ContentScanError( +data class ContentScannerError( @Json(name = "info") val info: String? = null, @Json(name = "reason") val reason: String? = null ) { @@ -32,7 +32,7 @@ data class ContentScanError( } } -class ScanFailure(val error: ContentScanError, val httpCode: Int, cause: Throwable? = null) : Throwable(cause = cause) +class ScanFailure(val error: ContentScannerError, val httpCode: Int, cause: Throwable? = null) : Throwable(cause = cause) // For Glide, which deals with Exception and not with Throwable fun ScanFailure.toException() = Exception(this) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt similarity index 96% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt index 53975f3706..47e4e4296b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.api.session.contentscanning +package org.matrix.android.sdk.api.session.contentscanner import androidx.lifecycle.LiveData import org.matrix.android.sdk.api.MatrixCallback diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt similarity index 86% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt index 3371878221..578d8ca185 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanning/ScanState.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.api.session.contentscanning +package org.matrix.android.sdk.api.session.contentscanner enum class ScanState { TRUSTED, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt index 111d1263fb..0583951138 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt @@ -33,7 +33,7 @@ import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistration import org.matrix.android.sdk.internal.auth.registration.RegisterAddThreePidTask import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.content.DefaultContentUrlResolver -import org.matrix.android.sdk.internal.session.contentscanning.DisabledContentScannerService +import org.matrix.android.sdk.internal.session.contentscanner.DisabledContentScannerService internal class DefaultLoginWizard( private val authAPI: AuthAPI, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index 7c352a8f99..f0ad0f87b0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -35,7 +35,7 @@ import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker import org.matrix.android.sdk.api.session.content.ContentUrlResolver -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker @@ -277,7 +277,7 @@ internal class DefaultSession @Inject constructor( override fun cryptoService(): CryptoService = cryptoService.get() - override fun contentScanningService(): ContentScannerService = contentScannerService.get() + override fun contentScannerService(): ContentScannerService = contentScannerService.get() override fun identityService() = identityService diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt index 8e6310026f..a3f8f5dc6d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session import dagger.BindsInstance import dagger.Component -import org.matrix.android.sdk.internal.session.contentscanning.ContentScannerModule +import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerModule import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.session.Session diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt index 4124d5c437..d710fd36c3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt @@ -20,11 +20,11 @@ import org.matrix.android.sdk.api.MatrixUrls import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.session.content.ContentUrlResolver -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.NetworkConstants -import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils -import org.matrix.android.sdk.internal.session.contentscanning.model.toJson +import org.matrix.android.sdk.internal.session.contentscanner.ScanEncryptorUtils +import org.matrix.android.sdk.internal.session.contentscanner.model.toJson import org.matrix.android.sdk.internal.util.ensureTrailingSlash import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt similarity index 75% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt index f4ce3b440e..b7703a9a15 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanApi.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import okhttp3.ResponseBody import org.matrix.android.sdk.internal.network.NetworkConstants -import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody -import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse -import org.matrix.android.sdk.internal.session.contentscanning.model.ServerPublicKeyResponse +import org.matrix.android.sdk.internal.session.contentscanner.model.DownloadBody +import org.matrix.android.sdk.internal.session.contentscanner.model.ScanResponse +import org.matrix.android.sdk.internal.session.contentscanner.model.ServerPublicKeyResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST @@ -19,7 +19,7 @@ import retrofit2.http.Path /** * https://github.com/matrix-org/matrix-content-scanner */ -internal interface ContentScanApi { +internal interface ContentScannerApi { @POST(NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted") suspend fun downloadEncrypted(@Body info: DownloadBody): ResponseBody diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt similarity index 51% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt index 3f81c04173..45f63e21d7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScanningApiProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt @@ -4,13 +4,12 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.session.contentscanning.ContentScanApi import javax.inject.Inject @SessionScope -internal class ContentScanningApiProvider @Inject constructor() { - var contentScannerApi: ContentScanApi? = null +internal class ContentScannerApiProvider @Inject constructor() { + var contentScannerApi: ContentScannerApi? = null } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt similarity index 64% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt index 0143a16937..a9b3809104 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ContentScannerModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt @@ -4,30 +4,30 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import dagger.Binds import dagger.Module import dagger.Provides import io.realm.RealmConfiguration -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.internal.database.RealmKeysUtils import org.matrix.android.sdk.internal.di.ContentScannerDatabase import org.matrix.android.sdk.internal.di.SessionFilesDirectory import org.matrix.android.sdk.internal.di.UserMd5 import org.matrix.android.sdk.internal.session.SessionModule import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import org.matrix.android.sdk.internal.session.contentscanning.db.ContentScannerRealmModule -import org.matrix.android.sdk.internal.session.contentscanning.db.RealmContentScannerStore -import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultDownloadEncryptedTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultGetServerPublicKeyTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanEncryptedTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.DefaultScanMediaTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.DownloadEncryptedTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanner.db.ContentScannerRealmModule +import org.matrix.android.sdk.internal.session.contentscanner.db.RealmContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanner.tasks.DefaultDownloadEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.DefaultGetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.DefaultScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.DefaultScanMediaTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.DownloadEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.GetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanMediaTask import java.io.File @Module @@ -58,7 +58,7 @@ internal abstract class ContentScannerModule { abstract fun bindContentScannerService(service: DefaultContentScannerService): ContentScannerService @Binds - abstract fun bindContentScannerStore(store: RealmContentScannerStore): ContentScanningStore + abstract fun bindContentScannerStore(store: RealmContentScannerStore): ContentScannerStore @Binds abstract fun bindDownloadEncryptedTask(task: DefaultDownloadEncryptedTask): DownloadEncryptedTask diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt similarity index 72% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt index b7292605b1..adfa8ef4d6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DefaultContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import androidx.lifecycle.LiveData import dagger.Lazy @@ -13,18 +13,18 @@ import okhttp3.OkHttpClient import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.NoOpMatrixCallback -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService -import org.matrix.android.sdk.api.session.contentscanning.ScanState -import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.di.Unauthenticated import org.matrix.android.sdk.internal.network.RetrofitFactory import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import org.matrix.android.sdk.internal.session.contentscanning.tasks.GetServerPublicKeyTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanEncryptedTask -import org.matrix.android.sdk.internal.session.contentscanning.tasks.ScanMediaTask +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanner.tasks.GetServerPublicKeyTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanEncryptedTask +import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanMediaTask import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.launchToCallback import org.matrix.android.sdk.internal.util.awaitCallback @@ -36,8 +36,8 @@ internal class DefaultContentScannerService @Inject constructor( private val retrofitFactory: RetrofitFactory, @Unauthenticated private val okHttpClient: Lazy, - private val contentScanningApiProvider: ContentScanningApiProvider, - private val contentScanningStore: ContentScanningStore, + private val contentScannerApiProvider: ContentScannerApiProvider, + private val contentScannerStore: ContentScannerStore, // private val sessionParams: SessionParams, private val getServerPublicKeyTask: GetServerPublicKeyTask, private val scanEncryptedTask: ScanEncryptedTask, @@ -51,11 +51,11 @@ internal class DefaultContentScannerService @Inject constructor( private set override fun getContentScannerServer(): String? { - return contentScanningStore.getScannerUrl() + return contentScannerStore.getScannerUrl() } override fun getServerPublicKey(forceDownload: Boolean, callback: MatrixCallback) { - val api = contentScanningApiProvider.contentScannerApi ?: return Unit.also { + val api = contentScannerApiProvider.contentScannerApi ?: return Unit.also { callback.onFailure(IllegalArgumentException("No content scanner defined")) } @@ -102,15 +102,15 @@ internal class DefaultContentScannerService @Inject constructor( } } - override fun setScannerUrl(url: String?) = contentScanningStore.setScannerUrl(url).also { + override fun setScannerUrl(url: String?) = contentScannerStore.setScannerUrl(url).also { if (url == null) { - contentScanningApiProvider.contentScannerApi = null + contentScannerApiProvider.contentScannerApi = null serverPublicKey = null } else { val api = retrofitFactory .create(okHttpClient, url) - .create(ContentScanApi::class.java) - contentScanningApiProvider.contentScannerApi = api + .create(ContentScannerApi::class.java) + contentScannerApiProvider.contentScannerApi = api taskExecutor.executorScope.launch(coroutineDispatchers.io) { try { @@ -124,25 +124,25 @@ internal class DefaultContentScannerService @Inject constructor( } } - override fun enableScanner(enabled: Boolean) = contentScanningStore.enableScanning(enabled) + override fun enableScanner(enabled: Boolean) = contentScannerStore.enableScanning(enabled) - override fun isScannerEnabled(): Boolean = contentScanningStore.isScanEnabled() + override fun isScannerEnabled(): Boolean = contentScannerStore.isScanEnabled() override fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? { - return contentScanningStore.getScanResult(mxcUrl) + return contentScannerStore.getScanResult(mxcUrl) } override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean): LiveData> { - val data = contentScanningStore.getLiveScanResult(mxcUrl) - if (fetchIfNeeded && !contentScanningStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { + val data = contentScannerStore.getLiveScanResult(mxcUrl) + if (fetchIfNeeded && !contentScannerStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { getScanResultForAttachment(mxcUrl, NoOpMatrixCallback()) } return data } override fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean): LiveData> { - val data = contentScanningStore.getLiveScanResult(mxcUrl) - if (fetchIfNeeded && !contentScanningStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { + val data = contentScannerStore.getLiveScanResult(mxcUrl) + if (fetchIfNeeded && !contentScannerStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { getScanResultForAttachment(mxcUrl, fileInfo, NoOpMatrixCallback()) } return data diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DisabledContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DisabledContentScannerService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt index 9b003b65fd..6daa094ed2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/DisabledContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.contentscanning.ContentScannerService -import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt similarity index 86% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt index b96305f5ce..567002750f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/ScanEncryptorUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt @@ -4,15 +4,15 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning +package org.matrix.android.sdk.internal.session.contentscanner import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileKey import org.matrix.android.sdk.internal.crypto.tools.withOlmEncryption -import org.matrix.android.sdk.internal.session.contentscanning.model.DownloadBody -import org.matrix.android.sdk.internal.session.contentscanning.model.EncryptedBody -import org.matrix.android.sdk.internal.session.contentscanning.model.toCanonicalJson +import org.matrix.android.sdk.internal.session.contentscanner.model.DownloadBody +import org.matrix.android.sdk.internal.session.contentscanner.model.EncryptedBody +import org.matrix.android.sdk.internal.session.contentscanner.model.toCanonicalJson object ScanEncryptorUtils { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt similarity index 76% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt index f0db66def4..af43c75c04 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/data/ContentScanningStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt @@ -4,14 +4,14 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.data +package org.matrix.android.sdk.internal.session.contentscanner.data import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.session.contentscanning.ScanState -import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.session.contentscanner.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.util.Optional -internal interface ContentScanningStore { +internal interface ContentScannerStore { fun getScannerUrl(): String? diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt similarity index 84% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt index 3125e6c8a6..33284b2556 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScanResultEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanner.db import io.realm.RealmObject import io.realm.annotations.Index import org.matrix.android.sdk.api.extensions.tryOrNull -import org.matrix.android.sdk.api.session.contentscanning.ScanState -import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.api.session.contentscanner.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo internal open class ContentScanResultEntity( @Index diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt similarity index 94% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt index 402fc98e17..fcabae730b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanner.db import io.realm.Realm import io.realm.kotlin.createObject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt similarity index 84% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt index d0a815cc44..da0011db72 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanner.db import io.realm.RealmObject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt similarity index 87% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt index 3d6380c642..aec926beef 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/ContentScannerRealmModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanner.db import io.realm.annotations.RealmModule diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt similarity index 93% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt index 16c0ce5075..6b561c3720 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/db/RealmContentScannerStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt @@ -4,14 +4,14 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.db +package org.matrix.android.sdk.internal.session.contentscanner.db import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import com.zhuinden.monarchy.Monarchy -import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import org.matrix.android.sdk.api.session.contentscanning.ScanState -import org.matrix.android.sdk.api.session.contentscanning.ScanStatusInfo +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore +import org.matrix.android.sdk.api.session.contentscanner.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import io.realm.Realm import io.realm.RealmConfiguration import io.realm.kotlin.createObject @@ -28,7 +28,7 @@ import javax.inject.Inject internal class RealmContentScannerStore @Inject constructor( @ContentScannerDatabase private val realmConfiguration: RealmConfiguration -) : ContentScanningStore { +) : ContentScannerStore { private val monarchy = Monarchy.Builder() .setRealmConfiguration(realmConfiguration) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt similarity index 93% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt index 6d0d401fd8..fbb0688225 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/DownloadBody.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanner.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt similarity index 88% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt index 549419f3ca..0a730d614c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ScanResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanner.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt similarity index 84% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt index 2706286f56..ca6ffe96b3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/model/ServerPublicKeyResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt @@ -4,7 +4,7 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.model +package org.matrix.android.sdk.internal.session.contentscanner.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt similarity index 73% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt index 8bd83b553d..6a9e217740 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/DownloadEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt @@ -4,13 +4,13 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanner.tasks import okhttp3.ResponseBody import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.executeRequest -import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils +import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerApiProvider +import org.matrix.android.sdk.internal.session.contentscanner.ScanEncryptorUtils import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject @@ -23,7 +23,7 @@ internal interface DownloadEncryptedTask : Task { data class Params( - val contentScanApi: ContentScanApi + val contentScannerApi: ContentScannerApi ) } @@ -22,7 +22,7 @@ internal class DefaultGetServerPublicKeyTask @Inject constructor() : GetServerPu override suspend fun execute(params: GetServerPublicKeyTask.Params): String? { return executeRequest(null) { - params.contentScanApi.getServerPublicKey() + params.contentScannerApi.getServerPublicKey() }.publicKey } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt similarity index 59% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt index 900f40f7c1..c1185e02ba 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt @@ -4,16 +4,16 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanner.tasks import org.matrix.android.sdk.api.failure.toScanFailure -import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanState import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.internal.network.executeRequest -import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import org.matrix.android.sdk.internal.session.contentscanning.ScanEncryptorUtils -import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerApiProvider +import org.matrix.android.sdk.internal.session.contentscanner.ScanEncryptorUtils +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanner.model.ScanResponse import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject @@ -26,23 +26,23 @@ internal interface ScanEncryptedTask : Task(null) { api.scanFile(dlBody) } - contentScanningStore.updateScanResultForContent( + contentScannerStore.updateScanResultForContent( mxcUrl, scannerUrl, ScanState.TRUSTED.takeIf { executeRequest.clean } ?: ScanState.INFECTED, @@ -50,7 +50,7 @@ internal class DefaultScanEncryptedTask @Inject constructor( ) return executeRequest } catch (failure: Throwable) { - contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) + contentScannerStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) throw failure.toScanFailure() ?: failure } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt similarity index 64% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt index 5570e218fa..66f5dfef63 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanning/tasks/ScanMediaTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt @@ -4,14 +4,14 @@ * Proprietary and confidential */ -package org.matrix.android.sdk.internal.session.contentscanning.tasks +package org.matrix.android.sdk.internal.session.contentscanner.tasks import org.matrix.android.sdk.api.failure.toScanFailure -import org.matrix.android.sdk.api.session.contentscanning.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanState import org.matrix.android.sdk.internal.network.executeRequest -import org.matrix.android.sdk.internal.session.contentscanning.ContentScanningApiProvider -import org.matrix.android.sdk.internal.session.contentscanning.data.ContentScanningStore -import org.matrix.android.sdk.internal.session.contentscanning.model.ScanResponse +import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerApiProvider +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore +import org.matrix.android.sdk.internal.session.contentscanner.model.ScanResponse import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject @@ -22,8 +22,8 @@ internal interface ScanMediaTask : Task { } internal class DefaultScanMediaTask @Inject constructor( - private val contentScanningApiProvider: ContentScanningApiProvider, - private val contentScanningStore: ContentScanningStore + private val contentScannerApiProvider: ContentScannerApiProvider, + private val contentScannerStore: ContentScannerStore ) : ScanMediaTask { override suspend fun execute(params: ScanMediaTask.Params): ScanResponse { @@ -31,8 +31,8 @@ internal class DefaultScanMediaTask @Inject constructor( if (!params.mxcUrl.startsWith("mxc://")) { throw IllegalAccessException("Invalid mxc url") } - val scannerUrl = contentScanningStore.getScannerUrl() - contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.IN_PROGRESS, scannerUrl) + val scannerUrl = contentScannerStore.getScannerUrl() + contentScannerStore.updateStateForContent(params.mxcUrl, ScanState.IN_PROGRESS, scannerUrl) var serverAndMediaId = params.mxcUrl.removePrefix("mxc://") val fragmentOffset = serverAndMediaId.indexOf("#") @@ -47,10 +47,10 @@ internal class DefaultScanMediaTask @Inject constructor( try { val scanResponse = executeRequest(null) { - val api = contentScanningApiProvider.contentScannerApi ?: throw IllegalArgumentException() + val api = contentScannerApiProvider.contentScannerApi ?: throw IllegalArgumentException() api.scanMedia(split[0], split[1]) } - contentScanningStore.updateScanResultForContent( + contentScannerStore.updateScanResultForContent( params.mxcUrl, scannerUrl, ScanState.TRUSTED.takeIf { scanResponse.clean } ?: ScanState.INFECTED, @@ -58,7 +58,7 @@ internal class DefaultScanMediaTask @Inject constructor( ) return scanResponse } catch (failure: Throwable) { - contentScanningStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) + contentScannerStore.updateStateForContent(params.mxcUrl, ScanState.UNKNOWN, scannerUrl) throw failure.toScanFailure() ?: failure } } From 7a78bc68666110f227eac886d438a671319ea789 Mon Sep 17 00:00:00 2001 From: yostyle Date: Wed, 10 Nov 2021 16:32:35 +0100 Subject: [PATCH 044/319] Replace matrix callbacks by coroutines --- .../contentscanner/ContentScannerError.kt | 16 ++- .../contentscanner/ContentScannerService.kt | 25 +++-- .../api/session/contentscanner/ScanState.kt | 16 ++- .../contentscanner/ContentScannerApi.kt | 16 ++- .../ContentScannerApiProvider.kt | 16 ++- .../contentscanner/ContentScannerModule.kt | 18 ++- .../DefaultContentScannerService.kt | 103 +++++++----------- .../DisabledContentScannerService.kt | 21 ++-- .../contentscanner/ScanEncryptorUtils.kt | 18 ++- .../data/ContentScannerStore.kt | 18 ++- .../db/ContentScanResultEntity.kt | 16 ++- .../db/ContentScannerEntityQueries.kt | 16 ++- .../db/ContentScannerInfoEntity.kt | 16 ++- .../db/ContentScannerRealmModule.kt | 16 ++- .../db/RealmContentScannerStore.kt | 18 ++- .../contentscanner/model/DownloadBody.kt | 24 ++-- .../contentscanner/model/ScanResponse.kt | 18 ++- .../model/ServerPublicKeyResponse.kt | 18 ++- .../tasks/DownloadEncryptedTask.kt | 16 ++- .../tasks/GetServerPublicKeyTask.kt | 16 ++- .../contentscanner/tasks/ScanEncryptedTask.kt | 16 ++- .../contentscanner/tasks/ScanMediaTask.kt | 16 ++- 22 files changed, 324 insertions(+), 149 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt index 31c512721c..cef5d41f2c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerError.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session.contentscanner diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt index 47e4e4296b..0c45e6a132 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt @@ -1,13 +1,22 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session.contentscanner import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt @@ -20,16 +29,14 @@ interface ContentScannerService { * Get the current public curve25519 key that the AV server is advertising. * @param callback on success callback containing the server public key */ - fun getServerPublicKey(forceDownload: Boolean = false, callback: MatrixCallback) + suspend fun getServerPublicKey(forceDownload: Boolean = false): String? - fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) - fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) + suspend fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt? = null): ScanStatusInfo fun setScannerUrl(url: String?) fun enableScanner(enabled: Boolean) fun isScannerEnabled(): Boolean - fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean = true): LiveData> - fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean = true): LiveData> + fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean = true, fileInfo: ElementToDecrypt? = null): LiveData> fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt index 578d8ca185..aeb1551cf7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session.contentscanner diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt index b7703a9a15..46f1705806 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApi.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt index 45f63e21d7..d8548bb238 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerApiProvider.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt index a9b3809104..7ea74225cd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ContentScannerModule.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner @@ -55,7 +65,7 @@ internal abstract class ContentScannerModule { } @Binds - abstract fun bindContentScannerService(service: DefaultContentScannerService): ContentScannerService + abstract fun bindContentScannerService(service: DisabledContentScannerService): ContentScannerService @Binds abstract fun bindContentScannerStore(store: RealmContentScannerStore): ContentScannerStore diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt index adfa8ef4d6..4ecb337603 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner @@ -10,9 +20,6 @@ import androidx.lifecycle.LiveData import dagger.Lazy import kotlinx.coroutines.launch import okhttp3.OkHttpClient -import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.MatrixCoroutineDispatchers -import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.api.session.contentscanner.ScanState import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo @@ -26,8 +33,6 @@ import org.matrix.android.sdk.internal.session.contentscanner.tasks.GetServerPub import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanEncryptedTask import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanMediaTask import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.launchToCallback -import org.matrix.android.sdk.internal.util.awaitCallback import timber.log.Timber import javax.inject.Inject @@ -38,12 +43,10 @@ internal class DefaultContentScannerService @Inject constructor( private val okHttpClient: Lazy, private val contentScannerApiProvider: ContentScannerApiProvider, private val contentScannerStore: ContentScannerStore, -// private val sessionParams: SessionParams, private val getServerPublicKeyTask: GetServerPublicKeyTask, private val scanEncryptedTask: ScanEncryptedTask, private val scanMediaTask: ScanMediaTask, - private val taskExecutor: TaskExecutor, - private val coroutineDispatchers: MatrixCoroutineDispatchers + private val taskExecutor: TaskExecutor ) : ContentScannerService { // Cache public key in memory @@ -54,52 +57,34 @@ internal class DefaultContentScannerService @Inject constructor( return contentScannerStore.getScannerUrl() } - override fun getServerPublicKey(forceDownload: Boolean, callback: MatrixCallback) { - val api = contentScannerApiProvider.contentScannerApi ?: return Unit.also { - callback.onFailure(IllegalArgumentException("No content scanner defined")) - } + override suspend fun getServerPublicKey(forceDownload: Boolean): String? { + val api = contentScannerApiProvider.contentScannerApi ?: throw IllegalArgumentException("No content scanner define") if (!forceDownload && serverPublicKey != null) { - callback.onSuccess(serverPublicKey) - return + return serverPublicKey } - taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { - getServerPublicKeyTask.execute(GetServerPublicKeyTask.Params(api)).also { - serverPublicKey = it - } + + return getServerPublicKeyTask.execute(GetServerPublicKeyTask.Params(api)).also { + serverPublicKey = it } } - override fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) { - taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { - val serverPublicKey = serverPublicKey ?: awaitCallback { - getServerPublicKey(false, it) - } - - val result = scanEncryptedTask.execute(ScanEncryptedTask.Params( + override suspend fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt?): ScanStatusInfo { + val result = if (fileInfo != null) { + scanEncryptedTask.execute(ScanEncryptedTask.Params( mxcUrl = mxcUrl, - publicServerKey = serverPublicKey, + publicServerKey = getServerPublicKey(false), encryptedInfo = fileInfo )) - - ScanStatusInfo( - state = if (result.clean) ScanState.TRUSTED else ScanState.INFECTED, - humanReadableMessage = result.info, - scanDateTimestamp = System.currentTimeMillis() - ) + } else { + scanMediaTask.execute(ScanMediaTask.Params(mxcUrl)) } - } - override fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) { - taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, callback) { - val result = scanMediaTask.execute(ScanMediaTask.Params(mxcUrl)) - - ScanStatusInfo( - state = if (result.clean) ScanState.TRUSTED else ScanState.INFECTED, - humanReadableMessage = result.info, - scanDateTimestamp = System.currentTimeMillis() - ) - } + return ScanStatusInfo( + state = if (result.clean) ScanState.TRUSTED else ScanState.INFECTED, + humanReadableMessage = result.info, + scanDateTimestamp = System.currentTimeMillis() + ) } override fun setScannerUrl(url: String?) = contentScannerStore.setScannerUrl(url).also { @@ -112,11 +97,9 @@ internal class DefaultContentScannerService @Inject constructor( .create(ContentScannerApi::class.java) contentScannerApiProvider.contentScannerApi = api - taskExecutor.executorScope.launch(coroutineDispatchers.io) { + taskExecutor.executorScope.launch { try { - awaitCallback { - getServerPublicKey(true, it) - } + getServerPublicKey(true) } catch (failure: Throwable) { Timber.e("Failed to get public server api") } @@ -124,7 +107,7 @@ internal class DefaultContentScannerService @Inject constructor( } } - override fun enableScanner(enabled: Boolean) = contentScannerStore.enableScanning(enabled) + override fun enableScanner(enabled: Boolean) = contentScannerStore.enableScanner(enabled) override fun isScannerEnabled(): Boolean = contentScannerStore.isScanEnabled() @@ -132,18 +115,16 @@ internal class DefaultContentScannerService @Inject constructor( return contentScannerStore.getScanResult(mxcUrl) } - override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean): LiveData> { + override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean, fileInfo: ElementToDecrypt?): LiveData> { val data = contentScannerStore.getLiveScanResult(mxcUrl) if (fetchIfNeeded && !contentScannerStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { - getScanResultForAttachment(mxcUrl, NoOpMatrixCallback()) - } - return data - } - - override fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean): LiveData> { - val data = contentScannerStore.getLiveScanResult(mxcUrl) - if (fetchIfNeeded && !contentScannerStore.isScanResultKnownOrInProgress(mxcUrl, getContentScannerServer())) { - getScanResultForAttachment(mxcUrl, fileInfo, NoOpMatrixCallback()) + taskExecutor.executorScope.launch { + try { + getScanResultForAttachment(mxcUrl, fileInfo) + } catch (failure: Throwable) { + Timber.e("Failed to get file status : ${failure.localizedMessage}") + } + } } return data } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt index 6daa094ed2..240a8deaba 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt @@ -18,16 +18,18 @@ package org.matrix.android.sdk.internal.session.contentscanner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.contentscanner.ContentScannerService import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt +import org.matrix.android.sdk.internal.session.SessionScope +import javax.inject.Inject /** * Created to by-pass ProfileTask execution in LoginWizard. */ -class DisabledContentScannerService : ContentScannerService { +@SessionScope +internal class DisabledContentScannerService @Inject constructor() : ContentScannerService { override val serverPublicKey: String? get() = null @@ -36,13 +38,12 @@ class DisabledContentScannerService : ContentScannerService { return null } - override fun getServerPublicKey(forceDownload: Boolean, callback: MatrixCallback) { + override suspend fun getServerPublicKey(forceDownload: Boolean): String? { + return null } - override fun getScanResultForAttachment(mxcUrl: String, callback: MatrixCallback) { - } - - override fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt, callback: MatrixCallback) { + override suspend fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt?): ScanStatusInfo { + TODO("Not yet implemented") } override fun setScannerUrl(url: String?) { @@ -55,11 +56,7 @@ class DisabledContentScannerService : ContentScannerService { return false } - override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean): LiveData> { - return MutableLiveData() - } - - override fun getLiveStatusForEncryptedFile(mxcUrl: String, fileInfo: ElementToDecrypt, fetchIfNeeded: Boolean): LiveData> { + override fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean, fileInfo: ElementToDecrypt?): LiveData> { return MutableLiveData() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt index 567002750f..8fc84a487e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/ScanEncryptorUtils.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner @@ -14,7 +24,7 @@ import org.matrix.android.sdk.internal.session.contentscanner.model.DownloadBody import org.matrix.android.sdk.internal.session.contentscanner.model.EncryptedBody import org.matrix.android.sdk.internal.session.contentscanner.model.toCanonicalJson -object ScanEncryptorUtils { +internal object ScanEncryptorUtils { fun getDownloadBodyAndEncryptIfNeeded(publicServerKey: String?, mxcUrl: String, elementToDecrypt: ElementToDecrypt): DownloadBody { // TODO, upstream refactoring changed the object model here... diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt index af43c75c04..5cfe851a5c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/data/ContentScannerStore.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.data @@ -17,7 +27,7 @@ internal interface ContentScannerStore { fun setScannerUrl(url: String?) - fun enableScanning(enabled: Boolean) + fun enableScanner(enabled: Boolean) fun isScanEnabled(): Boolean diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt index 33284b2556..8befba17e2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.db diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt index fcabae730b..b47be235c6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerEntityQueries.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.db diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt index da0011db72..d1910de36a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerInfoEntity.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.db diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt index aec926beef..bb53140ad9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScannerRealmModule.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.db diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt index 6b561c3720..11b9439c2f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.db @@ -52,7 +62,7 @@ internal class RealmContentScannerStore @Inject constructor( } } - override fun enableScanning(enabled: Boolean) { + override fun enableScanner(enabled: Boolean) { monarchy.runTransactionSync { realm -> val info = realm.where().findFirst() ?: realm.createObject() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt index fbb0688225..5bac96a0c0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/DownloadBody.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.model @@ -13,18 +23,18 @@ import org.matrix.android.sdk.internal.di.MoshiProvider import org.matrix.android.sdk.internal.util.JsonCanonicalizer @JsonClass(generateAdapter = true) -data class DownloadBody( +internal data class DownloadBody( @Json(name = "file") val file: EncryptedFileInfo? = null, @Json(name = "encrypted_body") val encryptedBody: EncryptedBody? = null ) @JsonClass(generateAdapter = true) -data class EncryptedBody( +internal data class EncryptedBody( @Json(name = "ciphertext") val cipherText: String, @Json(name = "mac") val mac: String, @Json(name = "ephemeral") val ephemeral: String ) -fun DownloadBody.toJson(): String = MoshiProvider.providesMoshi().adapter(DownloadBody::class.java).toJson(this) +internal fun DownloadBody.toJson(): String = MoshiProvider.providesMoshi().adapter(DownloadBody::class.java).toJson(this) -fun DownloadBody.toCanonicalJson() = JsonCanonicalizer.getCanonicalJson(DownloadBody::class.java, this) +internal fun DownloadBody.toCanonicalJson() = JsonCanonicalizer.getCanonicalJson(DownloadBody::class.java, this) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt index 0a730d614c..f783fe0a6c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ScanResponse.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.model @@ -16,7 +26,7 @@ import com.squareup.moshi.JsonClass * } */ @JsonClass(generateAdapter = true) -data class ScanResponse( +internal data class ScanResponse( @Json(name = "clean") val clean: Boolean, /** Human-readable information about the result. */ @Json(name = "info") val info: String? diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt index ca6ffe96b3..688d030197 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.model @@ -10,7 +20,7 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class ServerPublicKeyResponse( +internal data class ServerPublicKeyResponse( @Json(name = "public_key") val publicKey : String? ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt index 6a9e217740..f92c869cb8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/DownloadEncryptedTask.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.tasks diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/GetServerPublicKeyTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/GetServerPublicKeyTask.kt index 9efe98ba12..41c2ec9c38 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/GetServerPublicKeyTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/GetServerPublicKeyTask.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.tasks diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt index c1185e02ba..dab9b5538f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanEncryptedTask.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.tasks diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt index 66f5dfef63..0cb56c1073 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/tasks/ScanMediaTask.kt @@ -1,7 +1,17 @@ /* - * Copyright 2020 New Vector Ltd - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session.contentscanner.tasks From 6ddf3f6e5a491673fae542c0eed9cc300ff613cc Mon Sep 17 00:00:00 2001 From: yostyle Date: Wed, 10 Nov 2021 17:38:11 +0100 Subject: [PATCH 045/319] Fix lint errors --- .../sdk/api/session/content/ContentUrlResolver.kt | 2 +- .../contentscanner/ContentScannerService.kt | 14 ++++++-------- .../sdk/api/session/contentscanner/ScanState.kt | 2 +- .../android/sdk/internal/session/DefaultSession.kt | 2 +- .../sdk/internal/session/SessionComponent.kt | 2 +- .../DisabledContentScannerService.kt | 2 +- .../contentscanner/db/ContentScanResultEntity.kt | 2 +- .../contentscanner/db/RealmContentScannerStore.kt | 9 +++++---- .../model/ServerPublicKeyResponse.kt | 2 +- tools/check/forbidden_strings_in_code.txt | 2 +- 10 files changed, 19 insertions(+), 20 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt index 56e3cd9796..3dd096e144 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUrlResolver.kt @@ -63,6 +63,6 @@ interface ContentUrlResolver { sealed class ResolvedMethod { data class GET(val url: String) : ResolvedMethod() - data class POST(val url:String, val jsonBody: String): ResolvedMethod() + data class POST(val url: String, val jsonBody: String) : ResolvedMethod() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt index 0c45e6a132..1dd7bab01c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ContentScannerService.kt @@ -25,18 +25,16 @@ interface ContentScannerService { val serverPublicKey: String? fun getContentScannerServer(): String? + fun setScannerUrl(url: String?) + fun enableScanner(enabled: Boolean) + fun isScannerEnabled(): Boolean + fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean = true, fileInfo: ElementToDecrypt? = null): LiveData> + fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? + /** * Get the current public curve25519 key that the AV server is advertising. * @param callback on success callback containing the server public key */ suspend fun getServerPublicKey(forceDownload: Boolean = false): String? - suspend fun getScanResultForAttachment(mxcUrl: String, fileInfo: ElementToDecrypt? = null): ScanStatusInfo - - fun setScannerUrl(url: String?) - - fun enableScanner(enabled: Boolean) - fun isScannerEnabled(): Boolean - fun getLiveStatusForFile(mxcUrl: String, fetchIfNeeded: Boolean = true, fileInfo: ElementToDecrypt? = null): LiveData> - fun getCachedScanResultForFile(mxcUrl: String): ScanStatusInfo? } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt index aeb1551cf7..da209080ac 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/contentscanner/ScanState.kt @@ -24,7 +24,7 @@ enum class ScanState { } data class ScanStatusInfo( - val state : ScanState, + val state: ScanState, val scanDateTimestamp: Long?, val humanReadableMessage: String? ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index f0ad0f87b0..32e88bafb4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -278,7 +278,7 @@ internal class DefaultSession @Inject constructor( override fun cryptoService(): CryptoService = cryptoService.get() override fun contentScannerService(): ContentScannerService = contentScannerService.get() - + override fun identityService() = identityService override fun fileService(): FileService = defaultFileService.get() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt index a3f8f5dc6d..76e5d84e56 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt @@ -18,7 +18,6 @@ package org.matrix.android.sdk.internal.session import dagger.BindsInstance import dagger.Component -import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerModule import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.session.Session @@ -37,6 +36,7 @@ import org.matrix.android.sdk.internal.session.cache.CacheModule import org.matrix.android.sdk.internal.session.call.CallModule import org.matrix.android.sdk.internal.session.content.ContentModule import org.matrix.android.sdk.internal.session.content.UploadContentWorker +import org.matrix.android.sdk.internal.session.contentscanner.ContentScannerModule import org.matrix.android.sdk.internal.session.filter.FilterModule import org.matrix.android.sdk.internal.session.group.GetGroupDataWorker import org.matrix.android.sdk.internal.session.group.GroupModule diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt index 240a8deaba..9087c71566 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DisabledContentScannerService.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 New Vector Ltd + * Copyright 2021 The Matrix.org Foundation C.I.C. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt index 8befba17e2..0ffff441f8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/ContentScanResultEntity.kt @@ -43,7 +43,7 @@ internal open class ContentScanResultEntity( scanStatusString = result.name } - fun toModel() : ScanStatusInfo { + fun toModel(): ScanStatusInfo { return ScanStatusInfo( state = this.scanResult, humanReadableMessage = humanReadableMessage, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt index 11b9439c2f..947a66c8b9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/db/RealmContentScannerStore.kt @@ -19,18 +19,18 @@ package org.matrix.android.sdk.internal.session.contentscanner.db import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import com.zhuinden.monarchy.Monarchy -import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore -import org.matrix.android.sdk.api.session.contentscanner.ScanState -import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import io.realm.Realm import io.realm.RealmConfiguration import io.realm.kotlin.createObject import io.realm.kotlin.where import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.session.contentscanner.ScanState +import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.toOptional import org.matrix.android.sdk.internal.di.ContentScannerDatabase import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScannerStore import org.matrix.android.sdk.internal.util.isValidUrl import javax.inject.Inject @@ -121,7 +121,8 @@ internal class RealmContentScannerStore @Inject constructor( } }, { it.toModel() - }).firstOrNull() + }) + .firstOrNull() } override fun getLiveScanResult(mxcUrl: String): LiveData> { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt index 688d030197..2e97a85bca 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/model/ServerPublicKeyResponse.kt @@ -22,5 +22,5 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) internal data class ServerPublicKeyResponse( @Json(name = "public_key") - val publicKey : String? + val publicKey: String? ) diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt index 29077c3a76..b135954f63 100644 --- a/tools/check/forbidden_strings_in_code.txt +++ b/tools/check/forbidden_strings_in_code.txt @@ -160,7 +160,7 @@ Formatter\.formatShortFileSize===1 # android\.text\.TextUtils ### This is not a rule, but a warning: the number of "enum class" has changed. For Json classes, it is mandatory that they have `@JsonClass(generateAdapter = false)`. If the enum is not used as a Json class, change the value in file forbidden_strings_in_code.txt -enum class===107 +enum class===108 ### Do not import temporary legacy classes import org.matrix.android.sdk.internal.legacy.riot===3 From 47a8f1afbb75dcf01444e9afb07fcce7e0f7ce1d Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 11 Nov 2021 22:12:56 +0000 Subject: [PATCH 046/319] Translated using Weblate (Czech) Currently translated at 100.0% (2675 of 2675 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 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 565dd0ca05..dc7a00916f 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -1952,15 +1952,15 @@ Porovnejte kód s tím na obrazovce druhého uživatele. Zprávy s tímto uživatelem jsou koncově šifrovány a nemohou být čteny třetími stranami. Vaše nová relace je nyní ověřena. Má přístup k Vašim zašifrovaným zprávám a ostatní uživatelé ji uvidi jako důvěryhodnou. - Křížový podpis - Křížový podpis je zapnut. + Křížové podepisování + Křížové podpisování je zapnuto. \nPrivátní klíče v zařízení. - Křížový podpis je zapnut + Křížové podpisování je zapnuto \nKlíče jsou důvěryhodné. \nPrivátní klíče nejsou známy - Křížový podpis je zapnut. + Křížové podpisování je zapnuto. \nKlíče nejsou důvěryhodné - Křížový podpis není zapnut + Křížové podpisování není zapnuto Aktivní relace Ukázat všechny relace Správa relací @@ -2007,7 +2007,7 @@ %d hlasů - Konečné výsledky Zvolená možnost - Založí jednoduchou anketu + Vytvoří jednoduché hlasování Použijte metodu obnovy Pokud se nemůžete dostat do existující relace Nové přihlášení @@ -2150,12 +2150,12 @@ To není platný identifikátor uživatele. Platný formát: \'@uživatel:homeserver.org\' Nemohu najít platný domovský server. Prosím, zkontrolujte svůj identifikátor Režim letadlo je zapnut - Použijte na svých zařízeních nejnovější ${app_name}, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} pro Android nebo jiný Matrix klient schopný křížového přihlášení + Použijte na svých zařízeních nejnovější ${app_name}, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} pro Android nebo jiný Matrix klient schopný křížového podepisování ${app_name} Web \n${app_name} Desktop ${app_name} iOS \n${app_name} Android - nebo jiný Matrix klient schopný křížového přihlášení + nebo jiný Matrix klient schopný křížového podepisování Použijte na svých zařízeních nejnovější ${app_name}: Vynutí zahození probíhající skupinové relace v šifrované místnosti Podporováno jen v šifrovaných místnostech @@ -2416,7 +2416,7 @@ Zobrazit stavové události účastníků v místnosti Zahrnuje události pozvat/vstoupit/opustit/vykopnout/vykázat a změny avatara/veřejného jména. - Průzkum + Hlasování Tlačítka botů Reagoval(a): %s Výsledek ověření From 41ac1d3b7b1b9d221c6a0b2199e4ade4b3cdadd9 Mon Sep 17 00:00:00 2001 From: Fjoerfoks Date: Thu, 11 Nov 2021 12:21:05 +0000 Subject: [PATCH 047/319] Translated using Weblate (Frisian) Currently translated at 42.3% (1134 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fy/ --- vector/src/main/res/values-fy/strings.xml | 401 +++++++++++++--------- 1 file changed, 233 insertions(+), 168 deletions(-) diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml index 2e3ac708d1..a568fc7f26 100644 --- a/vector/src/main/res/values-fy/strings.xml +++ b/vector/src/main/res/values-fy/strings.xml @@ -20,15 +20,15 @@ Kaaireservekopy brûke Apparaat ferifiearje Kaaireservekopy is noch net ree, in amerijke… - As jo jo no ôfmelde, sille jo jo fersifere berjochten kwytreitsje - Kaaireservekopy is dwaande. Asto dy no ôfmeldst, silsto de tagong ta dyn fersifere berjochten kwytreitsje. - Feilige kaaireservekopy moat op al dyn apparaten aktyf wêze om de tagong ta dyn fersifere berjochten net kwyt te reitsjen. + As jo no ôfmelde, sille jo de fersifere berjochten kwytreitsje + Kaaireservekopy is dwaande. As jo no ôfmelde, sille jo de tagong ta jo fersifere berjochten kwytreitsje. + Feilige kaaireservekopy moat op al jo apparaten aktyf wêze om de tagong ta jo fersifere berjochten net kwyt te reitsjen. Ik wol myn fersifere berjochten net Reservekopy fan kaaien wurdt makke… Kaaireservekopy brûke Binne jo wis\? Reservekopy meitsje - Do silst de tagong ta dyn fersifere berjochten ferlieze, útsein asto earst in reservekopy fan dyn kaaien makkest eardatsto dy ôfmeldst. + Jo sille de tagong ta jo fersifere berjochten ferlieze, útsein as jo earst in reservekopy fan jo kaaien meitsje eardat jo ôfmelde. Lisinsjes fan tredde partijen Lade… OK @@ -56,14 +56,14 @@ Ferbining ferbrekke Ynhâld melde Aktive petear - Rinnend gearkomstpetear. -\nNim diel mei %1$s of %2$s + Rinnend gearkomstpetear. +\nDielnimme mei %1$s of %2$s mikrofoan kamera Kin de oprop net starte, probearje it letter nochris Guon funksjes binne miskien ôfwêzich fanwegen ûntbrekkende rjochten… Dizze aksje is net mooglik fanwegen ûntbrekkende rjochten. - Om in gearkomst yn dit groepspetear te starten hasto útnûgingsrjochten nedich + Om in gearkomst yn dit groepspetear te starten hawwe jo útnûgingsrjochten nedich Kin de oprop net starte Apparaatynformaasje Gearkomstpetearen wurde net stipe yn fersifere petearen @@ -82,7 +82,7 @@ Ofslute Aksjes Ofmelde - Binne jo wis dat jo jo ôfmelde wolle\? + Binne jo wis dat jo ôfmelde wolle\? Spraakoprop Fideo-oprop Globaal sykje @@ -138,24 +138,24 @@ Beskriuw hjir jo probleem Ôfrûnje Hâld it feilich - Do binst klear! - Brûk disse %1$s as in feiligensnet, foar it gefal ast dyn %2$s ferjitst. + Klear! + Brûk dizze %1$s as in befeiligingsnet, foar it gefal as jo jo %2$s ferjitte. Ophingje Ferfalle litte Akseptearje - Do hast it haadadres fan dizze keamer fuortsmiten. - %1$s hat it adres fan dizze keamer feroare. - Do hast it adres fan dizze keamer feroare. - Do binst fuort gien. Reden: %1$s + Jo hawwe it haadadres fan dit petear fuortsmiten. + %1$s hat it petearadres wizige. + Jo hawwe it petearadres wizige. + Jo binne fuortgien. Reden: %1$s %1$s is fuort gien. Reden: %2$s - Do hast de keamer ferlitten. Reden: %1$s + Jo hawwe de keamer ferlitten. Reden: %1$s %1$s hat de keamer ferlitten. Reden: %2$s - Do binst de keamer yn kaam. Reden: %1$s + Jo binne de keamer yn kaam. Reden: %1$s %1$s is de keamer yn kaam. Reden: %2$s - Do binst de keamer yn kaam. Reden: %1$s + Jo binne de keamer yn kaam. Reden: %1$s %1$s is de keamer yn kaam. Reden: %2$s %1$s hat dy útnûge. Reden: %2$s - Do hast %1$s útnûge. Reden: %2$s + Jo hawwe %1$s útnûge. Reden: %2$s %1$s hat %2$s útnûge. Reden: %3$s Dyn útnûging. Reden: %1$s %1$s harren útnûging. Reden: %2$s @@ -165,13 +165,14 @@ Inisjele syngronisaasje: \nAccountgegevens ymportearje Inisjele Syngronisaasje: -\nMienskippen Binnenhelje +\nMienskippen ymportearje Inisjele Syngronisaasje: -\nOerblieuwne Keamers Binnenhelje +\nFerlitten keamers ymportearje Inisjele syngronisaasje: \nKeamers dêr\'t jo foar útnûge binne ymportearje Inisjele syngronisaasje: -\nKeamers wer ast yn kaam bist ymportearje +\nJo petearen lade +\nAs jo yn in protte keamers binne kin dit efkes duorje Inisjele syngronisaasje: \nKeamers ymportearje Inisjele syngronisaasje: @@ -191,23 +192,23 @@ Oanpast Oanpast (%1$d) Standert - Do hast de fideokonferinsje oanpast + Jo hawwe de fideokonferinsje oanpast Behearder Berjocht fuortsmiten troch %1$s [reden: %2$s] Berjocht fuortsmiten [reden: %1$s] Berjocht fuortsmiten troch %1$s Gjin feroaringen. - • Servers dy’t foldogge oan %s binne tastien. - Do hast de ACLs foar de keamer opnij ynsteld. - %s hat de ACLs foar disse keamer ynsteld. - Do hast disse keamer opwurdeare. - %s hat disse keamer upwurdeare. - Do hast end-to-end fersifering ynskakele (%1$s) - %1$s hat end-to-end fersifering ynskakele (%2$s) + • Servers dy’t oerienkomme mei %s binne tastien. + Jo hawwe de ACL’s foar dizze keamer ynsteld. + %s hat de ACL’s foar dizze keamer ynsteld. + Jo hawwe dizze keamer opwurdearre. + %s hat dizze keamer opwurdearre. + Jo hawwe end-to-end-fersifering ynskeakele (%1$s) + %1$s hat end-to-end-fersifering ynskeakele (%2$s) ûnbekend (%s). - Alle keamerleden. - Olle keamerleden, fanôf it momint dot se de keamer ynkaam binne. - Olle keamerleden, fanôf it momint dot se útnûge binne. + alle dielnimmers oan it petear. + alle dielnimmers, fan it momint ôf dat se de keamer ynkaam binne. + alle dielnimmers oan it petear, fan it momint ôf dat se útnûge binne. %1$s: %2$s Iepen foar eltsenien, it beste foar mienskippen Alle mienskippen @@ -220,10 +221,10 @@ Jo binne op dit stuit net lid fan in mienskip. Sukses Brûkers ID, Namme of email - Disse keamer ferlitte + Dizze keamer ferlitte Oanmeitsje - Út disse keamer smite - Do hast gjin tastimming om enkripsje yn te skakeljen yn disse keamer. + Ut dizze keamer fuortsmite + Jo hawwe gjin tastimming om fersifering yn te skeakeljen yn dize keamer. Telefoan My net wer freegje Nij petear begjinne @@ -236,11 +237,11 @@ Yn mien kontakten sykje Om matrix kontakten sykje Fuortsmite… - Wolst dit taheaksel fersjoere nei %1$s\? + Wolle jo dizze bylage nei %1$s ferstjoere\? Taheaksel ferstjoere De ferifikaasje koade is net jildich. Koade - In tekst berjocht is nei %s stjoerd. Graach de ferifikaasje koade ynfiere dyt der yn stiet. + In tekstberjocht is nei %s stjoerd. Graach de ferifikaasjekoade ynfiere dy’t der ynstiet. Kin net ferbine mei identiteitsserver Fier identiteitsserver-URL yn E-mailadressen en telefoannûmers ferstjoere @@ -261,7 +262,7 @@ Wachtsjend… Hulp & Oer Flugge Reaksjes - Matrix SDK Ferzje + Matrix SDK-ferzje Keamer ynstellings Ûnderwerp Keamer ûnderwerp (opsjoneel) @@ -271,24 +272,24 @@ Nije Keamer Direkte Berjochten Keamers - Disse keamer kin net ynsjûn wurde. Wolst de keamer binnen gean\? - Disse keamer jout no gjin tagong. -\nProbearje it letter noch ris in kear, of freechje in administrator om te sjen ast wol de nediche rjochten hast. + Dizze keamer kin net yn it foar toand wurde. Wolle jo de keamer binnen gean\? + Dizze keamer jout no gjin tagong. +\nProbearje it letter noch ris, of freegje in behearder om te sjen oft jo wol de nedige rjochten hawwe. Ynsjoch yn wrâld-lésbere keamers wurd noch net stipe troch ${app_name} - Disse keamer kin net ynsjûn wurde + Dizze keamer kin net yn it foar toand wurde Graach efkes wachtsje… Netwurk feroarje Feroarje Gjin netwurk. Kontroleerje dyn internet ferbyning. Nije Keamer Meitsje - Net gûd foarme evenemint, kin net sjen litten wurde + Net krekt foarme evenemint, kin net toand wurde Foar it lêst troch %1$s wizige op %2$s Evenemint troch brûker fuortsmiten - Fuortsmiten berjiochten sjen litte + Fuortsmiten berjochten toane Berjocht fuortsmiten Reaksjes Keamer List - Eltsenien kin disse keamer binnen gean + Elkenien kin dizze keamer binnen gean Iepenbier Foarkarren Sugestje dwaan @@ -300,7 +301,7 @@ Troch gean NEE JA - Informaasje + Ynformaasje Troch gean Keamer ûnderwerp Keamer namme @@ -317,7 +318,7 @@ Groepslist Oanfraach ferstjoerd - Kaai oanfraach ferstjoerd. + Kaaioanfraach ferstjoerd. Der is noch net op de keppeling yn it e-mailberjocht klikt Dizze brûkersnamme is al yn gebrûk Der binne te folle oanfragen ferstjoerd @@ -333,14 +334,14 @@ Kin net registrearje: netwurkflater Kin net oanmelde Koe it e-mailadres net ferifiearje: soargje dat jo op de keppeling yn it e-mailberjocht klikt hawwe - Der is in e-mail nei %s stjoerd. Klik hjirûnder sa gau as jo de keppeling yn de e-mail besocht hawwe. - Kontrolearje dyn e-mail om troch te gean mei de registraasje + Der is in e-mailberjocht stjoerd nei %s. Klik hjirûnder sa gau as jo de keppeling yn it e-mailberjocht besocht hawwe. + Kontrolearje jo e-mail om troch te gean mei de registraasje Wachtwurd fergetten\? Wachtwurden binne net gelyk Unjildich token - Der mist in e-mailadres of telefoannûmer - Telefoannûmer mist - E-mailadres mist + Der ûntbrekt in e-mailadres of telefoannûmer + Telefoannûmer ûntbrekt + E-mailadres ûntbrekt Dit e-mailadres is al yn gebrûk. Dit is gjin jildich telefoannûmer Telefoannûmer (opsjoneel) @@ -370,11 +371,11 @@ Identiteitsserver: Thússerver: Brûkersnamme al yn gebrûk - Feiligens & Privacy + Befeiliging & privacy Tastean - Keamer ferzje + Keamerferzje Avansearre - Rômtes + Romten allinnich leden Eltsenien kin de keamer fyne en der yn komme Eltsenien Gasten tastean om de keamer yn te gean @@ -387,30 +388,30 @@ Altyd Tafoegje Notifikaasjes - Olgemien + Algemien Matrix-flater Netwurkflater Kin it berjocht net ferstjoere Berjocht fuortsmiten Warskôging hat serverstipe en in eksperimintele keamer nedich Eksperiminteel Rômte - Beheinde Keamer. - Do bist útnûge + Jo binne útnûge eltsenien. - Do hast takomstige berjochten foar %1$s sichtber makke + Jo hawwe takomstige berjochten foar %1$s sichtber makke %1$s hat takomstige berjochten foar %2$s sichtber makke - Do hast de takomstige keamer skiednis foar %1$s sichtber makke - %1$s hat de takomstige keamer skiednis foar %2$s sichtber makke - Do hast it petear beënige. + Jo hawwe de takomstige petearskiednis foar %1$s sichtber makke + %1$s hat de takomstige petearskiednis foar %2$s sichtber makke + Jo hawwe de oprop beëinige. %s hat it petear beëinige. - Do hast it petear beantwurde. - %s hat it petear beantwurde. - Do hast data stjoerd om in petear op te setten. + Jo hawwe de oprop beäntwurde. + %s hat de oprop beäntwurde. + Jo hawwe data stjoerd om in petear op te setten. %s hat data stjoerd om in petear op te setten. - %s hat in fideo petear oanmakke. - Do hast in fideo petear oanmakke. - %s hat in fideo petear oanmakke. - Jo hawwe de keamernamme wizige nei: %1$s - %1$s hat de keamernamme wizige nei: %2$s + %s hat in fideopetear oanmakke. + Jo hawwe in fideopetear iepene. + %s hat in fideo-oprop oanmakke. + Jo hawwe de petearnamme wizige nei: %1$s + %1$s hat de petearnamme wizige nei: %2$s Jo hawwe it ûnderwerp wizige nei: %1$s %1$s hat it ûnderwerp wizige nei: %2$s Jo hawwe jo werjeftenamme fuortsmiten (wie %1$s) @@ -419,34 +420,34 @@ %1$s hat de werjeftenamme fan %2$s wizige nei %3$s Jo hawwe jo werjeftenamme wizige nei %1$s %1$s hat de werjeftenamme wizige nei %2$s - Do hast de útnûging foar %1$s wer ynlutsen + Jo hawwe de útnûging foar %1$s wer ynlutsen %1$s hat de útnûging foar %2$s wer ynlutsen - Do hast %1$s ferbonne - Do bist de keamer yn kaam - %1$s hat %2$s ferbonne - Do hast %1$s der út skopt + Jo hawwe %1$s ferballe + Jo binne oansluten + %1$s hat %2$s ferballe + Jo hawwe %1$s der útskopt %1$s hat %2$s der út skopt - Do hast de útnûging ôfwiisd + Jo hawwe de útnûging wegere %1$s hat de útnûging ôfwiisd - Do hast de keamer ferlitten + Jo hawwe de keamer ferlitten %1$s hat de keamer ferlitten - Do hast de keamer ferlitten + Jo hawwe de keamer ferlitten %1$s hat de keamer ferlitten %1$s is de keamer yn kaam - Do bist de keamer yn kaam - %1$s is de keamer yn kaam + Jo binne de keamer yn kaam + %1$s nimt no diel oan it petear %1$s hat dy útnûge - Do hast %1$s útnûge + Jo hawwe %1$s útnûge %1$s hat %2$s útnûge - Do hast de diskusje oanmakke + Jo hawwe de diskusje oanmakke %1$s hat de diskusje oanmakke - Do hast de keamer oanmakke + Jo hawwe de keamer oanmakke %1$s hat de keamer oanmakke - Dyn útnûging - %s\'s útnûging - Do hast in sticker stjoerd. - %1$s hat in sticker stjoerd. - Do hast in ôfbylding stjoerd. + Jo útnûging + Utnûging fan %s + Jo hawwe in stikker stjoerd. + %1$s hat in stikker stjoerd. + Jo hawwe in ôfbylding stjoerd. %1$s hat in ôfbylding stjoerd. Gjin jildige Google Play Services APK fûn. Notifikaasjes kinne wolris net wurkje. %d+ @@ -456,15 +457,15 @@ Allinich foar flaters Foar berjochten en flaters Ivich - Informaasje krite sjen litte + Ynformaasjegebiet toane ynteare útteare Sorry, in flater die sich foar - Graach %s om disse tsjinst brûken te blieuwen. + Graach %s om dizze tsjinst brûke te bliuwen. Klik hjir om âldere berjochten te besjen - Disse keamer is in trochsetting fan in oar petear + Dizze keamer is in fuortsetting fan in oar petear It petear giet hjir troch - Disse keamer is ferfong en is net mear aktyf. + Dizze keamer is ferfongen en is net mear aktyf. Graach dyn wachtwurd ynfiere. Fier in brûkersnamme yn. Account útskeakelje @@ -475,7 +476,7 @@ Om de %1$s-thússerver brûke te bliuwen, moatte jo de betingsten lêze en befêstigje. Keamer ferjitte Reden: %1$s - Do binst út %1$s weiballe troch %2$s + %2$s hat jo út %1$s ferballe %1$s Brûke Skilje… Brûkers @@ -486,17 +487,17 @@ Jo hawwe de keamernamme fuortsmiten %1$s hat de keamernamme fuortsmiten %1$s hat %2$s der út skopt. Reden: %3$s - Do hast %1$s fuortskopt. Reden: %2$s - Do hast hjir fernijd. + Jo hawwe %1$s der útskopt. Reden: %2$s + Jo hawwe hjir bywurke. %s is hjir fernijd. - Do hast skille. + Jo hawwe in audiopetear iepen. Beskikbere talen ophelje… Oare beskikbere talen Jou it ûnderwerp fan de keamer oan Dit is spam Der binne gjin bestannen yn dizze keamer BESTANNEN - Der befynt sich gjin media yn disse keamer + Der is gjin media yn dizze keamer MEDIA Omdraaie en bysnije Sticker @@ -516,7 +517,7 @@ Taal Skeakelje yn Ynstellingen ‘Yntegraasjes tastean’ yn om dit te dwaan. Yntegraasjes binne útskeakele - Integraasje Behearder + Yntegraasjebehearder Yntegraasjes tastean Identiteitsserver Thússerver @@ -524,13 +525,13 @@ Ferstjoere Wachtwurd: Authentikaasje - Disse operaasje hat oanfullende authentikaasje nedich. -\nFier dyn wachtwurd yn om troch te gean. + Dizze operaasje hat oanfoljende autentikaasje nedich. +\nFier jo wachtwurd yn om troch te gean. Foar it letst sjûn - Iepenbiere Namme Feroarje - Iepenbiere Namme + Iepenbiere namme wizigje + Iepenbiere namme ID - Sesje informaasje + Sesjeynformaasje Databesparjende modus Tastimming jaan In oare opsje kieze @@ -543,14 +544,14 @@ Sesjes Keamers mei net lézen berjochten festsette Lilkensskodzje - De ûntwikkelders modus jout ûnsichtbere funksjes frei, en kin de applikaasje minder stabiel meitsje. Allinich foar ûntwikkelders! - Ûntwikkelders modus + De ûntwikkelersmodus jout ûnsichtbere funksjes frij, en kin de applikaasje minder stabyl meitsje. Allinnich foar ûntwikkelers! + Untwikkelersmodus Kontakt Opnimme Mei Behearder Dit is tapasselik Skoftsje Ôfspylje Ferstjoere - Do brûkst gjin identiteitsserver + Jo brûke gjin identiteitsserver Ûnbekende flater Interactieve Sesje Ferifikaasje De ferifikaasje is ôfbrutsen. @@ -558,39 +559,39 @@ De oare partij hat de ferifikaasje ôfbrutsen. \n%s Oanfraach Ôfbrutsen - Kaai Ferifikaasje + Kaaiferifikaasje Brûk ferâldere ferifikaasje. - Wurd der neat sjen litten\? Net eltse kliïnt kin mei interactieve ferifikaasje oerwei. Brûk ferâldere ferifikaasje. + Wurdt der neat toand\? Net elke kliïnt kin mei ynteraktive ferifikaasje oerwei. Brûk ferâldere ferifikaasje. Ferifikaasje oanfraach %s wol dyn sesje ferifiearje - Feilige berjochten mei disse brûker binne ein-oant-ein fersifere, en kin net troch tredde partijen lézen wurde. - Do hast disse sesje mei sukses ferifieare. + Feilige berjochten mei dizze brûker binne end-to-end-fersifere en kinne net troch tredde partijen lêzen wurde. + Jo hawwe dizze sesje mei sukses ferifiearre. Ferifieare! Oan it wachtsjen op partner om te befêstigjen … Oanfraach besjen Biometry ynskakelje PIN ynskakelje - Feiligens ynstelle + Beskerming ynstelle Tagong befeiligje troch in PIN en biometry te brûken. Tagong befeiligje PIN fergetten\? Dyn PIN ynfiere PIN befestigje - Brûk in PIN foar feiligens - Te folle flaters, do binst útlogd + Brûk in pinkoade foar befeiliging + Te folle flaters, jo binne ôfmeld Lokaal adres tafoege Ik ha in kopy makke Graach in kopy meitsje Ophâlde Klear Feiligje dyn reservekopy mei in Wachtwurdssin. - Kaaien mei de hân eksportearje + Kaaien hânmjittich eksportearje (Avansearre) Reitsje jo fersifere gegevens nea kwyt Gjin Matrix sesje beskikber - Graach de wachtwurdssin fuortsmite ast wolst dot ${app_name} in nije herstel kaai foar dy oanmakket. + Graach de wachtwurdsin fuortsmite as jo wolle dat ${app_name} in nije werstelkaai foar jo oanmakket. Graach in wachtwurdssin ynfiere - Wachtwurdssin komt net oerien + Wachtwurden komme net oerien Wachtwurdssin ynfiere Wachtwurdssin befestigje Wachtwurdssin oanmeitsje @@ -607,11 +608,11 @@ Graach in lân útsykje Lân útsykje Wachtwurden komme net oerien - Dit emailadres koe net fûn wurde. + Dit e-mailadres koe net fûn wurde. Dit emailadres wurd ol brûkt. Dit telefoannûmer wurd ol brûkt. E-mailadressen en telefoannûmers - Dyn wachtwurd is fernijd + Dyn wachtwurd is bywurke It wachtwurd is net jildich Fernijen fan it wachtwurd is mislearre Wachtwurd Fernije @@ -625,14 +626,14 @@ Ûnderwerp Wa kin de skiednis lêze\? Lokaal Adres - Eltsenien dyt in link nei disse keamer hat, mar gjin gasten + Elkenien dy’t in keppeling nei dizze keamer hat, mar gjin gasten Privee Iepenbier - Eltsenien kin by disse keamer oankopje, leden kinne don akseptearje as ôfslaan - Eltsenien dyt in link nei disse keamer hat, sels gasten - Do hast gjin brûkers negearre + Elkenien kin by dizze keamer oanklopje, leden kinne dan akseptearje of wegerje + Elkenien dy’t in keppeling nei dizze keamer hat, ynklusyf gasten + Jo hawwe gjin brûkers negearre Negearre brûkers - Stim & Fideo + Stim & fideo Avansearre ynstellingen Oanpaste en avansearre ynstellingen Account tafoegje @@ -648,8 +649,8 @@ Telefoannûmers E-mailadressen Wachtwurd befêstigje - Applikaasje informaasje yn de systeem ynstellingen sjen litte. - Applikaasje informaasje + Applikaasjeynformaasje yn de systeemynstellingen toane. + Applikaasjeynformaasje Telefoannûmer tafoegje Der is gjin telefoannûmer oan jo account tafoege E-mailadres tafoegje @@ -662,9 +663,9 @@ Ynstellingen Ynstellingen wizigje Petearrjochten - Jo hawwe de server-ACLs foar dizze keamer wizige. - %s hat de server-ACL\'s foar dizze keamer wizige. - Do hast dyn profylôfbylding wizige + Jo hawwe de server-ACL’s foar dizze keamer wizige. + %s hat de server-ACL’s foar dizze keamer wizige. + Jo hawwe jo profylôfbylding wizige Koe de suggestje net ferstjoere (%s) Dankewol, it ferstjoeren fan de suggestje is slagge Skriuw jo suggestje hjir @@ -688,7 +689,7 @@ Feroarje Brûkers komme net oerien Kaaien komme net oerien - Der is en ûnjildich berjocht ûntfong + Der is in ûnjildich berjocht ûntfongen De sesje hat ûnferwachts in berjocht ûntfong De SAS kaam net oerien De sesje wit neat fan dy transaksje @@ -703,7 +704,7 @@ Back-up werom sette: Binne jo der wis fan\? Ferfange - As bestân opslaan + As bestân bewarje Diele Wachtwurdssin is net sterk genôch Slagge! @@ -773,20 +774,20 @@ Alle petearen op server %s Servernamme Keamer hat ûnbekend sesjes - Ik befêstigje dat de kaaien oerien komme + Ik befêstigje dat de kaaien oerienkomme As dit net oerienkomt, kin de feiligens fan jo kommunikaasje kompromittearre wêze. Befêstigje troch dit te fergelykjen mei de Brûkersynstellingen fan jo oare sesje: - Fan de swarte list ôf helje - Sesje ferifiearre - Op de swarte list set + Deblokkearringslist + Sesje ferifiearje + Blokkearre Ferifiearre - Net Ferifiearre - Ûntsiferings flater - Sesje ID + Net ferifiearre + Untsiferingsflater + Sesje-ID Algoritme Tema Oersjoch - As haad adres ynstelle + As haadadres ynstelle Nij adres (bygelyks #foo:matrix.org) Jo moatte útlogge om fersifering ynskeakelje te kinnen. Ein-oan-Ein fersifering is ynskeakele @@ -820,19 +821,19 @@ Berjochten mei enter ferstjoere Trilje wannear jo neamd wurde Accountbarrens toane - Sjen litte wannear oft minsken de keamer yn kaam binne, as der út gien binne - Brûk it /confetti kommando as ferstjoer in berjocht mei ❄️ as 🎉 - Chat effekten sjen litte - Sjen kinne dat berjochten lêzen binne + Toane wannear oft minsken de keamer yn kaam binne, of der útgien binne + Brûk it kommando /confetti of stjoer in berjocht mei ❄️ of 🎉 + Chateffekten toane + Lêsbefêstigingen toane Lit oare minsken witte dat jo oan it typen binne. Typenotifikaasjes ferstjoere Tiidstimpels foar alle berjochten toane - Fersifering Kaai Behear + Behear fan kryptografyske kaaien Fersifering Oare ynstellingen Notifikaasjes Brûkersynstellingen - olm ferzje + olm-ferzje Ferzje Eftergrûn Syngronisaasje Modus Optimalisearje foar batterij gebrûk @@ -865,7 +866,7 @@ OERSJOCH KEAMERS Gjin resultaten - Delheljen Ôfbrekke + Download annulearje Minsken Keamer Details Bestannen @@ -894,7 +895,7 @@ Net ferstjoerde berjochten opnij ferstjoere Alles ôfbrekke Alles opnij ferstjoere - Berjocht net ferstjoerd. %1$s as %2$s no\? + Berjocht net ferstjoerd. %1$s of %2$s no\? Ferbining mei de server is ferbrutsen. In reaksje ferstjoere (net fersifere)… In fersifere reaksje ferstjoere… @@ -930,16 +931,16 @@ Keamer ferlitte 1 lid Syngronisearje… - Dochs Trochgean - Yn downloads opslaan\? + Dochs trochgean + Yn downloads bewarje\? Opslein - In foto as fideo meitsje + In foto of fideo meitsje Kin gjin fideo opnimme Belje %1$dm %2$ds %d s - It delheljen ôfbrekke\? - Opnij de fersifering kaaien fan jo oare sesjes opfreegje. + Downloaden annulearje\? + De fersiferingskaaien fan jo oare sesjes opnij opfreegje. Registrearjen mislearre: e-mail-eigendomsflater Kin net oanmelde: netwurkflater URL moat mei http[s]:// begjinne @@ -958,20 +959,20 @@ Stimlûd ferstjoere Fideo-oprop begjinne Spraakoprop begjinne - URL identiteitsserver - API URL thússerver - URL thússerver + Identiteitsserver-URL + Thússerver API-URL + Thússerver-URL It oanjaan fan in flater yn dizze applikaasje is net slagge (%s) It oanjaan fan in flater yn dizze applikaasje is slagge Keamer binnen gean Foarútgong (%s%%) - Dizze applikaasje is de lêste kear fêstrûn. Wolle jo miskien it skerm iepenje om in flater yn dizze applikaasje oan te jaan\? - It liket der op dat jo út lilkens mei jo telefoan skodzje. Wolle jo miskien it skerm iepenje om in flater yn dizze applikaasje oan te jaan\? + Dizze applikaasje is de lêste kear fêstrûn. Wolle jo dit melde\? + It liket der op dat jo út lilkens mei jo telefoan skodzje. Wolle jo in probleem melde\? Romten - Utnûgingen - Alle keamers yn it keameroersjoch toane, ek keamers mei ynhâld foar folwoeksenen. - Keamers mei ynhâld foar folwoeksenen toane - Keameroersjoch + Utnûge persoanen + Alle petearen yn de list toane, ek petearen mei ynhâld foar folwoeksenen. + Petearen mei ynhâld foar folwoeksenen toane + Petearlist Gjin resultaten mear Oanrekommandearre Keamers Nije wearde @@ -979,21 +980,21 @@ Kopiearje Jo kinne josels net belje Jo meie gjin konferinsje starte - Jo meie gjin konferinsjepetear yn dizze keamer starte + Jo misse it rjocht om in gearkomste yn dit petear te starten Petearen starte - Om dizze aksje út te fieren, skeakelje dan de kameratastimming yn fan de systeemynstellingen út. + Skeakelje om dizze aksje út te fieren fan de systeemynstellingen út de kameratastimming yn. Jo hawwe end-to-end-fersifering ynskeakele. %1$s hat end-to-end-fersifering ynskeakele. - %1$s hat opkeard dat gasten dizze keamer binnen gean kinne. - Jo hawwe opkeard dat gasten dizze keamer binnen gean kinne. - %1$s hat opkeard dat gasten dizze keamer binnen gean kinne. - Jo hawwe opkeard dat gasten dizze keamer binnen gean kinne. + %1$s hat opkeard dat gasten dit petear binnen gean kinne. + Jo hawwe opkeard dat gasten dit petear binnen gean kinne. + %1$s hat opkeard dat gasten dit petear binnen gean kinne. + Jo hawwe opkeard dat gasten dit petear binnen gean kinne. Jo hawwe gasten tastien om hjir binnen te gean. %1$s hat gasten tastien om hjir binnen te gean. Jo hawwe gasten tastien om dizze keamer binnen te gean. %1$s hat gasten tastien om dizze keamer binnen te gean. Systeemstandert - Jo hawwe end-to-end-fersifering ynskeakele (net erkend algoritme %1$s). + Jo hawwe end-to-end-fersifering ynskeakele (net bekend algoritme %1$s). %1$s en 1 oar %1$s en %2$d oaren @@ -1015,7 +1016,7 @@ %1$s hat de útnûging nei %2$s om de keamer binnen te gean wer ynlutsen Jo hawwe %1$s útnûge %1$s hat %2$s útnûge - Jo hawwe in útnûging nei %1$s stjoerd om de keamer binnen te gean + Jo hawwe in útnûging nei %1$s stjoerd om by de keamer oan te sluten %1$s hat in útnûging nei %2$s stjoerd om mei it petear mei te dwaan %1$s hat de keameravatar fuortsmiten VoIP-konferinsje foltôge @@ -1052,7 +1053,7 @@ Kies in telefoannûmer. Letter kinne jo derfoar kieze om minsken jo fine te litten fia dit nûmer. Kies in e-mailadres om te brûken foar accountwerstel. Letter kinne jo derfoar kieze om minsken jo fine te litten fia jo e-mailadres. Tebek nei it oanmeldingsskerm - E-mail foar opnij ynstellen ferstjoere + E-mailberjocht foar opnij ynstellen ferstjoere Yntsjinje Account oanmeitsje Oanmelde mei unike oanmelding @@ -1129,4 +1130,68 @@ Spacerjochten Foegje in identiteitsserver ta yn de ynstellingen om dit te dwaan. Oproppen + %1$s hat it haadadres foar dit petear fuortsmiten. + Jo hawwe it haadadres foar dit petear ynsteld op %1$s. + %1$s hat it haadadres foar dit petear ynsteld op %2$s. + Jo hawwe %1$s as petearadres tafoege en %2$s fuortsmiten. + %1$s hat %2$s as petearadres tafoege en %3$s fuortsmiten. + + Jo hawwe %1$s as petearadres fuortsmiten. + Jo hawwe %1$s as petearadresens fuortsmiten. + + + %1$s hat %2$s as petearadres fuortsmiten. + %1$s hat %2$s as petearadres fuortsmiten. + + + Jo hawwe %1$s as petearadres tafoege. + Jo hawwe %1$s as petearadressen tafoege. + + + %1$s hat %2$s as petearadres tafoege. + %1$s hat %2$s as petearadressen tafoege. + + Jo hawwe de útnûging foar %1$s ynlutsen. Reden: %2$s + %1$s hat de útnûging foar %2$s ynlutsen. Reden: %3$s + Jo hawwe %1$s in útnûging foar it petear stjoerd. Reden: %2$s + %1$s hat %2$s in útnûging stjoerd foar in petear. Reden: %3$s + Jo hawwe %1$s ferballe. Reden: %2$s + %1$s hat %2$s ferballe. Reden: %3$s + Jo hawwe de ferballing fan %1$s opheven. Reden: %2$s + %1$s hat %2$s únferbannen. Reden: %3$s + Jo hawwe de útnûging wegere. Reden: %1$s + %1$s hat de útnûging wegere. Reden: %2$s + Inisjele syngronisaasje: +\nKryptografy ymportearje + It apparaat fan de ôfstjoerder hat gjin kaaien foar dit berjocht stjoerd. + %1$s fan %2$s nei %3$s + %1$s hat it machtigingsnivo fan %2$s oanpast. + Jo hawwe it machtigingsnivo fan %1$s oanpast. + Moderator + Fideokonferinsje oanpast troch %1$s + Jo hawwe de fideokonferinsje beëinige + Fideokonferinsje beëinige troch %1$s + Jo hawwe in fideokonferinsje start + Fideokonferinsje start troch %1$s + Jo hawwe de widget %1$s oanpast + %1$s hat de widget %2$s oanpast + Jo hawwe de widget %1$s fuortsmiten + %1$s hat de widget %2$s fuortsmiten + Jo hawwe de widget %1$s tafoege + %1$s hat de widget %2$s tafoege + Jo hawwe jo profyl %1$s bywurke + %1$s hat syn/har profyl %2$s bywurke + (avatar is ek wizige) + Belied + Gjin belied troch de identiteitsserver opjûn + Identiteitsserverbelied ferstopje + Identiteitsserverbelied toane + Privacybelied + Privacybelied + Samar wat + ${app_name} Android + Iepenbiere namme + De iepenbiere namme fan in sesje is sichtber foar minsken mei wa’t jo kommunisearje + Iepenbiere namme (sichtber foar minsken mei wa’t jo kommunisearje) + Iepenbiere namme \ No newline at end of file From 66bbb02bae3cfd0f0c223edd4a43d4f4dc9ec46e Mon Sep 17 00:00:00 2001 From: Michael Mihai Date: Thu, 11 Nov 2021 11:14:23 +0000 Subject: [PATCH 048/319] Translated using Weblate (Romanian) Currently translated at 15.3% (410 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ro/ --- vector/src/main/res/values-ro/strings.xml | 101 +++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index 8ef802f034..464a590f62 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -354,7 +354,8 @@ Sincronizare inițială: \nSe importă camerele la care a-ți primit invitații Sincronizare inițială: -\nSe importă camerele la care v-ați alăturat +\nSe încarcă conversațiile tale +\nDacă te-ai alăturat mai multe camere, ar putea dura puțin mai mult Sincronizare inițială: \nSe importa camerele Sincronizare inițială: @@ -402,4 +403,102 @@ Raport de erori Istoricul activitățiilor Detalii despre membri + Backup + Ești sigur \? + Folosește backup-ul cheii de criptare + Backup-ul cheii de criptare ar trebui să fie activ pe toate dispozitivele tale, pentru a evita pierderea mesajelor tale criptate. + Se creează backup-ul cheii de criptare. Daca te deconectezi de la aplicație acum vei pierde accesul la mesajele tale criptate. + Se ascultă notificările + Setările implicite ale sistemului + Tu ai pornit criptarea end-to-end (algoritm nerecunoscut %1$s). + %1$s a pornit criptarea end-to-end (algoritm nerecunoscut %2$s). + Tu ai pornit criptarea end-to-end. + %1$s a pornit criptarea end-to-end. + Tu ai împiedicat invitați din a se alătura acestei camere. + %1$s a împiedicat invitații din a se alătura acestei camere. + Tu ai împiedicat invitați să se alăture acestei camere. + %1$s a împiedicat invitații din a se alătura acestei camere. + Tu ai permis invitațiilor să se alăture aici. + %1$s a permis invitațiilor să se alăture aici. + Ai permis invitaților să se alăture acestei camere. + %1$s a permis invitațiilor să se alăture acestei camere. + Ai schimbat adresele pentru această cameră. + %1$s a schimbat adresele pentru aceasta cameră. + Ai schimbat adresele principală și alternativă pentru această cameră. + %1$s a schimbat adresele principală și secundară pentru această cameră. + Ai schimbat adresele alternative pentru această cameră. + %1$s a modificat adresele alternative pentru această cameră. + + Ai șters adresa alternativă %1$s pentru aceasta cameră. + Ai șters adresele alternative %1$s pentru aceste camere. + Ai șters adresele alternative %1$s pentru aceste camere. + + + %1$s a șters adresa alternativă %2$s pentru această cameră. + %1$s a șters adresele alternative %2$s pentru această cameră. + %1$s a șters adresele alternative %2$s pentru această cameră. + + + Ai adăugat adresa alternativă %1$spentru această cameră. + Ai adăugat adresele alternative %1$s pentru această cameră. + Ai adăugat adresele alternative %1$s pentru această cameră. + + + %1$s a adăugat adresa alternativă %2$s pentru aceasta cameră. + %1$s a adăugat adresele alternative %2$s pentru această cameră. + %1$s a adăugat adresele alternative %2$s pentru această cameră. + + Ai șters adresa principală pentru această cameră. + %1$s a șters adresa principală pentru această cameră. + Ai setat adresa principală pentru această cameră ca fiind %1$s. + %1$s a setat adresa principală pentru această adresa ca fiind %2$s. + Ai adăugat %1$s și îndepărtat %2$s ca adrese pentru această cameră. + %1$s a adăugat %2$s și îndepărtat %3$s ca adrese pentru această cameră. + + Ai îndepărtat %1$s ca adresă pentru această adresă. + Ai îndepărtat %1$s ca adrese pentru această adresă. + Ai îndepărtat %1$s ca adrese pentru această adresă. + + + %1$s a retras %2$s ca o adresă pentru această cameră. + %1$s a retras %2$s ca adrese pentru această cameră. + %1$s a retras %2$s ca adrese pentru această cameră. + + + Ai adăugat %1$s ca o adresă pentru această cameră. + Ai adăugat %1$s ca adrese pentru această cameră. + Ai adăugat %1$s ca adrese pentru această cameră. + + + %1$s a adăugat pe %2$s ca o adresă pentru această cameră. + %1$s a adăugat pe %2$s ca adrese pentru această cameră. + %1$s a adăugat pe %2$s ca adrese pentru această cameră. + + Ți-ai retras invitația către %1$s. Motivul: %2$s + %1$s și-a retras invitația către %2$s. Motivul: %3$s + %1$s la evacuat pe %2$s. Motivul: %3$s + Tu ai invitat %1$s. Motivul: %2$s + Ai acceptat invitaţia pentru %1$s. Motivul: %2$s + %1$s a acceptat invitaţia pentru %2$s. Motivul: %3$s + Ai retras invitaţia către %1$s de alăturare acestei camere. Motivul: %2$s + %1$s a retras invitaţia către %2$s de alăturare acestei camere. Motivul: %3$s + Tu ai trimis o invitaţie către %1$s pentru a se al\\ătura camerei. Motivul: %2$s + %1$s a trimis o invitaţie către %2$s pentru a se alătura camerei. Motivul: %3$s + Ai blocat utilizatorul %1$s. Motivul: %2$s + %1$s a blocat utilizatorul %2$s. Motivul: %3$s + Ai deblocat utilizatorul %1$s. Motivul: %2$s + %1$s a blocat pe %2$s. Motivul: %3$s + Ai dat afară utilizatorul %1$s. Motivul: %2$s + Ai respins invitaţia. Motivul: %1$s + %1$s a respins invitaţia. Motivul: %2$s + Ai ieşit. Motivul: %1$s + %1$s a părăsit camera. Motivul: %2$s + Ai părăsit camera. Motivul: %1$s + %1$s a părăsit camera. Motivul: %2$s + Tu te-ai alăturat. Motivul: %1$s + %1$s s-a alăturat. Motivul: %2$s + Tu te-ai alăturat camerei. Motivul: %1$s + %1$s s-a alăturat camerei. Motivul: %2$s + %1$s te-a invitat. Motivul: %2$s + %1$s la invitat pe %2$s. Motivul este: %3$s \ No newline at end of file From 89e50225d1d8b75c696ee23e3d99c342ab7f9527 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 12 Nov 2021 02:55:33 +0000 Subject: [PATCH 049/319] Translated using Weblate (Indonesian) Currently translated at 100.0% (37 of 37 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- .../metadata/android/id/full_description.txt | 38 +++++++++---------- .../metadata/android/id/short_description.txt | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt index dfa9c8c826..d28ae8b004 100644 --- a/fastlane/metadata/android/id/full_description.txt +++ b/fastlane/metadata/android/id/full_description.txt @@ -1,42 +1,42 @@ -Element adalah perpesanan yang aman dan aplikasi kolaborasi tim produktivitas yang ideal untuk obrolan grup saat bekerja jarak jauh. Aplikasi obrolan ini menggunakan enkripsi ujung-ke-ujung untuk memberikan konferensi video, berbagi file, dan panggilan suara. +Element adalah perpesanan yang aman dan aplikasi kolaborasi tim produktivitas yang ideal untuk obrolan grup saat bekerja jarak jauh. Aplikasi perpesanan ini menggunakan enkripsi ujung-ke-ujung untuk memberikan konferensi video, pembagian file, dan panggilan suara yang aman. -Fitur Element termasuk: +Fitur Element termasuk - Alat komunikasi online yang canggih -- Pesan terenkripsi sepenuhnya untuk memungkinkan komunikasi perusahaan yang lebih aman, bahkan untuk pekerja jarak jauh -- Obrolan terdesentralisasi berdasarkan framework sumber-terbuka Matrix -- Berbagi file dengan aman dengan data terenkripsi saat mengelola proyek -- Obrolan video dengan VoIP dan berbagi layar +- Pesan-pesan yang dienkripsi sepenuhnya untuk memungkinkan komunikasi perusahaan yang lebih aman, bahkan untuk pekerja jarak jauh +- Obrolan terdesentralisasi berdasarkan kerangka Matrix yang sumber terbuka +- Pembagian file aman dengan data terenkripsi saat mengelola proyek +- Obrolan video dengan VoIP dan pembagian layar - Integrasi yang mudah dengan alat kolaborasi online favorit Anda, alat manajemen proyek, layanan VoIP dan aplikasi perpesanan tim lainnya -Element benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lainnya. Element beroperasi pada Matrix, jaringan terbuka untuk pengiriman pesan yang aman dan komunikasi terdesentralisasi. Matrix memungkinkan hosting sendiri untuk memberi pengguna kepemilikan maksimum dan kontrol data dan pesan mereka. +Element benar-benar berbeda dari aplikasi perpesanan dan aplikasi kolaborasi lainnya. Element beroperasi pada Matrix, jaringan terbuka untuk pengiriman pesan yang aman dan komunikasi terdesentralisasi. -Pesan privasi dan terenkripsi -Element melindungi Anda dari iklan yang tidak diinginkan, penambangan data dan taman berdinding. Element juga mengamankan semua data Anda, komunikasi video dan suara satu-ke-satu melalui enkripsi ujung-ke-ujung dan verifikasi perangkat yang ditandatangani secara silang. +Perpesanan dengan privasi dan enkripsi +Element melindungi Anda dari iklan yang tidak diinginkan, penambangan data dan taman berdinding. Element juga mengamankan semua data Anda, komunikasi video dan suara satu-ke-satu dengan enkripsi ujung-ke-ujung dan verifikasi perangkat menggunakan penandatanganan silang. -Element memberi Anda kendali atas privasi Anda sambil memungkinkan Anda untuk berkomunikasi dengan aman dengan siapa pun di jaringan Matrix, atau alat kolaborasi bisnis lainnya dengan mengintegrasikan dengan aplikasi seperti Slack. +Element memberikan Anda kendali atas privasi Anda sambil memungkinkan Anda untuk berkomunikasi dengan siapa saja secara aman di jaringan Matrix, atau alat kolaborasi bisnis lainnya dengan mengintegrasikan aplikasi-aplikasi seperti Slack. Element dapat dihost sendiri -Untuk memungkinkan lebih banyak kendali atas data dan percakapan sensitif Anda, Element bisa dihost sendiri atau Anda dapat memilih host berbasis Matrix - standar untuk komunikasi terdesentralisasi sumber-terbuka. Element memberi Anda privasi, kepatuhan keamanan, dan fleksibilitas integrasi. +Untuk memungkinkan lebih banyak kendali atas data dan pesan-pesan sensitif Anda, Element dapat dihost sendiri atau Anda dapat memilih host berbasis Matrix, standar untuk komunikasi terdesentralisasi sumber terbuka. Element memberi Anda privasi, kepatuhan keamanan, dan fleksibilitas integrasi. Miliki data Anda -Anda memutuskan di mana menyimpan data dan pesan Anda. Tanpa risiko penambangan data atau akses dari pihak ketiga. +Anda memutuskan di mana untuk menyimpan data dan pesan-pesan Anda, tanpa risiko penambangan data atau akses dari pihak ketiga. Element menempatkan Anda dalam kendali dengan cara yang berbeda: 1. Dapatkan akun gratis pada server publik matrix.org yang dihost oleh pengembang Matrix, atau memilih dari ribuan server publik yang dihost oleh sukarelawan 2. Host sendiri akun Anda dengan menjalankan server pada infrastruktur IT Anda sendiri -3. Daftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services +3. Daftar untuk akun di server khusus dengan berlangganan platform hosting Layanan Matrix Element Pesan terbuka dan kolaborasi -Anda dapat mengobrol dengan siapa saja di jaringan Matrix, apakah mereka menggunakan Element, aplikasi Matrix lain atau bahkan jika mereka menggunakan aplikasi perpesanan yang berbeda. +Anda dapat mengobrol dengan siapa saja di jaringan Matrix, jika mereka menggunakan Element, aplikasi Matrix lain atau bahkan menggunakan aplikasi perpesanan yang berbeda. Sangat aman -Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan verifikasi perangkat menggunakan penandatanganan-silang. +Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam obrolan dapat mendekripsi pesan), dan verifikasi perangkat menggunakan penandatanganan silang. Komunikasi dan integrasi lengkap -Perpesanan, panggilan suara dan video, berbagi file, berbagi layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal. +Perpesanan, panggilan suara dan video, pembagian file, pembagian layar dan banyak integrasi bot dan widget. Buat ruangan dan komunitas, tetap terhubung dan selesaikan hal-hal penting. Ambil di mana Anda tinggalkan -Tetap terhubung di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io +Tetap terhubung di mana Anda berada, dengan riwayat pesan yang disinkronkan di semua perangkat Anda dan web di https://app.element.io -Open source -Element Android adalah proyek sumber terbuka, di-host oleh GitHub. Silakan melaporkan bug dan/atau membuat kontribusi ke pengembangannya di https://github.com/vector-im/element-android +Sumber terbuka +Element Android adalah proyek sumber terbuka, dihost oleh GitHub. Silakan laporkan masalah yang Anda temukan, atau membuat kontribusi ke pengembangannya di https://github.com/vector-im/element-android diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt index e6c3a2f7a9..1cd770dd73 100644 --- a/fastlane/metadata/android/id/short_description.txt +++ b/fastlane/metadata/android/id/short_description.txt @@ -1 +1 @@ -Perpesanan grup - pesan terenkripsi, panggilan grup dan video +Perpesanan grup - perpesanan, panggilan suara dan video grup terenkripsi From 60c50e23a1a3b3423aea07afa6fa8b8cc1416aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=B4men=20Ben=20Hassin?= Date: Mon, 15 Nov 2021 18:30:17 +0000 Subject: [PATCH 050/319] Added translation using Weblate (English (Old)) --- vector/src/main/res/values-ang/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vector/src/main/res/values-ang/strings.xml diff --git a/vector/src/main/res/values-ang/strings.xml b/vector/src/main/res/values-ang/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/vector/src/main/res/values-ang/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 027807b9bea7fd4ad2bc49cb2d1df3c3bc089e64 Mon Sep 17 00:00:00 2001 From: Keij0 Date: Tue, 16 Nov 2021 09:16:27 +0000 Subject: [PATCH 051/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 9a7c63fc13..e9a25a60be 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -1874,7 +1874,7 @@ Spróbuj uruchomić ponownie aplikację. Połączenie grupowe już trwa! Nie posiadasz wymaganych uprawnień aby rozpocząć połączenie grupowe w tym pokoju Nie posiadasz wymaganych uprawnień do rozpoczęcia połączenia - Nie posiadasz wymaganych uprawnień aby rozpocząć połączenie grupowe + Nie posiadasz wymaganych uprawnień, aby rozpocząć połączenie grupowe Przejrzyj swoje ustawienia aby włączyć powiadomienia PUSH Powiadomienia PUSH są wyłączone Nie udało się odblokować użytkownika @@ -2472,8 +2472,8 @@ Spróbuj uruchomić ponownie aplikację. Usunąłeś(aś) alternatywny adres %1$s dla tego pokoju. Usunąłeś(aś) alternatywne adresy %1$s dla tego pokoju. - - + + %1$s ustawił(a) główny adres tego pokoju na %2$s. @@ -2761,8 +2761,8 @@ Spróbuj uruchomić ponownie aplikację. %1$s, %2$s, %3$s i %4$d innych %1$s, %2$s, %3$s i %4$d innych - - + + %1$s, %2$s, %3$s i %4$s Niestandardowe From f59ac641bbe1661d924a7b6eca0fd6c8e3c0e050 Mon Sep 17 00:00:00 2001 From: m1chj <8hm0nutuhsa9@opayq.com> Date: Tue, 16 Nov 2021 09:16:19 +0000 Subject: [PATCH 052/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 79 ++++++++++++++++++----- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index e9a25a60be..704e13613f 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -104,7 +104,7 @@ Wyświetl odszyfrowane źródło Usuń Zmień nazwę - Zgłoś zawartość + Zgłoś treść Aktywne połączenie Przychodzące połączenie grupowe. \nDołącz z %1$s lub %2$s @@ -179,7 +179,7 @@ Stwórz konto Zaloguj się Wyloguj - Adres serwera + Adres serwera domowego Szukaj Rozpocznij nową rozmowę Rozpocznij połączenie telefoniczne @@ -218,7 +218,7 @@ Zapomniałeś(-aś) hasła? Użyj niestandardowych ustawień serwera (zaawansowane) Sprawdź swój adres e-mail, aby kontynuować rejestrację - Serwer chciałby upewnić się, czy nie jesteś robotem + Potwierdź, że nie jesteś robotem Nazwa użytkownika jest już używana Zweryfikowałem adres e-mail Aby przywrócić hasło, wprowadź adres e-mail powiązany z kontem: @@ -331,7 +331,7 @@ Przyznaj dostęp w następnym oknie. Wyślij niewysłane wiadomości ponownie Usuń niewysłane wiadomości Nie znaleziono pliku - Nie masz uprawnień, aby pisać w tym pokoju + Nie masz uprawnień, aby pisać w tym pokoju. Ufaj Nie ufaj Wyloguj @@ -514,7 +514,7 @@ Zauważ, że ta czynność spowoduje ponowne uruchomienie aplikacji i może to t Pokój zawiera nieznane sesje Wybierz katalog pokojów Serwer może być wyłączony lub przeciążony - Adres serwera domowego + Nazwa serwera Wszystkie pokoje na serwerze %s Szukaj w archiwum Rozmiar czcionki @@ -907,7 +907,7 @@ Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapo Wyrzuca użytkownika z podanym ID Zmienia twój wyświetlany nick Do naprawiania zarządzania aplikacjami Matrix - Ten pokój został zamieniony i nie jest już aktywny + Ten pokój został zamieniony i nie jest już aktywny. Konwersacja jest kontynuowana tutaj Ten pokój jest kontynuacją innej rozmowy Limit pakietów został przekroczony @@ -1077,7 +1077,7 @@ Spróbuj uruchomić ponownie aplikację. Diagnostyka powiadomień Rozwiązywanie problemów Diagnostyka podstawowa nie wykazała problemów. Jeżeli wciąż nie otrzymujesz powiadomień, prosimy o przesłanie raportu o błędach, w celu ich rozwiązania. - Aplikacja nie potrzebuje łączyć się z serwerem domowym w tle, powinno to zredukować użycie baterii + Aplikacja nie potrzebuje łączyć się z serwerem domowym w tle, powinno to zmniejszyć użycie baterii Jeżeli nie pamiętasz swoich danych odzystkiwania, możesz %s. Zgubiłeś (-łaś) swój klucz odzyskiwania\? Możesz ustawić nowy w ustawieniach. Kopia zapasowa posiada poprawną sygnaturę z niezweryfikowanej sesji %s @@ -1095,7 +1095,7 @@ Spróbuj uruchomić ponownie aplikację. Dodaj Konto Zarządzanie Kluczami Kryptograficznymi Zezwól na integracje - Menadżer Integracji + Menedżer Integracji Hasło jest nieprawidłowe Hasła nie pasują do siebie Wybierz @@ -1233,8 +1233,8 @@ Spróbuj uruchomić ponownie aplikację. \n%1$s [%1$s] \n${app_name} nie ma wpływu na wystąpienie tego problemu. Na tym urządzeniu nie ma konta Google. Otwórz menadżer kont i dodaj konto Google. - Token FCM z powodzeniem zarejestrowany na serwerze domowym. - Niepowodzenie przy rejestracji tokena FCM na serwerze domowym: + Token FCM pomyślnie zarejestrowany na serwerze domowym. + Nieudana rejestracja tokena FCM na serwerze domowym: \n%1$s Usługa została zatrzymana i automatycznie uruchomiona ponownie. Usługa nie uruchomiła się ponownie @@ -1255,7 +1255,7 @@ Spróbuj uruchomić ponownie aplikację. Wprowadź adres e-mail, aby możliwe było odzyskiwanie konta. Opcjonalnie użyj adresu e-mail lub numeru telefonu aby móc zostać odkrytym przez znajomych. Wprowadź adres e-mail, aby możliwe było odzyskiwanie konta. Opcjonalnie użyj adresu e-mail lub numeru telefonu aby móc zostać odkrytym przez znajomych. Pozwól na awaryjny serwer wspomagania połączeń - Użyje %s aby wspomagać gdy Twój serwer domowy takiego nie ofertuje (Twój adres IP będzie udostępniony podczas połączenia) + Użyj %s, gdy Twój serwer domowy takiego nie ofertuje (Twój adres IP będzie udostępniony podczas połączenia) [%1$s] \nBłąd jest poza kontrolą ${app_name} i nawiązując do Google sygnalizuje on, iż urządzenie posiada zbyt wiele aplikacji zarejestrowanych z FCM. Błąd występuje jedynie w przypadku posiadania skrajnie wielu aplikacji, w związku z czym nie powinno dotknąć to normalnego użytkownika. [%1$s] @@ -1281,8 +1281,8 @@ Spróbuj uruchomić ponownie aplikację. Preferowany interwał synchronizacji %s \nSynchronizacja może zostać opóźniona w zależności od zasobów (bateria) lub stanu urządzenia (hibernacja). - Użyj Menedżera Integracji aby zarządzać botami, mostami, widżetami oraz pakietami naklejek. -\nMenadżerowie Integracji odbierają dane konfiguracji, mogą zmieniać widżety, wysyłać zaproszenia do pokoi oraz ustawiać poziomy uprawnień na Twoje żądanie. + Użyj menedżera integracji aby zarządzać botami, mostami, widżetami i pakietami naklejek. +\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokoi i ustawiają poziomy uprawnień na Twe żądanie. Pokaż podgląd linków wewnątrz czatu jeśli twój serwer wspiera tę funkcję. Formatuj wiadomości używając składni Markdown zanim zostaną wysłane. Pozwala to na zaawansowane formatowanie takie jak używanie asterysków do wyświetlania tekstu w kursywie. Nie wpływa to na zaproszenia, wyrzucenia oraz bany. @@ -1358,7 +1358,7 @@ Spróbuj uruchomić ponownie aplikację. Klucz odzyskiwania został zapisany do \'%s\'. \n \nUwaga: plik może zostać usunięty, jeżeli aplikacja jest odinstalowana. - Kopia zapasowa już istnieje na Twoim serwerze domowym + Kopia zapasowa istnieje już na Twoim serwerze domowym Wygląda na to, iż kopia zapasowa kluczy została skonfigurowana za pomocą innej sesji. Czy chcesz zastąpić ją tą, którą tworzysz\? Generowanie Klucza Odzyskiwania używając hasła, proces może zająć kilka sekund. Kopia zapasowa uruchomiona @@ -1872,7 +1872,7 @@ Spróbuj uruchomić ponownie aplikację. Rozpocznij połączenie głosowe Rozpocznij połączenie wideo Połączenie grupowe już trwa! - Nie posiadasz wymaganych uprawnień aby rozpocząć połączenie grupowe w tym pokoju + Nie posiadasz uprawnień, aby rozpocząć połączenie grupowe w tym pokoju Nie posiadasz wymaganych uprawnień do rozpoczęcia połączenia Nie posiadasz wymaganych uprawnień, aby rozpocząć połączenie grupowe Przejrzyj swoje ustawienia aby włączyć powiadomienia PUSH @@ -2810,4 +2810,53 @@ Spróbuj uruchomić ponownie aplikację. Opuściłeś/aś pokój. Powód: %1$s %1$s opuścił/a pokój. Powód: %2$s Spotkania wykorzystują polityki bezpieczeństwa i uprawnień Jitsi. Wszystkie osoby obecne w danej chwili w pokoju zobaczą zaproszenie do dołączenia w momencie rozpoczęcia spotkania. + Serwer tożsamości nie udostępnił swojej polityki + Ukryj politykę serwera tożsamości + Wyświetl politykę serwera tożsamości + Otwórz ustawienia Poznawania + Wyszukaj nazwę + Wyszukaj po nazwie, ID lub mailu + Kompresowanie filmu %d%% + Kompresowanie obrazu… + Podziel się opinią + Nie udało się przesłać opinii (%s) + Dziękujemy, Twoja opinia została wysłana + Zachęcamy do kontaktu, jeśli masz dodatkowe pytania + Używasz przestrzeni w wersji beta. Ta opinia pomoże nam w tworzeniu kolejnych wersji. Twoja platforma i nazwa użytkownika zostaną odnotowane, abyśmy mogli w pełni wykorzystać Twoje sugestie. + Prześlij opinię o przestrzeniach + Stwórz nową przestrzeń + Wyświetla informacje o użytkowniku + Zmienia Twój awatar tylko w tym pokoju + Zmienia awatar obecnego pokoju + Zmienia Twój wyświetlany pseudonim tylko w tym pokoju + Ustawia nazwę pokoju + Przestaje ignorować użytkownika, od teraz jego wiadomości będą dla Ciebie widoczne + Ignoruje użytkownika, ukrywając dla Ciebie jego wiadomości + Opuścić obecną konferencję i przejść do innej\? + Wystąpił błąd podczas próby dołączenia do konferencji + Ten serwer znajduje się już na liście + Nie można odnaleźć tego serwera lub jego listy pokoi + Wprowadź nazwę nowego serwera, który chcesz odkrywać. + Dodaj nowy serwer + Twój serwer + Wersja pokoju + Inne przestrzenie lub pokoje, których możesz nie znać + Przestrzeń, o której wiesz, że zawiera ten pokój + Zdecyduj kto może odnaleźć i dołączyć do tego pokoju. + Dotknij, aby edytować przestrzenie + Wybierz przestrzenie + Zdecyduj które przestrzenie mogą mieć dostęp do tego pokoju. Członkowie wybranej przestrzeni będą mogli odnaleźć i dołączyć do nazwy pokoju. + Przestrzenie mogące uzyskać dostęp + Zezwól użytkownikom przestrzeni na znalezienie i dostęp. + Ulepszenia pokoju + wyproszenie użytkownika zaskutkuje usunięciem go z tej przestrzeni. +\n +\nAby uniemożliwić mu ponowne dołączenie, należy go zbanować. + Pokaż wszystkie pokoje w katalogu pokoi (również te zawierające treści dla dorosłych). + Pokaż pokoje z treścią dla dorosłych + %1$s zmienił(a) alternatywne adresy dla tego pokoju. + Dodano %1$s i usunięto %2$s jako adresy tego pokoju. + %1$s dodał(a) %2$s i usunął(eła) %3$s jako adres tego pokoju. + Odrzucono zaproszenie od %1$s. Powód: %2$s + %1$s odrzucił(a) zaproszenie %2$s. Powód: %3$s \ No newline at end of file From 2077eda611fcafde8c2e46117d97a74bdfd1249e Mon Sep 17 00:00:00 2001 From: Adam Tomaja Date: Tue, 16 Nov 2021 07:29:07 +0000 Subject: [PATCH 053/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 704e13613f..abe9869b23 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -567,8 +567,8 @@ Zauważ, że ta czynność spowoduje ponowne uruchomienie aplikacji i może to t Rejestracja jednocześnie za pomocą numeru telefonu i adresu e-mail nie jest obsługiwana dopóki nie pojawi się odpowiednie API. Tylko numer telefonu będzie brany pod uwagę. Możesz dodać adres e-mail do swojego profilu w ustawieniach. - Serwer Domowy: - Serwer Tożsamości: + Serwer domowy: + Serwer tożsamości: Twoje hasło zostało zresetowane. Zostałeś wylogowany ze wszystkich sesji i nie będziesz więcej otrzymywać powiadomień push. Aby ponownie włączyć powiadomienia, zaloguj się ponownie na każdym urządzeniu. Wprowadzony token dostępu nie został rozpoznany Uszkodzony JSON From db299a2c330840f928f152acb629c4b5c0f6bf5c Mon Sep 17 00:00:00 2001 From: mohzart Date: Mon, 15 Nov 2021 17:41:41 +0000 Subject: [PATCH 054/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index abe9869b23..a147523ce3 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2859,4 +2859,5 @@ Spróbuj uruchomić ponownie aplikację. %1$s dodał(a) %2$s i usunął(eła) %3$s jako adres tego pokoju. Odrzucono zaproszenie od %1$s. Powód: %2$s %1$s odrzucił(a) zaproszenie %2$s. Powód: %3$s + Usuń nagranie \ No newline at end of file From 3a1b50f6a272b0c90596c5080fe2b29f25c5acc8 Mon Sep 17 00:00:00 2001 From: eman luff Date: Tue, 16 Nov 2021 09:18:02 +0000 Subject: [PATCH 055/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index a147523ce3..fb8473cfaf 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2298,7 +2298,7 @@ Spróbuj uruchomić ponownie aplikację. Zezwól na dostęp do Twoich kontaktów. Wybierz urządzenie dźwiękowe Połączenie ${app_name} nieudane - Zrezygnuj + Odmów Rozpocznij konwersację Łącze Matrix Odrzuć zmiany From 597da4f9e37032b2e2bdc84cf5b941e0af741e14 Mon Sep 17 00:00:00 2001 From: m1chj <8hm0nutuhsa9@opayq.com> Date: Tue, 16 Nov 2021 09:17:37 +0000 Subject: [PATCH 056/319] Translated using Weblate (Polish) Currently translated at 92.0% (2463 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index fb8473cfaf..f2a9dc3645 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -1874,7 +1874,7 @@ Spróbuj uruchomić ponownie aplikację. Połączenie grupowe już trwa! Nie posiadasz uprawnień, aby rozpocząć połączenie grupowe w tym pokoju Nie posiadasz wymaganych uprawnień do rozpoczęcia połączenia - Nie posiadasz wymaganych uprawnień, aby rozpocząć połączenie grupowe + Nie posiadasz uprawnień, aby rozpocząć połączenie grupowe Przejrzyj swoje ustawienia aby włączyć powiadomienia PUSH Powiadomienia PUSH są wyłączone Nie udało się odblokować użytkownika From f53dd334723ccd57b4fcea4cfe4480c10c7adfc4 Mon Sep 17 00:00:00 2001 From: eman luff Date: Tue, 16 Nov 2021 10:02:24 +0000 Subject: [PATCH 057/319] Translated using Weblate (Polish) Currently translated at 92.1% (2466 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index f2a9dc3645..74b2d90aa8 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2051,7 +2051,7 @@ Spróbuj uruchomić ponownie aplikację. Zapobiegaj przypadkowym połączeniom Wycofaj publikację Dodaj - Skopiuj + Kopiuj Zakończ rozmowę Zresetuj Tryb samolotowy jest włączony @@ -2194,7 +2194,7 @@ Spróbuj uruchomić ponownie aplikację. Zarządzaj adresami e-mail oraz numerami telefonów powiązanymi z Twoim kontem Matrix Adresy e-mail i numery telefonów Włącz \"Zezwalaj na integracje\" w Ustawieniach żeby to zrobić. - Integracje są wyłączone + Integracje są zablokowane To zastąpi obecny Klucz bądź Hasło. Wygeneruj nowy Klucz Bezpieczeństwa albo Hasło dla istniejącej kopii zapasowej. Zabezpiecza przeciwko utracie dostępu do zaszyfrowanych wiadomości oraz danych poprzez zapisanie zaszyfrowanych kluczy na Twoim serwerze. @@ -2285,7 +2285,7 @@ Spróbuj uruchomić ponownie aplikację. Kiedy pokoje są aktualizowane Zabezpiecz i odblokuj zaszyfrowane wiadomości oraz zaufane poprzez %s. Naklejka - %1$s zrobił(a) to dostępne tylko z zaproszeniem. + "%1$s zrobił(a) to dostępne tylko poprzez zaproszenie" %1$s, %2$s i %3$d czyta %1$s, %2$s i %3$d czytają @@ -2547,7 +2547,7 @@ Spróbuj uruchomić ponownie aplikację. %s zawiesił(a) połączenie Zawieś Wznów - Wróć do połączenia + Wróć do rozmowy Połączenie głosowe z %s Połączenie wideo z %s From 3887692a8e74deb98e1562de8dae920fc60c8020 Mon Sep 17 00:00:00 2001 From: m1chj <8hm0nutuhsa9@opayq.com> Date: Tue, 16 Nov 2021 10:00:00 +0000 Subject: [PATCH 058/319] Translated using Weblate (Polish) Currently translated at 92.1% (2466 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 74b2d90aa8..db865dd188 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -218,7 +218,7 @@ Zapomniałeś(-aś) hasła? Użyj niestandardowych ustawień serwera (zaawansowane) Sprawdź swój adres e-mail, aby kontynuować rejestrację - Potwierdź, że nie jesteś robotem + Serwer domowy prosi o potwierdzenie, że nie jesteś robotem Nazwa użytkownika jest już używana Zweryfikowałem adres e-mail Aby przywrócić hasło, wprowadź adres e-mail powiązany z kontem: @@ -902,7 +902,7 @@ Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapo Określ poziom mocy użytkownika Usuwa opa użytkownikowi z podanym ID Zaprasza użytkownika z podanym ID do aktualnego pokoju - Dołącza do pokoju z podanym aliasem + Dołącza do pokoju o podanym adresie Ustawia temat pokoju Wyrzuca użytkownika z podanym ID Zmienia twój wyświetlany nick @@ -2041,7 +2041,7 @@ Spróbuj uruchomić ponownie aplikację. %d sek. Aplikacja odebrała PUSH - Przetestuj wiadomość Push + Przetestuj powiadomienia push Odbanuj użytkownika Powód zbanowania Wykopanie użytkownika spowoduje usunięcie go z tego pokoju. @@ -2298,7 +2298,7 @@ Spróbuj uruchomić ponownie aplikację. Zezwól na dostęp do Twoich kontaktów. Wybierz urządzenie dźwiękowe Połączenie ${app_name} nieudane - Odmów + Odrzuć Rozpocznij konwersację Łącze Matrix Odrzuć zmiany @@ -2860,4 +2860,5 @@ Spróbuj uruchomić ponownie aplikację. Odrzucono zaproszenie od %1$s. Powód: %2$s %1$s odrzucił(a) zaproszenie %2$s. Powód: %3$s Usuń nagranie + Opinie \ No newline at end of file From 5258cbd0c28cc0e6a49ba71640c8cede4d1f3e2c Mon Sep 17 00:00:00 2001 From: eman luff Date: Tue, 16 Nov 2021 10:34:02 +0000 Subject: [PATCH 059/319] Translated using Weblate (Polish) Currently translated at 92.2% (2467 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index db865dd188..1d40e4e0d8 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2090,7 +2090,7 @@ Spróbuj uruchomić ponownie aplikację. Ten serwer domowy pracuje na starej wersji. Poproś jego administratora o zaktualizowanie go. Możesz kontynuować, ale niektóre funkcjonalności mogą nie działać poprawnie. Użyj proszę formatu międzynarodowego (numer telefonu musi zaczynać się od \"+\") Wpisz adres serwera, którego chcesz używać - Zrobiłeś(-łaś) to dostępne tylko przez zaproszenie + Zrobiłeś(-łaś) to dostępne tylko przez zaproszenie. Uczyniłeś(-łaś) ten pokój dostępnym tylko poprzez zaproszenie. Uczyniłeś(-łaś) ten pokój publicznym dla każdego kto zna link. Nie dokonano żadnych zmian @@ -2861,4 +2861,5 @@ Spróbuj uruchomić ponownie aplikację. %1$s odrzucił(a) zaproszenie %2$s. Powód: %3$s Usuń nagranie Opinie + Synchronizacja Klucza Samopodpisującego (Self Signing key) \ No newline at end of file From b158b8f899d4246fe2f9208e730ffc46cd741547 Mon Sep 17 00:00:00 2001 From: m1chj <8hm0nutuhsa9@opayq.com> Date: Tue, 16 Nov 2021 10:08:41 +0000 Subject: [PATCH 060/319] Translated using Weblate (Polish) Currently translated at 92.2% (2467 of 2675 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- vector/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 1d40e4e0d8..c1bd7e1321 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -2285,7 +2285,7 @@ Spróbuj uruchomić ponownie aplikację. Kiedy pokoje są aktualizowane Zabezpiecz i odblokuj zaszyfrowane wiadomości oraz zaufane poprzez %s. Naklejka - "%1$s zrobił(a) to dostępne tylko poprzez zaproszenie" + %1$s wymaga otrzymania zaproszenia do dołączenia. %1$s, %2$s i %3$d czyta %1$s, %2$s i %3$d czytają From 27d6e271ad73a809983099f5e50314b92cdd2947 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Nov 2021 16:33:04 +0100 Subject: [PATCH 061/319] Add a debug layout to see social login buttons For AS preview only --- .../debug/res/layout/debug_social_login.xml | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 library/ui-styles/src/debug/res/layout/debug_social_login.xml diff --git a/library/ui-styles/src/debug/res/layout/debug_social_login.xml b/library/ui-styles/src/debug/res/layout/debug_social_login.xml new file mode 100644 index 0000000000..895ecddad4 --- /dev/null +++ b/library/ui-styles/src/debug/res/layout/debug_social_login.xml @@ -0,0 +1,113 @@ + + + + + + + +