Commit graph

561 commits

Author SHA1 Message Date
Marcel Hibbe
bad8e2a705
avoid IllegalStateException for CallActivity#stopCallingSound
This might happen sometimes. For now it's a try-catch instead trying to control the state of the mediaPlayer which could be quite difficult.

this will avoid the following exception:

    java.lang.IllegalStateException
    	at android.media.MediaPlayer.isPlaying(Native Method)
    	at com.nextcloud.talk.activities.CallActivity.stopCallingSound(CallActivity.java:2640)
    	at com.nextcloud.talk.activities.CallActivity.lambda$setCallState$31$com-nextcloud-talk-activities-CallActivity(CallActivity.java:2583)
    	at com.nextcloud.talk.activities.CallActivity$$ExternalSyntheticLambda7.run(Unknown Source:2)
    	at android.os.Handler.handleCallback(Handler.java:883)
    	at android.os.Handler.dispatchMessage(Handler.java:100)
    	at android.os.Looper.loop(Looper.java:237)
    	at android.app.ActivityThread.main(ActivityThread.java:8167)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-02-09 14:00:15 +01:00
Marcel Hibbe
dcc323f0a8
avoid NPE in CallActivity#onDestroy
Exception java.lang.RuntimeException:
  at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:6032)
  at android.app.ActivityThread.handleDestroyActivity (ActivityThread.java:6077)
  at android.app.servertransaction.DestroyActivityItem.execute (DestroyActivityItem.java:47)
  at android.app.servertransaction.ActivityTransactionItem.execute (ActivityTransactionItem.java:45)
  at android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:176)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2443)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loopOnce (Looper.java:226)
  at android.os.Looper.loop (Looper.java:313)
  at android.app.ActivityThread.main (ActivityThread.java:8751)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135)
Caused by java.lang.NullPointerException:
  at com.nextcloud.talk.activities.CallActivity.onDestroy (CallActivity.java:1244)
  at android.app.Activity.performDestroy (Activity.java:8571)
  at android.app.Instrumentation.callActivityOnDestroy (Instrumentation.java:1364)
  at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:6019)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-02-09 14:00:14 +01:00
Marcel Hibbe
6109496ab9
Show toast whenever someone raised the hand
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-02-01 16:05:04 +01:00
Daniel Calviño Sánchez
4bd3cc826c
Keep track of raised hands by remote participants
Note the slight difference in naming between the signaling message
("raiseHand", the action) and the stored data ("RaisedHand", the record
of the action).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-02-01 12:57:41 +01:00
Daniel Calviño Sánchez
de44370710
Add listener for "raiseHand" signaling message
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-02-01 12:57:40 +01:00
Marcel Hibbe
22db09d721
move initFeaturesVisibility to onStart
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:13 +01:00
Marcel Hibbe
401bb6e2cf
Fix to check value for "recording"
with this fix it's also not necessary to check for HPB in the app. The "recording" value from capabilities is set accordingly on server side.

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:12 +01:00
Marcel Hibbe
5cc2a6d531
Don't show toast when dismiss the recording stop dialog
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:12 +01:00
Marcel Hibbe
bcf9f25596
Vibrate and show info when call recording starts
...or when entering a call where recording is in progress.

+ extract vibration handling to util

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:10 +01:00
Marcel Hibbe
9f5c85cd2e
Fix spotbugs + codacy warnings
will be reverted for raise hands feature when multiple conditions are checks..

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:10 +01:00
Marcel Hibbe
707901479b
Add "This call is being recorded" hint
...when participant has no permissions to stop the recording but clicks on the recording icon.

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:10 +01:00
Marcel Hibbe
a029530eda
Remove animation for call recording icon
because it's not done on web and iOS.

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:09 +01:00
Marcel Hibbe
7c3faa658d
fix to keep sound output icons white
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:09 +01:00
Marcel Hibbe
a37edc4421
MagicWebSocketInstance.java -> WebSocketInstance.kt
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:09 +01:00
Marcel Hibbe
a8a9d6f25e
show recording controls depending on moderator state
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:08 +01:00
Marcel Hibbe
1aafc9989d
get recording status by signaling
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:08 +01:00
Marcel Hibbe
4834afaf7e
read recording state when enter call.
prepare to set recording state by signaling message (waiting for PRs from Daniel)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:08 +01:00
Marcel Hibbe
1d002b6a4d
use real endpoints instead faked ones
- fix api
- add error state for recording model

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:08 +01:00
Marcel Hibbe
0a3b4492ef
fix to show more call options without in full saturation
delete unnecessary setTint for audioOutputButton

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:07 +01:00
Marcel Hibbe
7b48b8fc1f
set more call actions visibility depending on available features
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:07 +01:00
Marcel Hibbe
fcef4b9c9b
add call recording animation
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:06 +01:00
Marcel Hibbe
bafe9198eb
add ViewModel to start/stop recording
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:06 +01:00
Marcel Hibbe
bb53982dd1
use CallRecordingRepository
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:06 +01:00
Marcel Hibbe
c663035080
add recording related buttons to call screen
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-31 15:55:05 +01:00
Marcel Hibbe
11d089485e
avoid NPE when answering call
this could happen very rarely when clicking very fast to accept the call before the conversation was set.

Exception java.lang.NullPointerException:
  at com.nextcloud.talk.activities.CallNotificationActivity.proceedToCall (CallNotificationActivity.kt:156)
  at com.nextcloud.talk.activities.CallNotificationActivity.initClickListeners$lambda$0 (CallNotificationActivity.kt:126)
  at com.nextcloud.talk.activities.CallNotificationActivity.$r8$lambda$0cnB_UmYcTD4PyxIBSZCZs1m_6s
  at com.nextcloud.talk.activities.CallNotificationActivity$$ExternalSyntheticLambda0.onClick
  at android.view.View.performClick (View.java:6612)
  at android.view.View.performClickInternal (View.java:6581)
  at android.view.View.access$3100 (View.java:785)
  at android.view.View$PerformClick.run (View.java:25904)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:280)
  at android.app.ActivityThread.main (ActivityThread.java:6706)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-20 09:31:44 +01:00
Marcel Hibbe
aec1f63da2 avoid NPE on hangup
Exception java.lang.NullPointerException:
  at com.nextcloud.talk.activities.CallActivity.hangupNetworkCalls (CallActivity.java:1749)
  at com.nextcloud.talk.activities.CallActivity.hangup (CallActivity.java:1741)
  at com.nextcloud.talk.activities.CallActivity.lambda$initClickListeners$8$com-nextcloud-talk-activities-CallActivity (CallActivity.java:465)
  at com.nextcloud.talk.activities.CallActivity$$ExternalSyntheticLambda16.onClick
  at android.view.View.performClick (View.java:7792)
  at android.view.View.performClickInternal (View.java:7769)
  at android.view.View.access$3800 (View.java:910)
  at android.view.View$PerformClick.run (View.java:30218)
  at android.os.Handler.handleCallback (Handler.java:938)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loopOnce (Looper.java:226)
  at android.os.Looper.loop (Looper.java:313)
  at android.app.ActivityThread.main (ActivityThread.java:8751)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-01-20 08:10:05 +00:00
Daniel Calviño Sánchez
67e259f792 Simplify ending the peer connections
The peer connections will be of either "video" or "screen" type, so they
can be simply removed based on the session id and an explicit type.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
9ae969b0f8 Split call participants and peer connections
Instead of trying to create a video peer connection for any joined
participant now only a call participant is created for any joined
participant, and a video peer connection is created only for those
participants that are publishing audio or video.

If a call participants does not have a video peer connection the call
participant is now seen as "connected" from the UI, as there is no need
to show a progress bar for that participant.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
2cb7572dbc Extract methods to add and remove call participants
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
ed5e8fc82e Use helper class to keep track of the participants in a call
As CallParticipantList starts listening on the signaling messages as
soon as it is created it needs to be created and destroyed right before
entering and exiting a call. Otherwise it could receive messages on
other states (for example, while the "connection timeout" message is
shown) and thus once the local participant joined the event would not
include the other participants already in the call as joined (although
they would be anyway reported as unchanged).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
0a3f515bb6 Observe only the self peer connection
The observers were created for any peer connection, but after recent
changes they ignored all changes but those from the self peer
connection. Therefore it is enough to just add an explicit listener on
that peer connection rather than on all of them.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
6728e3f063 Do not handle connection state changes to "closed"
The connection state changes to "closed" only when the connection is
closed. However, closing a connection does not fire any event (not even
the "iceConnectionStateChanged" event), so the event handler can be
removed as it will never be executed.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
534bbddc88 Create and destroy ParticipantDisplayItems based on call participants
The ParticipantDisplayItems were created and destroyed based on the peer
connections. Now a ParticipantDisplayItem of "video" type is associated
to a call participant, while an additional item is created and destroyed
depending on the state of the screen peer connection of the call
participant.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
e17a999812 Rename methods to add and remove ParticipantDisplayItems
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
5681084a14 Create and destroy helper listeners based on call participants
The listeners for call participant messages and for the call participant
nick provided by offers / answers were created and destroyed based on
the peer connections, although they were implicitly associated to a call
participant. Now they are explicitly created and destroyed based on its
associated call participant.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:51 +00:00
Daniel Calviño Sánchez
175944e932 Move handling of call participants to its own class
CallParticipant provides a read-only CallParticipantModel and internally
handles the data channel and peer connection events that modify the
model. Nevertheless, the CallParticipant requires certain properties to
be externally set, like the userId or the peer connections.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:50 +00:00
Daniel Calviño Sánchez
18f21c4f48 Update ParticipantDisplayItem from CallParticipantModel
Instead of explicitly setting the values on the ParticipantDisplayItems
now the values are set on the CallParticipantModels, and the items are
automatically updated from their model when they change.

Different items are still used for the audio/video and screen shares of
the same participant, so the type is used to select from which
properties of the model is the item updated.

As the model may be updated from background threads it is explicitly
observed by the items from the main thread using a Handler shared by all
the items.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:50 +00:00
Daniel Calviño Sánchez
8a316d94f5 Notify that data set changed automatically when display item changes
Instead of explicitly calling "notifyDataSetChanged" after setting
values on a ParticipantDisplayItem now the adapter observes all its
items and calls "notifyDataSetChanged" automatically when any of them
changes.

Although this adds some boilerplate code it will make possible to update
the ParticipantDisplayItems and automatically propagate the changes to
the adapter when a model changes, rather than having to explicitly do it
from the CallActivity.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:50 +00:00
Daniel Calviño Sánchez
339d65dff8 Handle the raw ICE connection state in the views
Rather than just providing a coarse "connected" or "not connected" value
now the views receive the raw ICE connection state. Combined with other
properties this will make possible to show a finer grained status (like
done in the WebUI), although for now just "connected" or "not connected"
is still shown as before.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2023-01-16 09:05:50 +00:00
Andy Scherzinger
95c3123727
Migrate to new parcelize Implementation for Kotlin 1.8, also extend chatKit MessageInput to provide access to UI elements of that component
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-12-30 16:58:42 +01:00
Andy Scherzinger
b07ee434fe
housekeeping: cleanup after spotbug fixes
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-12-29 11:36:59 +01:00
Andy Scherzinger
09012cce6a
Spotbugs: remove superclass field masking fields inherited from BaseActivity
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-12-29 11:36:59 +01:00
Andy Scherzinger
ff3dffd051
Spotbugs: literal string comparison
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-12-29 11:36:57 +01:00
Andy Scherzinger
7261f75549
Spotbugs: remove needless boxing of boolean constant
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-12-29 11:36:52 +01:00
Daniel Calviño Sánchez
4516de4add Remove no longer needed condition
Now that the event is posted only for proximity sensor changes the
condition is no longer needed.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:46 +01:00
Daniel Calviño Sánchez
5d7b5160b7 Rename PeerConnectionEvent to ProximitySensorEvent
Proximity sensor events should not have been part of
PeerConnectionEvent. However, now that all the peer connection related
properties were removed the remaining event can be renamed to something
more accurate.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:45 +01:00
Daniel Calviño Sánchez
34498efa72 Rewrite if/else chain as if/return blocks
Just a matter of preference :-)

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:45 +01:00
Daniel Calviño Sánchez
04f1679e2a Add observer for peer connections
The observer is just an adapter for the "PeerConnection.Observer"
provided by the WebRTC library; a custom observer is used to expose only
the events needed outside "PeerConnectionWrapper".

For now only the same events that were already handled are taken into
account, but at a later point additional events (like "onAddTrack"
instead of "onAddStream", which is deprecated) could be added too.

Note that the thread used to handle the events has changed; the EventBus
subscriber mode was "MAIN", but as the events were posted from a
PeerConnection observer, which run in a worker thread rather than in the
main thread, the subscriber was executed in the main thread rather than
in the same thread as the poster. Due to this the actions performed by
the handler now must be explicitly run in the main thread.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:45 +01:00
Daniel Calviño Sánchez
fcbfc1926d Post MediaStreamEvents for each connection state
Rather than simplifying the states to "CONNECTED" and "DISCONNECTED" now
the raw state is posted, and the handler then decides how to treat them
(which, for now, is exactly as before).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:45 +01:00
Daniel Calviño Sánchez
337f3d4b5e Extract methods to handle connections and disconnections of peers
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-28 15:48:45 +01:00