Browse Source

Handle raised hands from the call participants rather than the signaling

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 <danxuliu@gmail.com>
Daniel Calviño Sánchez 1 year ago
parent
commit
efab4cb664
1 changed files with 47 additions and 10 deletions
  1. 47 10
      app/src/main/java/com/nextcloud/talk/activities/CallActivity.java

+ 47 - 10
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<String, CallParticipantEventDisplayer> callParticipantEventDisplayers = new HashMap<>();
+
+    private Handler callParticipantEventDisplayersHandler = new Handler(Looper.getMainLooper());
+
     private CallParticipantList.Observer callParticipantListObserver = new CallParticipantList.Observer() {
         @Override
         public void onCallParticipantsChanged(Collection<Participant> joined, Collection<Participant> 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