Commit Graph

479 Commits

Author SHA1 Message Date
Marcel Hibbe
7745e75f5f
fix to leave room before loading new one
-> add callback methods to ConductorRemapping to execute after chat room was left. Whenever there is a ChatController on top, it's room is now left, before replacing the controller or pushing another one on top.

this avoids problems where entering a chat before the old one was left led to sessionId="0" for the new chat.

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-15 10:36:23 +01:00
Marcel Hibbe
85721b5b4f
fix conductor backstack when chat notification is opened
when opening a chat notification, the old chat should not be kept in the backstack. so when clicking the back button when coming from a chat that was opened by a notification, now the ConversationList opens.

by the way, this also avoids to run into bug #2181 (but it's root cause is not solved yet)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-15 10:36:22 +01:00
Marcel Hibbe
943dfa2a83
add logging to examine issue #2181
# reproduce:
1. click in chat where someone is mentioned.
2. click on the mention
3. go back to first chat

# result:
validSessionId() can be false in onDetach for the second chat when going back to first chat
-> leaveRoom is not executed
-> disposable is not disposed
-> getRoomInfo() continues to execute for old controller
-> e.g. appbar infos can be wrong (wrong avatar/title)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-15 10:36:22 +01:00
Tim Krüger
b0a68e8193
Merge pull request #2613 from nextcloud/bugfix/2612/fixNpeWhenRingtoneSilent
fix crash when joining call while silent ringtone is set
2022-12-07 14:58:34 +01:00
Marcel Hibbe
269844fbc3
simplify logic to close/keep CallNotificationActivity
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-07 14:40:52 +01:00
Marcel Hibbe
d33857e603
remove unused code
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-07 14:40:52 +01:00
Marcel Hibbe
9c4b0a00c6
remove ringtone logic (only make it depend on notification!)
this commit removes the logic to play the ringtone in CallNotificationActivity. Playing ringtone should only be controlled by the notification channel from OS!

furthermore the checks if a call is stopped or is still ongoing etc was removed from CallNotificationActivity. Instead the CallNotificationActivity now is completely dependent on the notification. If the notification is canceled, the Activity stops. If the Notification is ongoing and hangup of accept call is clicked, then the notification is canceled (including the ringtone).

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-07 14:40:47 +01:00
Tim Krüger
4b46270362
Set minSdkVersion to 23 (Android 6)
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-12-07 13:45:57 +01:00
Tim Krüger
49da463971
Replace Fresco with Coil
Fresco is replaced with Coil everywhere to make it possible to set 'minSdkVersion'
to 23. But Coil is not used directly to avoid splintering the dependency
everywhere in the code. Coil is wrapped by extension functions for 'ImageView'.

Some shared functionality is moved from 'DisplayUtils' into the
'ImageViewExtensions'.

The exisiting initialization of Coil has also be changed. The usage of the self
initialized OKHttp client is removed. If this one is added the
caching of the http client is used by Coil additionally to memory and
disk cache.

Resolves: #2227, #2376

Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-12-07 13:45:42 +01:00
Marcel Hibbe
3e6c846d62
fix crash when joining call while silent ringtone is set
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nextcloud.talk2, PID: 10874
    java.lang.NullPointerException: uri param can not be null.
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1058)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1021)
        at com.nextcloud.talk.activities.CallActivity.playCallingSound(CallActivity.java:2643)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-12-05 12:51:21 +01:00
Daniel Calviño Sánchez
6466aaea20 Fix reconnection when the web socket was abruptly closed
When the web socket is abruptly closed it is connected again and the
call is rejoined. However, the call was rejoined in a background thread,
so an exception was thrown when trying to modify the views, which
prevented the call from being joined again.

Besides that the call state needs to be explicitly changed, as if the
web socket was connected again while in a call the state would be
already "JOINED" or "IN_CONVERSATION", which prevents the signaling
settings from being fetched again after the permissions check, and
therefore also prevented the call from being joined again.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-12-02 06:51:44 +00:00
Marcel Hibbe
12cb7e423b fix to move controllers to top
add logging

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-11-30 12:08:23 +00:00
Tim Krüger
3283eb9502
Merge pull request #2575 from nextcloud/fix-is-in-call-with-video-check
Fix "isInCallWithVideo()" check
2022-11-19 18:28:38 +01:00
Tim Krüger
76c7e34102
Merge pull request #2514 from nextcloud/dependabot/gradle/com.google.android.material-material-1.7.0
Bump material from 1.6.1 to 1.7.0
2022-11-19 18:21:20 +01:00
Daniel Calviño Sánchez
b409f89616 Fix "isInCallWithVideo()" check
The call flags should be checked using bitwise operators; otherwise a
call with phone ("in call | with phone" / "in call + with phone", that
is, "0001 + 1000 = 1001" or "1 + 8 = 9") would be seen as a call with
video ("in call | with video" / "in call + with video",
"0001 + 0100 = 0101" or "1 + 4 = 5"), as "9 >= 5". On the other hand,
using bitwise operators (and only checking against "with video")
succeeds only when the call flags contain "with video" (in the previous
example, "1001 and 0100 = 0000", so it does not succeed).

The "IN_CALL" flag is no longer checked, as "WITH_VIDEO" will be set
only during calls, and therefore checking for "IN_CALL" is not needed.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-19 17:06:40 +00:00
Daniel Calviño Sánchez
45224741fd
Fix ParticipantDisplayItems not updated on events
The ParticipantDisplayItems were associated to both the session ID and
the video stream type ("video" or "screen"), but the code that gets them
was not updated to include the video stream type in the key.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-16 15:45:38 +01:00
Daniel Calviño Sánchez
990d551dd0 Fix String comparison using operator rather than "equals()"
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-16 11:57:53 +00:00
Andy Scherzinger
2e3a2be75d
bump compileSdkVersion to 32
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-11-16 11:15:21 +01:00
Andy Scherzinger
796a2683db
Merge pull request #2563 from nextcloud/use-comparison-operator-rather-than-equals-for-enums
Use comparison operator rather than equals for enums
2022-11-14 13:39:53 +01:00
Daniel Calviño Sánchez
74cf2c7a41
Use comparison operator rather than equals for enums in CallActivity
Fixes SPP_EQUALS_ON_ENUM issue from SpotBugs.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-14 11:29:29 +01:00
Daniel Calviño Sánchez
d7706b6082 Fix remote participants display with both video and screen share
ParticipantDisplayItems are not associated to a full participant but to
each of the single connections that the participant may have (video and
screen). However, when they are added to the map only the session ID is
used as key. Due to this when a participant starts a screen share the
ParticipantDisplayItem for the screen share overwrites the item for the
video, and once the screen share is stopped the old item is not
restored. Moreover, if a participant is already sharing a screen when
the local participant joins whether the video or the screen share is
shown is undefined and depends on which connection is established first.

To solve that the ParticipantDisplayItems are now associated with both
the session ID and the video stream type ("video" or "screen"). Due to
this both the video and the screen share of the remote participant are
shown in the grid view; in the future it might be better to only show
the screen share, or allow switching between screen share and video, or
show the screen share in full screen and hide the grid... but for now,
as a quick fix, this is good enough :-)

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-11 14:52:49 +00:00
Marcel Hibbe
3729f1130a
suppress some detekt warnings
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-11-10 15:40:04 +01:00
Marcel Hibbe
3a517f5760
add missed call notification, show delivery delay in debug mode
- add missed call notifications in NotificationWorker and CallNotificationActivity

- introduce refactoring of Notification handling (isolate firebase stuff from other logic). All "UI-notification" logic from ChatAndCallMessagingService was moved to NotificationWorker. ChatAndCallMessagingService was renamed to NCFirebaseMessagingService because it is now only responsible for firebase stuff. This separation should make it easier for alternative push services to dock with the app (if they are incorporated in the future).

- for DEBUG mode: show delivery delay time in notifications (time between sending from firebase to receive on device).

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-11-10 12:17:23 +01:00
Tim Krüger
5a392be92e
Merge pull request #2541 from nextcloud/keep-retrying-with-exponential-backoff-if-pulling-signaling-messages-fails
Keep retrying with exponential backoff if pulling signaling messages fails
2022-11-07 12:20:32 +01:00
Daniel Calviño Sánchez
4b4b9da2b1 Add exponential backoff when trying to pull signaling messages again
When pulling signaling messages failed the source observable was
immediately subscribed again, which immediately triggered another pull.
Rather than hammering the server or a flaky network with new requests
again and again now further requests are performed with an incremental
delay (up to 16 seconds).

The delay is increased only when several requests fail in a row, and it
is reset as soon as a request succeeds.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-06 14:46:56 +01:00
Daniel Calviño Sánchez
52dda57aef Rewrite "retry(Predicate)" as "retryWhen()"
This is just a preparatory step to add exponential backoff.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-06 14:42:45 +01:00
Daniel Calviño Sánchez
54deafa514 Keep retrying if pulling signaling messages fails
When the internal signaling server is used the observable to pull
signaling messages is subscribed again after each completion, but in
case of an error it was retried only 3 times. Those 3 times are not in a
row, though, but in total for the whole observable, no matter how many
times it was subscribed again.

Due to the limitation on retries in a long call with a flaky connection
pulling the signaling messages could fail more than 3 times, which
caused the observable to finish with an error and therefore stop further
pullings. In this situation the Android app would not notice if other
participants joined or left the call, and thus it would not establish a
connection with them or stop it. To prevent that now the number of
retries is unlimited (although the retry is still stopped if the local
participant is no longer in the call).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-06 13:30:02 +01:00
Daniel Calviño Sánchez
e001d685dd Fix update of guest avatars in call participants
The URL for the avatar depends on whether the call participant is a user
or a guest and, if it is a guest, on its nick. Although the user id of a
participant does not change if the participant is a guest the nick may
be changed during a call, so the avatar URL needs to be updated as well.

As the avatar URL is fully derived from other properties it is now
calculated internally in the ParticipantDisplayItem and calculated when
any of the properties it depends on changes (also for the user id for
completeness, as technically the item could be reused for a different
participant with a different user id, even if it is not currently done).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-11-04 20:40:57 +01:00
Tim Krüger
4658292602
Merge pull request #2490 from nextcloud/bugfix/2478/fixUserStatusesForConversationList
improve fetching of user statuses in conversation list
2022-10-24 11:46:42 +02:00
Tim Krüger
a17acc779c
Merge pull request #2484 from nextcloud/fix-computing-new-sessions-in-call
Fix computing new sessions in call
2022-10-13 18:08:57 +02:00
Daniel Calviño Sánchez
3278829dba
Fix computing new sessions in a call
The new sessions are computed by substracting the old sessions (those
for which a PeerConnectionWrapper exists) from the sessions currently in
the call. However, when "oldSessions" was used for that it no longer
contained the old sessions, it only contained the sessions which were no
longer in the call. As those sessions are mutually exclusive with the
sessions currently in the call nothing was substracted from
"newSessions", and it ended being the sessions currently in the call
instead.

When the HPB is not used the list of participants in the conversation is
periodically updated every 30 seconds if no other signaling message was
received in the meantime. As the layout for a participant overrides any
previous layout for that participant this periodically reset the layout
of all participants in the call, as they were all treated as new
sessions.

When the HPB is used the list of participants in the conversation is
updated only when something changed. However, similarly to the previous
case, when that happens the layout of all participants in the call is
also reset for the same reason.

To solve that now "oldSessions" is not modified, so it contains the
sessions for which a PeerConnectionWrapper exists, and substracting it
from "newSessions" now gives only the new sessions.

The other usages of "newSessions" besides creating the connection and
setting up the layout, that is, getting the peers in the call and
changing the call status to "In conversation", should be safe if
executed only when there are new sessions rather than when there are
participants in the call but they did not change.

Resolves: #2486

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-13 15:23:59 +02:00
Daniel Calviño Sánchez
f84a621780
Do not store sessions not in call as old sessions
The old sessions are used to know which connections need to be ended
because they are no longer in the call. However, if a participant is no
longer in the call but there was no connection yet then there is no
connection that needs to be ended; any existing connection will be added
when looping through the connection list, and if it needs to be stopped
it will be found when substracting the sessions that are currently in
the call.

The old sessions are also used to find the new sessions in the call. Due
to an issue in how that is computed "newSessions" currently store the
sessions in the call rather than only the new sessions (this will be
addressed in a following commit). Nevertheless, in both cases any
session not in the call for which there is no connection either will not
make any difference in the computed "newSessions" (as they are mutually
exclusive, so they will never be removed from "newSessions" when
substracting the old sessions).

Due to all that it is not needed to store sessions not in call as old
sessions / sessions to end.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-13 15:23:54 +02:00
Daniel Calviño Sánchez
1ba6e293b2
Rename to a more accurate name
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-13 15:23:48 +02:00
Daniel Calviño Sánchez
f53cb610d3
Fuse declaration and initial assignment
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-13 15:23:39 +02:00
Marcel Hibbe
871f798720
improve fetching of user statuses in conversation list
replace
/ocs/v2.php/apps/user_status/api/v1/statuses

with
"includeStatus=true"
when fetching conversations, see https://nextcloud-talk.readthedocs.io/en/latest/conversation/

fix #2478

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-10-13 12:12:47 +02:00
Andy Scherzinger
08fb0030ec codacy: unnecessary use of fully qualified name
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-10-12 19:29:03 +00:00
Daniel Calviño Sánchez
7f86593bca
Fix avatar when setting participant layout before receiving the data
When a new participant is found and the layout for that participant is
set up the participant data might have not been fetched yet. If that
happens the user ID can not be got from the data and therefore a guest
avatar would be shown for that participant, even if that participant is
a normal user.

However, the signaling message that is used to find new participants
already includes the user ID, so it is now explicitly given and, if not,
then it is got from the participant data (which is needed when handling
the establishment of a connection, as in that case the event does not
contain the user ID).

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-10 18:55:24 +02:00
Daniel Calviño Sánchez
4f01cb855a
Fix crash when setting participant layout before receiving the data
When setting the participant layout, if the HPB is not used, the user ID
is got from the participant list data fetched when a new participant is
found. However, as the participant layout is setup as soon as a new
participant is found the data may have not been received yet, which
ended in a crash (NullPointerException). Now the access to the
participant object is guarded to prevent that.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2022-10-10 18:29:40 +02:00
Marcel Hibbe
d09c5d4865
set participantPermissions in CallNotificationActivity
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-09-28 15:45:05 +02:00
Tim Krüger
f880b4f778
Call toggle media before fetchSignalingSettings
This change fix a lateinit excepttion for 'participantPermissions'.

Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-09-26 12:39:15 +02:00
Tim Krüger
4c0aa6a235
Clearify PTT (=push to talk)
So that my future self and other valued developrs don't must also
research that the variable 'isPTTActive' is renamed to
'isPushToTalkActive'.

Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-09-26 12:39:15 +02:00
Tim Krüger
c554535bae
Respect can publish audio & video permission
With this implementation the can publish audio & video permission are
set during the creation of the 'CallActivity'. This permissions are
fixed for the complete call. If the permissions are changed by a
moderator the call must be left and joined again.

Resolves: #1783

Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-09-26 12:39:15 +02:00
Tim Krüger
dda5a9e3da
Define 'BundleKeys' as 'const'
During the migration from Java to Kotlin this was not done and resulted
in

    BundleKeys.INSTANCE.getKEY_CALL_VOICE_ONLY()

instead of

    BundleKeys.KEY_CALL_VOICE_ONLY

Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-09-26 11:41:10 +02:00
Andy Scherzinger
f7035f5306
Theme toolbar for m3
Resolves #2384

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-09-19 16:52:55 +02:00
Tim Krüger
b3a3277aa2
Merge pull request #2395 from nextcloud/show-message-in-call-state-when-the-publisher-failed
Show message in call state when the publisher failed
2022-09-19 15:43:06 +02:00
Tim Krüger
5bbd26028f
Merge pull request #2392 from nextcloud/fix-disposing-local-stream-when-the-call-activity-is-not-being-left
Fix disposing local stream when the call activity is not being left
2022-09-19 15:17:59 +02:00
Tim Krüger
e47de0afc9
Merge pull request #2390 from nextcloud/provide-visual-feeback-when-a-participant-is-not-connected
Provide visual feeback when a participant is not connected
2022-09-19 13:56:07 +02:00
Tim Krüger
eb18231e25
Merge pull request #2389 from nextcloud/fix-self-video-size-after-coming-back-from-pip-mode
Fix self video size after coming back from pip mode
2022-09-19 11:05:51 +02:00
Tim Krüger
9712d05843
Merge pull request #2394 from nextcloud/fix-call-not-joined-again-if-reconnecting-while-in-pip-mode
Fix call not joined again if reconnecting while in PiP mode
2022-09-19 10:48:57 +02:00
Tim Krüger
615e67296d
Merge pull request #2388 from nextcloud/fix-issues-when-leaving-calls
Fix issues when leaving calls
2022-09-19 10:25:38 +02:00