Disabled settings_labs_enable_jitsi_call_notifications_default by default. Changed detection for group calls more accurate. Added tracking visibility status for jitsi notifications
This commit is contained in:
parent
9fa60139c2
commit
b63af09368
@ -23,7 +23,9 @@ import org.matrix.android.sdk.api.extensions.tryOrNull
|
|||||||
import org.matrix.android.sdk.api.failure.MatrixError
|
import org.matrix.android.sdk.api.failure.MatrixError
|
||||||
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
|
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult
|
import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.EventType.IS_JITSI_CALL
|
||||||
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
|
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.JitsiEventContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
|
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
|
||||||
@ -498,7 +500,7 @@ fun Event.getPollContent(): MessagePollContent? {
|
|||||||
return getClearContent().toModel<MessagePollContent>()
|
return getClearContent().toModel<MessagePollContent>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Event.isJitsiEvent() = this.getClearType() == EventType.STATE_ROOM_WIDGET_LEGACY
|
fun Event.isJitsiEvent() = content?.toModel<JitsiEventContent>()?.type == IS_JITSI_CALL && content.toModel<JitsiEventContent>()?.name == IS_JITSI_CALL
|
||||||
|
|
||||||
fun Event.supportsNotification() =
|
fun Event.supportsNotification() =
|
||||||
this.getClearType() in EventType.MESSAGE + EventType.POLL_START.values + EventType.POLL_END.values + EventType.STATE_ROOM_BEACON_INFO.values
|
this.getClearType() in EventType.MESSAGE + EventType.POLL_START.values + EventType.POLL_END.values + EventType.STATE_ROOM_BEACON_INFO.values
|
||||||
|
@ -108,6 +108,9 @@ object EventType {
|
|||||||
// Relation Events
|
// Relation Events
|
||||||
const val REACTION = "m.reaction"
|
const val REACTION = "m.reaction"
|
||||||
|
|
||||||
|
// Jitsi call
|
||||||
|
const val IS_JITSI_CALL = "jitsi"
|
||||||
|
|
||||||
// Poll
|
// Poll
|
||||||
val POLL_START = StableUnstableId(stable = "m.poll.start", unstable = "org.matrix.msc3381.poll.start")
|
val POLL_START = StableUnstableId(stable = "m.poll.start", unstable = "org.matrix.msc3381.poll.start")
|
||||||
val POLL_RESPONSE = StableUnstableId(stable = "m.poll.response", unstable = "org.matrix.msc3381.poll.response")
|
val POLL_RESPONSE = StableUnstableId(stable = "m.poll.response", unstable = "org.matrix.msc3381.poll.response")
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.matrix.android.sdk.api.session.room.model
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
|
import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class representing the Jitsi call state event.
|
||||||
|
*/
|
||||||
|
@JsonClass(generateAdapter = true)
|
||||||
|
data class JitsiEventContent(
|
||||||
|
@Json(name = "type") val type: String? = null,
|
||||||
|
@Json(name = "name") val name: String? = null,
|
||||||
|
)
|
@ -51,7 +51,7 @@
|
|||||||
<bool name="settings_labs_rich_text_editor_default">false</bool>
|
<bool name="settings_labs_rich_text_editor_default">false</bool>
|
||||||
<bool name="settings_labs_enable_voice_broadcast_visible">true</bool>
|
<bool name="settings_labs_enable_voice_broadcast_visible">true</bool>
|
||||||
<bool name="settings_labs_enable_voice_broadcast_default">false</bool>
|
<bool name="settings_labs_enable_voice_broadcast_default">false</bool>
|
||||||
<bool name="settings_labs_enable_jitsi_call_notifications_default">true</bool>
|
<bool name="settings_labs_enable_jitsi_call_notifications_default">false</bool>
|
||||||
<!-- Level 1: Advanced settings -->
|
<!-- Level 1: Advanced settings -->
|
||||||
|
|
||||||
<!-- Level 1: Help and about -->
|
<!-- Level 1: Help and about -->
|
||||||
|
@ -41,18 +41,29 @@ class NotifiableEventProcessor @Inject constructor(
|
|||||||
.also { Timber.d("notification message removed due to being read") }
|
.also { Timber.d("notification message removed due to being read") }
|
||||||
else -> KEEP
|
else -> KEEP
|
||||||
}
|
}
|
||||||
is NotifiableJitsiEvent -> KEEP
|
is NotifiableJitsiEvent -> {
|
||||||
|
if (it.isReceived != true) {
|
||||||
|
KEEP
|
||||||
|
} else {
|
||||||
|
REMOVE
|
||||||
|
}
|
||||||
|
}
|
||||||
is SimpleNotifiableEvent -> when (it.type) {
|
is SimpleNotifiableEvent -> when (it.type) {
|
||||||
EventType.REDACTION -> REMOVE
|
EventType.REDACTION -> REMOVE
|
||||||
else -> KEEP
|
else -> KEEP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ProcessedEvent(type, it)
|
|
||||||
|
val updatedEvent = if (it is NotifiableJitsiEvent) it.updateReceivedStatus() else it
|
||||||
|
ProcessedEvent(type, updatedEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
val removedEventsDiff = renderedEvents.filter { renderedEvent ->
|
val removedEventsDiff = renderedEvents.filter { renderedEvent ->
|
||||||
queuedEvents.none { it.eventId == renderedEvent.event.eventId }
|
queuedEvents.none { it.eventId == renderedEvent.event.eventId }
|
||||||
}.map { ProcessedEvent(REMOVE, it.event) }
|
}.map {
|
||||||
|
val updatedEvent = if (it.event is NotifiableJitsiEvent) it.event.updateReceivedStatus() else it.event
|
||||||
|
ProcessedEvent(REMOVE, updatedEvent)
|
||||||
|
}
|
||||||
|
|
||||||
return removedEventsDiff + processedEvents
|
return removedEventsDiff + processedEvents
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,8 @@ class NotifiableEventResolver @Inject constructor(
|
|||||||
ContentUrlResolver.ThumbnailMethod.SCALE
|
ContentUrlResolver.ThumbnailMethod.SCALE
|
||||||
),
|
),
|
||||||
matrixID = session.myUserId,
|
matrixID = session.myUserId,
|
||||||
soundName = null
|
soundName = null,
|
||||||
|
isReceived = null,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
|
@ -37,6 +37,7 @@ data class NotifiableJitsiEvent(
|
|||||||
// This is used for >N notification, as the result of a smart reply
|
// This is used for >N notification, as the result of a smart reply
|
||||||
val outGoingMessage: Boolean = false,
|
val outGoingMessage: Boolean = false,
|
||||||
val outGoingMessageFailed: Boolean = false,
|
val outGoingMessageFailed: Boolean = false,
|
||||||
|
var isReceived: Boolean? = null,
|
||||||
override val isRedacted: Boolean = false,
|
override val isRedacted: Boolean = false,
|
||||||
override val isUpdated: Boolean = false
|
override val isUpdated: Boolean = false
|
||||||
) : NotifiableEvent {
|
) : NotifiableEvent {
|
||||||
@ -44,4 +45,12 @@ data class NotifiableJitsiEvent(
|
|||||||
val type: String = EventType.MESSAGE
|
val type: String = EventType.MESSAGE
|
||||||
val description: String = body ?: ""
|
val description: String = body ?: ""
|
||||||
val title: String = senderName ?: ""
|
val title: String = senderName ?: ""
|
||||||
|
|
||||||
|
fun updateReceivedStatus() = this.copy(
|
||||||
|
isReceived = when (isReceived) {
|
||||||
|
null -> false
|
||||||
|
false -> true
|
||||||
|
true -> true
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
@ -30,14 +30,20 @@ class NotificationFactory @Inject constructor(
|
|||||||
|
|
||||||
fun Map<String, ProcessedJitsiEvents>.toNotifications(): List<JitsiNotification> {
|
fun Map<String, ProcessedJitsiEvents>.toNotifications(): List<JitsiNotification> {
|
||||||
return map { (roomId, events) ->
|
return map { (roomId, events) ->
|
||||||
|
if (events.all { it.event.isReceived == true }) {
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
val eventToShow = events.first { it.event.isReceived == false }
|
||||||
|
|
||||||
JitsiNotification.IncomingCall(
|
JitsiNotification.IncomingCall(
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
eventId = events.firstOrNull()?.event?.eventId.orEmpty(),
|
eventId = eventToShow.event.eventId,
|
||||||
roomName = events.firstOrNull()?.event?.roomName.orEmpty(),
|
roomName = eventToShow.event.roomName.orEmpty(),
|
||||||
notification = notificationUtils.buildIncomingJitsiCallNotification(
|
notification = notificationUtils.buildIncomingJitsiCallNotification(
|
||||||
callId = events.firstOrNull()?.event?.eventId.orEmpty().ifEmpty { roomId },
|
callId = eventToShow.event.eventId.ifEmpty { roomId },
|
||||||
signalingRoomId = roomId,
|
signalingRoomId = roomId,
|
||||||
title = events.firstOrNull()?.event?.roomName.orEmpty(),
|
title = eventToShow.event.roomName.orEmpty(),
|
||||||
fromBg = true,
|
fromBg = true,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -76,7 +76,7 @@ class NotificationRenderer @Inject constructor(
|
|||||||
jitsiNotifications.forEach { wrapper ->
|
jitsiNotifications.forEach { wrapper ->
|
||||||
when (wrapper) {
|
when (wrapper) {
|
||||||
is JitsiNotification.IncomingCall -> {
|
is JitsiNotification.IncomingCall -> {
|
||||||
Timber.d("Updating jitsi call notification ${wrapper.roomId} for room ${wrapper.roomName}")
|
Timber.d("Updating jitsi call notification ${wrapper.eventId} for room ${wrapper.roomName}")
|
||||||
if (wrapper.eventId.isNotEmpty() || wrapper.roomId.isNotEmpty()) {
|
if (wrapper.eventId.isNotEmpty() || wrapper.roomId.isNotEmpty()) {
|
||||||
val tag = wrapper.eventId.ifEmpty { wrapper.roomId }
|
val tag = wrapper.eventId.ifEmpty { wrapper.roomId }
|
||||||
notificationDisplayer.showNotificationMessage(tag, JITSI_CALL_NOTIFICATION_ID, wrapper.notification)
|
notificationDisplayer.showNotificationMessage(tag, JITSI_CALL_NOTIFICATION_ID, wrapper.notification)
|
||||||
@ -135,11 +135,8 @@ private fun List<ProcessedEvent<NotifiableEvent>>.groupByType(): GroupedNotifica
|
|||||||
}
|
}
|
||||||
is NotifiableJitsiEvent -> {
|
is NotifiableJitsiEvent -> {
|
||||||
val jitsiEvents = roomIdToJitsiEventMap.getOrPut(event.roomId) { ArrayList() }
|
val jitsiEvents = roomIdToJitsiEventMap.getOrPut(event.roomId) { ArrayList() }
|
||||||
val diffInMillis = System.currentTimeMillis() - (it.event as NotifiableJitsiEvent).timestamp
|
|
||||||
if (diffInMillis < 10000) {
|
|
||||||
jitsiEvents.add(it.castedToEventType())
|
jitsiEvents.add(it.castedToEventType())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
is SimpleNotifiableEvent -> simpleEvents.add(it.castedToEventType())
|
is SimpleNotifiableEvent -> simpleEvents.add(it.castedToEventType())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user