From a3c331019dd546316583066c291bbb4e579f740d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Mar 2021 19:18:12 +0100 Subject: [PATCH 01/13] Remove roomId from DevTools item (copy/paste error) --- .../im/vector/app/features/roomprofile/RoomProfileController.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt index bb7d041199..10e6dceebe 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt @@ -222,7 +222,6 @@ class RoomProfileController @Inject constructor( buildProfileAction( id = "devTools", title = stringProvider.getString(R.string.dev_tools_menu_name), - subtitle = roomSummary.roomId, dividerColor = dividerColor, divider = false, editable = true, From ec50f891a29e80d931af1664f3433197959c4295 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Mar 2021 19:22:29 +0100 Subject: [PATCH 02/13] Improve description format --- .../IncomingVerificationRequestHandler.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt index 48f3f0a460..fc526b5322 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt @@ -119,13 +119,18 @@ class IncomingVerificationRequestHandler @Inject constructor( Timber.v("## SAS verificationRequestCreated ${pr.transactionId}") // For incoming request we should prompt (if not in activity where this request apply) if (pr.isIncoming) { - val user = session?.getUser(pr.otherUserId) + val user = session?.getUser(pr.otherUserId)?.toMatrixItem() val name = user?.getBestName() ?: pr.otherUserId + val description = if (name == pr.otherUserId) { + name + } else { + "$name (${pr.otherUserId})" + } val alert = VerificationVectorAlert( uniqueIdForVerificationRequest(pr), context.getString(R.string.sas_incoming_request_notif_title), - "$name(${pr.otherUserId})", + description, R.drawable.ic_shield_black, shouldBeDisplayedIn = { activity -> if (activity is RoomDetailActivity) { @@ -136,7 +141,7 @@ class IncomingVerificationRequestHandler @Inject constructor( } ) .apply { - viewBinder = VerificationVectorAlert.ViewBinder(user?.toMatrixItem(), avatarRenderer.get()) + viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer.get()) contentAction = Runnable { (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { val roomId = pr.roomId From 80db39a93449902f1d610f17014bac3e08063dd4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 13:15:13 +0100 Subject: [PATCH 03/13] No alert possible in SignedOutActivity --- .../main/java/im/vector/app/features/popup/PopupAlertManager.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index 67ef0514f2..3228ffa6e1 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -26,6 +26,7 @@ import im.vector.app.R import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.utils.isAnimationDisabled import im.vector.app.features.pin.PinActivity +import im.vector.app.features.signout.hard.SignedOutActivity import im.vector.app.features.themes.ThemeUtils import timber.log.Timber import java.lang.ref.WeakReference @@ -294,6 +295,7 @@ class PopupAlertManager @Inject constructor() { private fun shouldBeDisplayedIn(alert: VectorAlert?, activity: Activity): Boolean { return alert != null && activity !is PinActivity + && activity !is SignedOutActivity && activity is VectorBaseActivity<*> && alert.shouldBeDisplayedIn.invoke(activity) } From 3b1635130843d8f64d65d0bc79af6ee8d31e17f9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 13:36:24 +0100 Subject: [PATCH 04/13] Fix bad theme change for the MainActivity --- CHANGES.md | 2 +- vector/src/main/java/im/vector/app/features/MainActivity.kt | 3 +++ .../im/vector/app/features/themes/ActivityOtherThemes.kt | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index e559879648..c3fde19bc4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,7 +8,7 @@ Improvements 🙌: - Display the room shield in all room setting screens Bugfix 🐛: - - + - Fix bad theme change for the MainActivity Translations 🗣: - diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt index 143506d4df..e6c5abe20c 100644 --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt @@ -43,6 +43,7 @@ import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.signout.hard.SignedOutActivity import im.vector.app.features.signout.soft.SoftLogoutActivity +import im.vector.app.features.themes.ActivityOtherThemes import im.vector.app.features.ui.UiStateRepository import kotlinx.parcelize.Parcelize import kotlinx.coroutines.Dispatchers @@ -83,6 +84,8 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity override fun getBinding() = ActivityMainBinding.inflate(layoutInflater) + override fun getOtherThemes() = ActivityOtherThemes.Launcher + private lateinit var args: MainActivityArgs @Inject lateinit var notificationDrawerManager: NotificationDrawerManager diff --git a/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt b/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt index 847caeab4c..a1065ed10b 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ActivityOtherThemes.kt @@ -31,6 +31,11 @@ sealed class ActivityOtherThemes(@StyleRes val dark: Int, R.style.AppTheme_Black ) + object Launcher : ActivityOtherThemes( + R.style.AppTheme_Launcher, + R.style.AppTheme_Launcher + ) + object AttachmentsPreview : ActivityOtherThemes( R.style.AppTheme_AttachmentsPreview, R.style.AppTheme_AttachmentsPreview From adca3de3b5d982136ee6012bcc2eff7425ee31d5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 13:48:49 +0100 Subject: [PATCH 05/13] Improve message with Emoji only detection (#3017) --- CHANGES.md | 1 + vector/src/main/java/im/vector/app/core/utils/Emoji.kt | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index c3fde19bc4..f0a8c2bfe0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Features ✨: Improvements 🙌: - Display the room shield in all room setting screens + - Improve message with Emoji only detection (#3017) Bugfix 🐛: - Fix bad theme change for the MainActivity diff --git a/vector/src/main/java/im/vector/app/core/utils/Emoji.kt b/vector/src/main/java/im/vector/app/core/utils/Emoji.kt index b3b9a39f30..b665236137 100644 --- a/vector/src/main/java/im/vector/app/core/utils/Emoji.kt +++ b/vector/src/main/java/im/vector/app/core/utils/Emoji.kt @@ -16,8 +16,10 @@ package im.vector.app.core.utils +import com.vanniktech.emoji.EmojiUtils import java.util.regex.Pattern +/* private val emojisPattern = Pattern.compile("((?:[\uD83C\uDF00-\uD83D\uDDFF]" + "|[\uD83E\uDD00-\uD83E\uDDFF]" + "|[\uD83D\uDE00-\uD83D\uDE4F]" + @@ -41,6 +43,7 @@ private val emojisPattern = Pattern.compile("((?:[\uD83C\uDF00-\uD83D\uDDFF]" + "|\uD83C\uDC04\uFE0F?" + "|\uD83C\uDCCF\uFE0F?" + "|[\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA]\uFE0F?))") + */ /* // A hashset from all supported emoji @@ -82,6 +85,9 @@ fun isSingleEmoji(string: String): Boolean { * @return true if the body contains only emojis */ fun containsOnlyEmojis(str: String?): Boolean { + // Now rely on vanniktech library + return EmojiUtils.isOnlyEmojis(str) + /* var res = false if (str != null && str.isNotEmpty()) { @@ -112,6 +118,7 @@ fun containsOnlyEmojis(str: String?): Boolean { } return res + */ } /** From 0eea257a25a089131daa07c9a432f1ed44727cb6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 14:15:17 +0100 Subject: [PATCH 06/13] Improve layout for more clarity --- .../fragment_ssss_access_from_passphrase.xml | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml b/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml index 6dd94d0d75..fc57d53ab3 100644 --- a/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml +++ b/vector/src/main/res/layout/fragment_ssss_access_from_passphrase.xml @@ -8,7 +8,9 @@ + android:layout_height="wrap_content" + android:paddingTop="32dp" + android:paddingBottom="32dp"> - - - - - - - - - + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/ssss_passphrase_or" /> - + \ No newline at end of file From fa1de6e6b0b8baa9a63a6a47bedab2a0f4c03a00 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 14:25:52 +0100 Subject: [PATCH 07/13] Disable color because there is no action behind. --- .../crypto/quads/SharedSecuredStoragePassphraseFragment.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt index 37d8bf9b46..ba2c923d8b 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt @@ -30,10 +30,8 @@ import im.vector.app.R import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider -import im.vector.app.core.utils.colorizeMatchingText import im.vector.app.databinding.FragmentSsssAccessFromPassphraseBinding import io.reactivex.android.schedulers.AndroidSchedulers - import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -59,8 +57,9 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor( key ) .toSpannable() - .colorizeMatchingText(pass, colorProvider.getColorFromAttribute(android.R.attr.textColorLink)) - .colorizeMatchingText(key, colorProvider.getColorFromAttribute(android.R.attr.textColorLink)) + // TODO Restore coloration when we will have a FAQ to open with those terms + // .colorizeMatchingText(pass, colorProvider.getColorFromAttribute(android.R.attr.textColorLink)) + // .colorizeMatchingText(key, colorProvider.getColorFromAttribute(android.R.attr.textColorLink)) views.ssssPassphraseEnterEdittext.editorActionEvents() .throttleFirst(300, TimeUnit.MILLISECONDS) From 485c44454b49760e66ce4e2c9a10299262cf3b89 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 15:27:56 +0100 Subject: [PATCH 08/13] Handle encrypted reactions (#2509) --- CHANGES.md | 1 + .../session/room/EventRelationsAggregationProcessor.kt | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index f0a8c2bfe0..23252ac709 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ Improvements 🙌: Bugfix 🐛: - Fix bad theme change for the MainActivity + - Handle encrypted reactions (#2509) Translations 🗣: - diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt index 60440c6359..13aab36911 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt @@ -158,6 +158,13 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr } } } + } else if (encryptedEventContent?.relatesTo?.type == RelationType.ANNOTATION) { + // Reaction + if (event.getClearType() == EventType.REACTION) { + // we got a reaction!! + Timber.v("###REACTION e2e in room $roomId , reaction eventID ${event.eventId}") + handleReaction(event, roomId, realm, userId, isLocalEcho) + } } } EventType.REDACTION -> { From 294df236c560bfbb9fe0f0baa866aca8bf6b6fe3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 15:33:25 +0100 Subject: [PATCH 09/13] Hide encrypted reactions from the timeline (#2509) --- .../home/room/detail/timeline/factory/TimelineItemFactory.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt index ccc8289e08..73f101d1f5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt @@ -64,7 +64,6 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me EventType.STATE_ROOM_SERVER_ACL, EventType.STATE_ROOM_GUEST_ACCESS, EventType.STATE_ROOM_POWER_LEVELS, - EventType.REACTION, EventType.REDACTION -> noticeItemFactory.create(event, highlight, callback) EventType.STATE_ROOM_WIDGET_LEGACY, EventType.STATE_ROOM_WIDGET -> widgetItemFactory.create(event, highlight, callback) @@ -91,6 +90,7 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me EventType.KEY_VERIFICATION_KEY, EventType.KEY_VERIFICATION_READY, EventType.KEY_VERIFICATION_MAC, + EventType.REACTION, EventType.CALL_CANDIDATES, EventType.CALL_REPLACES, EventType.CALL_SELECT_ANSWER, From 7e2a5e55f77764bf67ce5823ab9bde44e5d77baf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 15:38:14 +0100 Subject: [PATCH 10/13] Simplify signature, userId is a member of the class --- .../EventRelationsAggregationProcessor.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt index 13aab36911..8913842074 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt @@ -53,8 +53,9 @@ import org.matrix.android.sdk.internal.session.EventInsertLiveProcessor import timber.log.Timber import javax.inject.Inject -internal class EventRelationsAggregationProcessor @Inject constructor(@UserId private val userId: String) - : EventInsertLiveProcessor { +internal class EventRelationsAggregationProcessor @Inject constructor( + @UserId private val userId: String +) : EventInsertLiveProcessor { private val allowedTypes = listOf( EventType.MESSAGE, @@ -87,7 +88,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr EventType.REACTION -> { // we got a reaction!! Timber.v("###REACTION in room $roomId , reaction eventID ${event.eventId}") - handleReaction(event, roomId, realm, userId, isLocalEcho) + handleReaction(event, roomId, realm, isLocalEcho) } EventType.MESSAGE -> { if (event.unsignedData?.relations?.annotations != null) { @@ -108,7 +109,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr handleReplace(realm, event, content, roomId, isLocalEcho) } else if (content?.relatesTo?.type == RelationType.RESPONSE) { Timber.v("###RESPONSE in room $roomId for event ${event.eventId}") - handleResponse(realm, userId, event, content, roomId, isLocalEcho) + handleResponse(realm, event, content, roomId, isLocalEcho) } } @@ -122,7 +123,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr Timber.v("## SAS REF in room $roomId for event ${event.eventId}") event.content.toModel()?.relatesTo?.let { if (it.type == RelationType.REFERENCE && it.eventId != null) { - handleVerification(realm, event, roomId, isLocalEcho, it.eventId, userId) + handleVerification(realm, event, roomId, isLocalEcho, it.eventId) } } } @@ -140,7 +141,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr handleReplace(realm, event, it, roomId, isLocalEcho, encryptedEventContent.relatesTo.eventId) } else if (encryptedEventContent.relatesTo.type == RelationType.RESPONSE) { Timber.v("###RESPONSE in room $roomId for event ${event.eventId}") - handleResponse(realm, userId, event, it, roomId, isLocalEcho, encryptedEventContent.relatesTo.eventId) + handleResponse(realm, event, it, roomId, isLocalEcho, encryptedEventContent.relatesTo.eventId) } } } else if (encryptedEventContent?.relatesTo?.type == RelationType.REFERENCE) { @@ -154,7 +155,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr EventType.KEY_VERIFICATION_KEY -> { Timber.v("## SAS REF in room $roomId for event ${event.eventId}") encryptedEventContent.relatesTo.eventId?.let { - handleVerification(realm, event, roomId, isLocalEcho, it, userId) + handleVerification(realm, event, roomId, isLocalEcho, it) } } } @@ -163,7 +164,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr if (event.getClearType() == EventType.REACTION) { // we got a reaction!! Timber.v("###REACTION e2e in room $roomId , reaction eventID ${event.eventId}") - handleReaction(event, roomId, realm, userId, isLocalEcho) + handleReaction(event, roomId, realm, isLocalEcho) } } } @@ -183,7 +184,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr } } EventType.REACTION -> { - handleReactionRedact(eventToPrune, realm, userId) + handleReactionRedact(eventToPrune, realm) } } } @@ -274,7 +275,6 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr } private fun handleResponse(realm: Realm, - userId: String, event: Event, content: MessageContent, roomId: String, @@ -383,7 +383,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr } } - private fun handleReaction(event: Event, roomId: String, realm: Realm, userId: String, isLocalEcho: Boolean) { + private fun handleReaction(event: Event, roomId: String, realm: Realm, isLocalEcho: Boolean) { val content = event.content.toModel() if (content == null) { Timber.e("Malformed reaction content ${event.content}") @@ -464,7 +464,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr sourceToDiscard.deleteFromRealm() } - private fun handleReactionRedact(eventToPrune: EventEntity, realm: Realm, userId: String) { + private fun handleReactionRedact(eventToPrune: EventEntity, realm: Realm) { Timber.v("REDACTION of reaction ${eventToPrune.eventId}") // delete a reaction, need to update the annotation summary if any val reactionContent: ReactionContent = EventMapper.map(eventToPrune).content.toModel() ?: return @@ -501,7 +501,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr } } - private fun handleVerification(realm: Realm, event: Event, roomId: String, isLocalEcho: Boolean, relatedEventId: String, userId: String) { + private fun handleVerification(realm: Realm, event: Event, roomId: String, isLocalEcho: Boolean, relatedEventId: String) { val eventSummary = EventAnnotationsSummaryEntity.getOrCreate(realm, roomId, relatedEventId) val verifSummary = eventSummary.referencesSummaryEntity From c43479420aa43201b79b7f8f0741aee2c94e0302 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 15:42:42 +0100 Subject: [PATCH 11/13] Reorder signature for clarity --- .../EventRelationsAggregationProcessor.kt | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt index 8913842074..c7e09e5954 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt @@ -88,12 +88,12 @@ internal class EventRelationsAggregationProcessor @Inject constructor( EventType.REACTION -> { // we got a reaction!! Timber.v("###REACTION in room $roomId , reaction eventID ${event.eventId}") - handleReaction(event, roomId, realm, isLocalEcho) + handleReaction(realm, event, roomId, isLocalEcho) } EventType.MESSAGE -> { if (event.unsignedData?.relations?.annotations != null) { - Timber.v("###REACTION Agreggation in room $roomId for event ${event.eventId}") - handleInitialAggregatedRelations(event, roomId, event.unsignedData.relations.annotations, realm) + Timber.v("###REACTION Aggregation in room $roomId for event ${event.eventId}") + handleInitialAggregatedRelations(realm, event, roomId, event.unsignedData.relations.annotations) EventAnnotationsSummaryEntity.where(realm, roomId, event.eventId ?: "").findFirst() ?.let { @@ -164,7 +164,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor( if (event.getClearType() == EventType.REACTION) { // we got a reaction!! Timber.v("###REACTION e2e in room $roomId , reaction eventID ${event.eventId}") - handleReaction(event, roomId, realm, isLocalEcho) + handleReaction(realm, event, roomId, isLocalEcho) } } } @@ -180,11 +180,11 @@ internal class EventRelationsAggregationProcessor @Inject constructor( // was this event a m.replace val contentModel = ContentMapper.map(eventToPrune.content)?.toModel() if (RelationType.REPLACE == contentModel?.relatesTo?.type && contentModel.relatesTo?.eventId != null) { - handleRedactionOfReplace(eventToPrune, contentModel.relatesTo!!.eventId!!, realm) + handleRedactionOfReplace(realm, eventToPrune, contentModel.relatesTo!!.eventId!!) } } EventType.REACTION -> { - handleReactionRedact(eventToPrune, realm) + handleReactionRedact(realm, eventToPrune) } } } @@ -361,7 +361,10 @@ internal class EventRelationsAggregationProcessor @Inject constructor( existingPollSummary.aggregatedContent = ContentMapper.map(sumModel.toContent()) } - private fun handleInitialAggregatedRelations(event: Event, roomId: String, aggregation: AggregatedAnnotation, realm: Realm) { + private fun handleInitialAggregatedRelations(realm: Realm, + event: Event, + roomId: String, + aggregation: AggregatedAnnotation) { if (SHOULD_HANDLE_SERVER_AGREGGATION) { aggregation.chunk?.forEach { if (it.type == EventType.REACTION) { @@ -383,7 +386,10 @@ internal class EventRelationsAggregationProcessor @Inject constructor( } } - private fun handleReaction(event: Event, roomId: String, realm: Realm, isLocalEcho: Boolean) { + private fun handleReaction(realm: Realm, + event: Event, + roomId: String, + isLocalEcho: Boolean) { val content = event.content.toModel() if (content == null) { Timber.e("Malformed reaction content ${event.content}") @@ -448,7 +454,9 @@ internal class EventRelationsAggregationProcessor @Inject constructor( /** * Called when an event is deleted */ - private fun handleRedactionOfReplace(redacted: EventEntity, relatedEventId: String, realm: Realm) { + private fun handleRedactionOfReplace(realm: Realm, + redacted: EventEntity, + relatedEventId: String) { Timber.d("Handle redaction of m.replace") val eventSummary = EventAnnotationsSummaryEntity.where(realm, redacted.roomId, relatedEventId).findFirst() if (eventSummary == null) { @@ -464,7 +472,8 @@ internal class EventRelationsAggregationProcessor @Inject constructor( sourceToDiscard.deleteFromRealm() } - private fun handleReactionRedact(eventToPrune: EventEntity, realm: Realm) { + private fun handleReactionRedact(realm: Realm, + eventToPrune: EventEntity) { Timber.v("REDACTION of reaction ${eventToPrune.eventId}") // delete a reaction, need to update the annotation summary if any val reactionContent: ReactionContent = EventMapper.map(eventToPrune).content.toModel() ?: return From 2ffcc63de882e5759abc98932bb9b63f42183b83 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 16:00:49 +0100 Subject: [PATCH 12/13] Typo --- docs/notifications.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notifications.md b/docs/notifications.md index 63bf593d0d..a00fef8fae 100644 --- a/docs/notifications.md +++ b/docs/notifications.md @@ -2,7 +2,7 @@ This document aims to describe how Element android displays notifications to the # Table of Contents 1. [Prerequisites Knowledge](#prerequisites-knowledge) - * [How does a matrix client gets a message from a Home Server?](#how-does-a-matrix-client-gets-a-message-from-a-home-server) + * [How does a matrix client get a message from a Home Server?](#how-does-a-matrix-client-get-a-message-from-a-home-server) * [How does a mobile app receives push notification?](#how-does-a-mobile-app-receives-push-notification) * [Push VS Notification](#push-vs-notification) * [Push in the matrix federated world](#push-in-the-matrix-federated-world) @@ -22,7 +22,7 @@ First let's start with some prerequisite knowledge # Prerequisites Knowledge -## How does a matrix client gets a message from a Home Server? +## How does a matrix client get a message from a Home Server? In order to get messages from a home server, a matrix client need to perform a ``sync`` operation. From 684c0332d578dad0dbcf1e3a5b655e8b661183cb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Mar 2021 16:27:31 +0100 Subject: [PATCH 13/13] Remove commented out code --- .../java/im/vector/app/core/utils/Emoji.kt | 90 ------------------- 1 file changed, 90 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/utils/Emoji.kt b/vector/src/main/java/im/vector/app/core/utils/Emoji.kt index b665236137..66907ded10 100644 --- a/vector/src/main/java/im/vector/app/core/utils/Emoji.kt +++ b/vector/src/main/java/im/vector/app/core/utils/Emoji.kt @@ -17,64 +17,6 @@ package im.vector.app.core.utils import com.vanniktech.emoji.EmojiUtils -import java.util.regex.Pattern - -/* -private val emojisPattern = Pattern.compile("((?:[\uD83C\uDF00-\uD83D\uDDFF]" + - "|[\uD83E\uDD00-\uD83E\uDDFF]" + - "|[\uD83D\uDE00-\uD83D\uDE4F]" + - "|[\uD83D\uDE80-\uD83D\uDEFF]" + - "|[\u2600-\u26FF]\uFE0F?" + - "|[\u2700-\u27BF]\uFE0F?" + - "|\u24C2\uFE0F?" + - "|[\uD83C\uDDE6-\uD83C\uDDFF]{1,2}" + - "|[\uD83C\uDD70\uD83C\uDD71\uD83C\uDD7E\uD83C\uDD7F\uD83C\uDD8E\uD83C\uDD91-\uD83C\uDD9A]\uFE0F?" + - "|[\u0023\u002A\u0030-\u0039]\uFE0F?\u20E3" + - "|[\u2194-\u2199\u21A9-\u21AA]\uFE0F?" + - "|[\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55]\uFE0F?" + - "|[\u2934\u2935]\uFE0F?" + - "|[\u3030\u303D]\uFE0F?" + - "|[\u3297\u3299]\uFE0F?" + - "|[\uD83C\uDE01\uD83C\uDE02\uD83C\uDE1A\uD83C\uDE2F\uD83C\uDE32-\uD83C\uDE3A\uD83C\uDE50\uD83C\uDE51]\uFE0F?" + - "|[\u203C\u2049]\uFE0F?" + - "|[\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE]\uFE0F?" + - "|[\u00A9\u00AE]\uFE0F?" + - "|[\u2122\u2139]\uFE0F?" + - "|\uD83C\uDC04\uFE0F?" + - "|\uD83C\uDCCF\uFE0F?" + - "|[\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA]\uFE0F?))") - */ - -/* -// A hashset from all supported emoji -private var knownEmojiSet: HashSet? = null - -fun initKnownEmojiHashSet(context: Context, done: (() -> Unit)? = null) { - GlobalScope.launch { - context.resources.openRawResource(R.raw.emoji_picker_datasource).use { input -> - val moshi = Moshi.Builder().build() - val jsonAdapter = moshi.adapter(EmojiData::class.java) - val inputAsString = input.bufferedReader().use { it.readText() } - val source = jsonAdapter.fromJson(inputAsString) - knownEmojiSet = HashSet().also { - source?.emojis?.mapTo(it) { (_, value) -> - value.emojiString() - } - } - done?.invoke() - } - } -} - -fun isSingleEmoji(string: String): Boolean { - if (knownEmojiSet == null) { - Timber.e("Known Emoji Hashset not initialized") - // use fallback regexp - return containsOnlyEmojis(string) - } - return knownEmojiSet?.contains(string) ?: false -} - */ /** * Test if a string contains emojis. @@ -87,38 +29,6 @@ fun isSingleEmoji(string: String): Boolean { fun containsOnlyEmojis(str: String?): Boolean { // Now rely on vanniktech library return EmojiUtils.isOnlyEmojis(str) - /* - var res = false - - if (str != null && str.isNotEmpty()) { - val matcher = emojisPattern.matcher(str) - - var start = -1 - var end = -1 - - while (matcher.find()) { - val nextStart = matcher.start() - - // first emoji position - if (start < 0) { - if (nextStart > 0) { - return false - } - } else { - // must not have a character between - if (nextStart != end) { - return false - } - } - start = nextStart - end = matcher.end() - } - - res = -1 != start && end == str.length - } - - return res - */ } /**