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>
This commit is contained in:
Daniel Calviño Sánchez 2023-05-04 05:45:23 +02:00 committed by Marcel Hibbe
parent 92d655080d
commit efab4cb664
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B

View File

@ -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