From efab4cb66479ac5a759eda7a17e1d009a745188a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Thu, 4 May 2023 05:45:23 +0200 Subject: [PATCH] Handle raised hands from the call participants rather than the signaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Although listening from the signaling was working fine and this unfortunately adds a lot of extra code it is conceptually "more correct", as the UI should not directly deal with the signaling if there is a higher abstraction available. Nevertheless, this should ease adding other similar changes, like reactions. Note that although there were already listeners for CallParticipantModel.Observer in the CallActivity they were not reused, as they handle totally unrelated things. Signed-off-by: Daniel Calviño Sánchez --- .../talk/activities/CallActivity.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index ed4f091f8..b7a7b59d9 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -296,6 +296,10 @@ public class CallActivity extends CallBaseActivity { private Handler screenParticipantDisplayItemManagersHandler = new Handler(Looper.getMainLooper()); + private Map callParticipantEventDisplayers = new HashMap<>(); + + private Handler callParticipantEventDisplayersHandler = new Handler(Looper.getMainLooper()); + private CallParticipantList.Observer callParticipantListObserver = new CallParticipantList.Observer() { @Override public void onCallParticipantsChanged(Collection joined, Collection updated, @@ -2248,6 +2252,11 @@ public class CallActivity extends CallBaseActivity { screenParticipantDisplayItemManagers.put(sessionId, screenParticipantDisplayItemManager); callParticipantModel.addObserver(screenParticipantDisplayItemManager, screenParticipantDisplayItemManagersHandler); + CallParticipantEventDisplayer callParticipantEventDisplayer = + new CallParticipantEventDisplayer(callParticipantModel); + callParticipantEventDisplayers.put(sessionId, callParticipantEventDisplayer); + callParticipantModel.addObserver(callParticipantEventDisplayer, callParticipantEventDisplayersHandler); + runOnUiThread(() -> { addParticipantDisplayItem(callParticipantModel, "video"); }); @@ -2288,6 +2297,10 @@ public class CallActivity extends CallBaseActivity { screenParticipantDisplayItemManagers.remove(sessionId); callParticipant.getCallParticipantModel().removeObserver(screenParticipantDisplayItemManager); + CallParticipantEventDisplayer callParticipantEventDisplayer = + callParticipantEventDisplayers.remove(sessionId); + callParticipant.getCallParticipantModel().removeObserver(callParticipantEventDisplayer); + callParticipant.destroy(); SignalingMessageReceiver.CallParticipantMessageListener listener = callParticipantMessageListeners.remove(sessionId); @@ -2793,16 +2806,6 @@ public class CallActivity extends CallBaseActivity { @Override public void onRaiseHand(boolean state, long timestamp) { - if (state) { - CallParticipant participant = callParticipants.get(sessionId); - if (participant != null) { - String nick = participant.getCallParticipantModel().getNick(); - runOnUiThread(() -> Toast.makeText( - context, - String.format(context.getResources().getString(R.string.nc_call_raised_hand), nick), - Toast.LENGTH_LONG).show()); - } - } } @Override @@ -2867,6 +2870,40 @@ public class CallActivity extends CallBaseActivity { } } + private class CallParticipantEventDisplayer implements CallParticipantModel.Observer { + + private final CallParticipantModel callParticipantModel; + + private boolean raisedHand; + + private CallParticipantEventDisplayer(CallParticipantModel callParticipantModel) { + this.callParticipantModel = callParticipantModel; + this.raisedHand = callParticipantModel.getRaisedHand() != null ? + callParticipantModel.getRaisedHand().getState() : false; + } + + @Override + public void onChange() { + if (callParticipantModel.getRaisedHand() == null || !callParticipantModel.getRaisedHand().getState()) { + raisedHand = false; + + return; + } + + if (raisedHand) { + return; + } + raisedHand = true; + + String nick = callParticipantModel.getNick(); + Toast.makeText(context, String.format(context.getResources().getString(R.string.nc_call_raised_hand), nick), Toast.LENGTH_LONG).show(); + } + + @Override + public void onReaction(String reaction) { + } + } + private class InternalSignalingMessageSender implements SignalingMessageSender { @Override