diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 02827bc14..8215cd874 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -311,6 +311,24 @@ class ChatActivity : } } + private val conversationMessageListener = object : SignalingMessageReceiver.ConversationMessageListener { + override fun onStartTyping(session: String?) { + val name = webSocketInstance?.getDisplayNameForSession(session) + + runOnUiThread { + Toast.makeText(this@ChatActivity, name + " started typing", Toast.LENGTH_SHORT).show() + } + } + + override fun onStopTyping(session: String?) { + val name = webSocketInstance?.getDisplayNameForSession(session) + + runOnUiThread { + Toast.makeText(this@ChatActivity, name + " stopped typing", Toast.LENGTH_SHORT).show() + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) @@ -398,6 +416,7 @@ class ChatActivity : setupWebsocket() webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener) + webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener) if (conversationUser?.userId != "?" && CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "mention-flag") @@ -1980,6 +1999,7 @@ class ChatActivity : eventBus.unregister(this) webSocketInstance?.getSignalingMessageReceiver()?.removeListener(localParticipantMessageListener) + webSocketInstance?.getSignalingMessageReceiver()?.removeListener(conversationMessageListener) findViewById(R.id.toolbar)?.setOnClickListener(null) diff --git a/app/src/main/java/com/nextcloud/talk/signaling/ConversationMessageNotifier.java b/app/src/main/java/com/nextcloud/talk/signaling/ConversationMessageNotifier.java new file mode 100644 index 000000000..5f19e29c2 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/signaling/ConversationMessageNotifier.java @@ -0,0 +1,54 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2023 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.signaling; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.Set; + + +class ConversationMessageNotifier { + + private final Set conversationMessageListeners = new LinkedHashSet<>(); + + public synchronized void addListener(SignalingMessageReceiver.ConversationMessageListener listener) { + if (listener == null) { + throw new IllegalArgumentException("conversationMessageListener can not be null"); + } + + conversationMessageListeners.add(listener); + } + + public synchronized void removeListener(SignalingMessageReceiver.ConversationMessageListener listener) { + conversationMessageListeners.remove(listener); + } + + public synchronized void notifyStartTyping(String sessionId) { + for (SignalingMessageReceiver.ConversationMessageListener listener : new ArrayList<>(conversationMessageListeners)) { + listener.onStartTyping(sessionId); + } + } + + public void notifyStopTyping(String sessionId) { + for (SignalingMessageReceiver.ConversationMessageListener listener : new ArrayList<>(conversationMessageListeners)) { + listener.onStopTyping(sessionId); + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/signaling/SignalingMessageReceiver.java b/app/src/main/java/com/nextcloud/talk/signaling/SignalingMessageReceiver.java index 8853af425..8d0c2318a 100644 --- a/app/src/main/java/com/nextcloud/talk/signaling/SignalingMessageReceiver.java +++ b/app/src/main/java/com/nextcloud/talk/signaling/SignalingMessageReceiver.java @@ -153,6 +153,14 @@ public abstract class SignalingMessageReceiver { void onUnshareScreen(); } + /** + * Listener for conversation messages. + */ + public interface ConversationMessageListener { + void onStartTyping(String session); + void onStopTyping(String session); + } + /** * Listener for WebRTC offers. * @@ -185,6 +193,8 @@ public abstract class SignalingMessageReceiver { private final CallParticipantMessageNotifier callParticipantMessageNotifier = new CallParticipantMessageNotifier(); + private final ConversationMessageNotifier conversationMessageNotifier = new ConversationMessageNotifier(); + private final OfferMessageNotifier offerMessageNotifier = new OfferMessageNotifier(); private final WebRtcMessageNotifier webRtcMessageNotifier = new WebRtcMessageNotifier(); @@ -236,6 +246,14 @@ public abstract class SignalingMessageReceiver { callParticipantMessageNotifier.removeListener(listener); } + public void addListener(ConversationMessageListener listener) { + conversationMessageNotifier.addListener(listener); + } + + public void removeListener(ConversationMessageListener listener) { + conversationMessageNotifier.removeListener(listener); + } + /** * Adds a listener for all offer messages. * @@ -563,6 +581,14 @@ public abstract class SignalingMessageReceiver { return; } + if ("startedTyping".equals(type)) { + conversationMessageNotifier.notifyStartTyping(sessionId); + } + + if ("stoppedTyping".equals(type)) { + conversationMessageNotifier.notifyStopTyping(sessionId); + } + if ("reaction".equals(type)) { // Message schema (external signaling server): // {