From 28c837a47f5e878cfa1ed9467563c4dd724dc14f Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 20 Feb 2019 15:47:20 +0100 Subject: [PATCH] Timeline: handle call events --- .../riotredesign/features/home/HomeModule.kt | 6 +- .../room/detail/timeline/CallItemFactory.kt | 60 +++++++++++++++++++ .../detail/timeline/TimelineItemFactory.kt | 7 +++ .../api/session/events/model/EventType.kt | 6 ++ .../room/model/call/CallAnswerContent.kt | 37 ++++++++++++ .../room/model/call/CallCandidatesContent.kt | 38 ++++++++++++ .../room/model/call/CallHangupContent.kt | 28 +++++++++ .../room/model/call/CallInviteContent.kt | 42 +++++++++++++ 8 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/CallItemFactory.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallAnswerContent.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallCandidatesContent.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallHangupContent.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallInviteContent.kt diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt index 4514fe1532..2f2d85a026 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt @@ -48,6 +48,10 @@ class HomeModule { RoomMemberItemFactory(get()) } + single { + CallItemFactory(get()) + } + single { RoomHistoryVisibilityItemFactory(get()) } @@ -57,7 +61,7 @@ class HomeModule { } single { - TimelineItemFactory(get(), get(), get(), get(), get(), get()) + TimelineItemFactory(get(), get(), get(), get(), get(), get(), get()) } single { diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/CallItemFactory.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/CallItemFactory.kt new file mode 100644 index 0000000000..b5bc183f7a --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/CallItemFactory.kt @@ -0,0 +1,60 @@ +/* + * + * * Copyright 2019 New Vector Ltd + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package im.vector.riotredesign.features.home.room.detail.timeline + +import im.vector.matrix.android.api.session.events.model.Event +import im.vector.matrix.android.api.session.events.model.EventType +import im.vector.matrix.android.api.session.events.model.toModel +import im.vector.matrix.android.api.session.room.model.RoomMember +import im.vector.matrix.android.api.session.room.model.call.CallInviteContent +import im.vector.matrix.android.api.session.room.timeline.TimelineEvent +import im.vector.riotredesign.R +import im.vector.riotredesign.core.resources.StringProvider + +class CallItemFactory(private val stringProvider: StringProvider) { + + fun create(event: TimelineEvent): NoticeItem? { + val roomMember = event.roomMember ?: return null + val text = buildNoticeText(event.root, roomMember) ?: return null + return NoticeItem_() + .noticeText(text) + .avatarUrl(roomMember.avatarUrl) + .memberName(roomMember.displayName) + } + + private fun buildNoticeText(event: Event, roomMember: RoomMember): CharSequence? { + return when { + EventType.CALL_INVITE == event.type -> { + val content = event.content.toModel()?: return null + val isVideoCall = content.offer.sdp == CallInviteContent.Offer.SDP_VIDEO + return if(isVideoCall){ + stringProvider.getString(R.string.notice_placed_video_call, roomMember.displayName) + }else{ + stringProvider.getString(R.string.notice_placed_voice_call, roomMember.displayName) + } + } + EventType.CALL_ANSWER == event.type -> stringProvider.getString(R.string.notice_answered_call, roomMember.displayName) + EventType.CALL_HANGUP == event.type -> stringProvider.getString(R.string.notice_ended_call, roomMember.displayName) + else -> null + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineItemFactory.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineItemFactory.kt index 3f6a7b4bcc..5909a01cf6 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineItemFactory.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineItemFactory.kt @@ -26,6 +26,7 @@ class TimelineItemFactory(private val messageItemFactory: MessageItemFactory, private val roomTopicItemFactory: RoomTopicItemFactory, private val roomMemberItemFactory: RoomMemberItemFactory, private val roomHistoryVisibilityItemFactory: RoomHistoryVisibilityItemFactory, + private val callItemFactory: CallItemFactory, private val defaultItemFactory: DefaultItemFactory) { fun create(event: TimelineEvent, @@ -39,8 +40,14 @@ class TimelineItemFactory(private val messageItemFactory: MessageItemFactory, EventType.STATE_ROOM_TOPIC -> roomTopicItemFactory.create(event) EventType.STATE_ROOM_MEMBER -> roomMemberItemFactory.create(event) EventType.STATE_HISTORY_VISIBILITY -> roomHistoryVisibilityItemFactory.create(event) + EventType.CALL_INVITE, + EventType.CALL_HANGUP, + EventType.CALL_ANSWER -> callItemFactory.create(event) EventType.STATE_ROOM_CREATE, EventType.STATE_ROOM_POWER_LEVELS, + EventType.STATE_ROOM_JOIN_RULES, + EventType.STATE_ROOM_GUEST_ACCESS, + EventType.CALL_CANDIDATES, EventType.REDACTION -> EmptyItem_() else -> defaultItemFactory.create(event) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/EventType.kt index e0f10bdd37..4315fd59fa 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/EventType.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/EventType.kt @@ -86,4 +86,10 @@ object EventType { return STATE_EVENTS.contains(type) } + fun isCallEvent(type: String): Boolean { + return type == CALL_INVITE + || type == CALL_CANDIDATES + || type == CALL_ANSWER + || type == CALL_HANGUP + } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallAnswerContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallAnswerContent.kt new file mode 100644 index 0000000000..89c5d1a4b6 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallAnswerContent.kt @@ -0,0 +1,37 @@ +/* + * + * * Copyright 2019 New Vector Ltd + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package im.vector.matrix.android.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class CallAnswerContent( + @Json(name = "call_id") val callId: String, + @Json(name = "version") val version: Int, + @Json(name = "answer") val answer: Answer +) { + + @JsonClass(generateAdapter = true) + data class Answer( + @Json(name = "type") val type: String, + @Json(name = "sdp") val sdp: String + ) + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallCandidatesContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallCandidatesContent.kt new file mode 100644 index 0000000000..81f7d48f60 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallCandidatesContent.kt @@ -0,0 +1,38 @@ +/* + * + * * Copyright 2019 New Vector Ltd + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package im.vector.matrix.android.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class CallCandidatesContent( + @Json(name = "call_id") val callId: String, + @Json(name = "version") val version: Int, + @Json(name = "candidates") val candidates: List = emptyList() +) { + + @JsonClass(generateAdapter = true) + data class Candidate( + @Json(name = "sdpMid") val sdpMid: String, + @Json(name = "sdpMLineIndex") val sdpMLineIndex: String, + @Json(name = "candidate") val candidate: String + ) + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallHangupContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallHangupContent.kt new file mode 100644 index 0000000000..2b7f6acd86 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallHangupContent.kt @@ -0,0 +1,28 @@ +/* + * + * * Copyright 2019 New Vector Ltd + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package im.vector.matrix.android.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class CallHangupContent( + @Json(name = "call_id") val callId: String, + @Json(name = "version") val version: Int +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallInviteContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallInviteContent.kt new file mode 100644 index 0000000000..b47e7ba291 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/call/CallInviteContent.kt @@ -0,0 +1,42 @@ +/* + * + * * Copyright 2019 New Vector Ltd + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package im.vector.matrix.android.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class CallInviteContent( + @Json(name = "call_id") val callId: String, + @Json(name = "version") val version: Int, + @Json(name = "lifetime") val lifetime: Int, + @Json(name = "offer") val offer: Offer +) { + + @JsonClass(generateAdapter = true) + data class Offer( + @Json(name = "type") val type: String, + @Json(name = "sdp") val sdp: String + ) { + companion object { + const val SDP_VIDEO = "m=video" + } + } + +} \ No newline at end of file