the bug was, that the sent text was overwritten with "" in restoreState.
With this fix the saved state is only applied when the input field is empty (which means there was nothing shared)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Got join conversation to work
Unread message popup should work when entering a conversation now
"Delete All Messages" now works without breaking the initMessagePolling
linter
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This will fix to scroll to the last read message when a chat is opened.
Some refactorings were made that are not necessary for the fix (I tried to also show the "Unread messages" hint in the adapter but came to the conclusion this is not a good idea until chatkit is removed. Chatkit doesn't support to add some item in between but only at the end or start which will make it too complicated..)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Before, old conversations that were left still occurred in the list (only adding+updating was done, but never deleting)
also, the list is up to date when coming back from chat. Otherwise there may be unread messages shown for a short moment which were already read.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
method was extracted for other purposes but was not used in the end. Anyway it made sense to use it for resumeAudioPlaybackIfNeeded.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
fix to show unreadMessagesPopup at bottom (typingIndicatorWrapper must not be gone but invisible)
align unreadMessagesPopup to not overlap typingIndicator
fix to hide scrollDown button when unreadMessagesPopup is shown
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
replace key ban_actor with ban_participant
fix upper/lower case
fix to use translation in ConversationInfoActivity instead hardcoded string
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- New option to ban participant if your a moderator and not in one-2-one
- New fragment to see previous bans, unban if wanted
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
When opening the chat the app crashed with
2024-06-18 10:59:45.039 30757-30757 AndroidRuntime com.nextcloud.talk2 E FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 30757
java.lang.StackOverflowError: stack size 8192KB
at com.nextcloud.talk.ui.MessageInput.getMessageSendButton(MessageInput.kt:75)
Hint in AS was:
Now field from base class com.stfalcon.chatkit.messages.MessageInput shadows the property with custom getter from derived class com.nextcloud.talk.ui.MessageInput. This behavior will be changed soon in favor of the property. Please use explicit cast to com.stfalcon.chatkit.messages.MessageInput if you wish to preserve current behavior. See https://youtrack.jetbrains.com/issue/KT-55017 for details
The issue is caused by the update to kotlin2.0.
Calling the super fields fixes the issue.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.conversationinfo.ConversationInfoActivity.handleConversation (ConversationInfoActivity.kt:686)
at com.nextcloud.talk.conversationinfo.ConversationInfoActivity.access$handleConversation (ConversationInfoActivity.kt:94)
at com.nextcloud.talk.conversationinfo.ConversationInfoActivity$initObservers$2.invoke (ConversationInfoActivity.kt:232)
at com.nextcloud.talk.conversationinfo.ConversationInfoActivity$initObservers$2.invoke (ConversationInfoActivity.kt:227)
at com.nextcloud.talk.conversationinfo.ConversationInfoActivity$sam$androidx_lifecycle_Observer$0.onChanged
Handle conversation is called when capabilities are retrieved, which can occur before databaseStorageModule is created. The fix was to call initObservers after the module was created.
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
With this change, all links that target files in the same nextcloud instance will be opened in the files app, no matter on which screen the link was.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
ic_notification.xml was not existing/not used in android talk app, but on brander there is code to replace ic_notification.xml with a custom icon.
ic_notification.xml is now created with the same icon as for ic_logo.xml and used for notifications. So from now on branded versions have the ability to overwrite the icon.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
initMessageInputView() is called repeatedly when capabilities are received. This is not a good solution but was done because capabilities are needed inside initMessageInputView().
As sharedText is set inside initMessageInputView(), this caused the bug that text was repeatedly inserted in to the message input field.
All in all, there is only the need to initialize initMessageInputView() once. With this fix, it is for now done when there is no filter set yet. As a long term solution, the architecture must be changed so that initMessageInputView() is not called repeatedly, but all UI elements that need capabilities etc are updated by livedata.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Large enough to prevent onLoadMore from calling refresh on a few messages, but small enough to refresh when needed.
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
without this fix, the text when editing a message was lost after pulling chat messages (30sec), because inputEditText was initialized again with the initial text
As a fix, message editing is only initialized once when the edit button was clicked.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Before this fix, KEY_CALL_VOICE_ONLY was not included in the intent extras so call always started as videocall
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Fix to check if a conversation is "Note to self" by checking the ConversationType instead to check conversation name by hardcoded string
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
The get-room request in CallNotificationActivity was sometimes too slow which caused the activity to be unresponsive.
With this commit, the room is first loaded before the user gets a notification.
For now all necessary values are passed as intent extras. In the future with offline support, there might be reasons to load it from DB in CallNotificationActivity.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
this seems to be a relict caused by conductor back then.
CallNotificationActivity is opened directly.
There shouldn't have been any scenario anymore when it would be opened by MainActivity.
Back then with conductor, this was done because there must have been an activity to open which then opened a controller.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
without this, there would be http 404 error (nothing was shown to user):
2024-04-11 15:34:30.612 18641-18641 ProfileBottomSheet com.nextcloud.talk2 E Failed to get hover card for user user@yourfereatedserver.dev
retrofit2.adapter.rxjava2.HttpException: HTTP 404
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:57)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:38)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:48)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:35)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:608)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
With this fix, nothing happens when clicking on a federated user avatar, just like in web and iOS.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
without this, there would be the common error message shown because of a http 404 error.
With this fix, nothing happens when clicking on a federated user mention chip, just like in web and iOS.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
bug was introduced with commit 754b8250
As a result, for example the delete conversation option was not shown.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
checkbox was cut off to the left. probably some material design update changed this. Now there is no need to modify the margin anymore.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Sometimes the polls dialog seemed to not load the content.
This was caused by the showLoadingScreen logic using binding.root.post which overwrote the content depending on if the showResultsScreen or showVoteScreen already set the content. So it was a race conditions that sometimes it worked and sometimes not.
Additionally, calculating the height failed in showLoadingScreen, so in the end there was only the headline visible and even not loading spinner. This is now replaced by a fixed height.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
NPE without this fix:
Exception java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init> (ComponentName.java:132)
at android.content.Intent.<init> (Intent.java:8269)
at com.nextcloud.talk.conversation.CreateConversationDialogFragment.initiateConversation (CreateConversationDialogFragment.kt:276)
at com.nextcloud.talk.conversation.CreateConversationDialogFragment.access$initiateConversation (CreateConversationDialogFragment.kt:63)
at com.nextcloud.talk.conversation.CreateConversationDialogFragment$addParticipants$1.invoke (CreateConversationDialogFragment.kt:257)
at com.nextcloud.talk.conversation.CreateConversationDialogFragment$addParticipants$1.invoke (CreateConversationDialogFragment.kt:248)
at com.nextcloud.talk.conversation.CreateConversationDialogFragment$sam$androidx_lifecycle_Observer$0.onChanged
at androidx.lifecycle.LiveData.considerNotify (LiveData.java:133)
at androidx.lifecycle.LiveData.dispatchingValue (LiveData.java:151)
at androidx.lifecycle.LiveData.setValue (LiveData.java:309)
at androidx.lifecycle.MutableLiveData.setValue (MutableLiveData.java:50)
at androidx.lifecycle.LiveData$1.run (LiveData.java:93)
at android.os.Handler.handleCallback (Handler.java:958)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:230)
at android.os.Looper.loop (Looper.java:319)
at android.app.ActivityThread.main (ActivityThread.java:8893)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:608)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1103)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
NPE without this fix:
Exception java.lang.RuntimeException:
at android.app.ActivityThread.performResumeActivity (ActivityThread.java:4975)
at android.app.ActivityThread.handleResumeActivity (ActivityThread.java:5008)
at android.app.servertransaction.ResumeActivityItem.execute (ResumeActivityItem.java:54)
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:2386)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:210)
at android.os.Looper.loop (Looper.java:299)
at android.app.ActivityThread.main (ActivityThread.java:8252)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:559)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:954)
Caused by java.lang.NullPointerException:
at com.nextcloud.talk.conversationlist.ConversationsListActivity.onResume (ConversationsListActivity.kt:287)
at android.app.Instrumentation.callActivityOnResume (Instrumentation.java:1565)
at android.app.Activity.performResume (Activity.java:8668)
at android.app.ActivityThread.performResumeActivity (ActivityThread.java:4965)
The root cause may be that the CapabilitiesWorker is not finished so the serverVersion was not added to the user.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2024-03-19 15:49:38.476 15732-17089 okhttp.OkHttpClient com.nextcloud.talk2 I {"ocs":{"meta":{"status":"ok","statuscode":200,"message":"OK"},"data":[]}}
2024-03-19 15:49:38.476 15732-17089 okhttp.OkHttpClient com.nextcloud.talk2 I <-- END HTTP (74-byte body)
2024-03-19 15:49:38.571 15732-15732 ViewRootIm...tActivity] com.nextcloud.talk2 I handleAppVisibility mAppVisible = false visible = true
2024-03-19 15:49:38.571 15732-15732 ViewRootIm...tActivity] com.nextcloud.talk2 I stopped(false) old = true
2024-03-19 15:49:38.571 15732-15732 ViewRootIm...tActivity] com.nextcloud.talk2 I WindowStopped on com.nextcloud.talk2/com.nextcloud.talk.chat.ChatActivity set to false
2024-03-19 15:49:38.695 15732-16333 WebSocketInstance com.nextcloud.talk2 D Receiving : okhttp3.internal.ws.RealWebSocket@b8eb9d5 {"type":"event","event":{"target":"room","type":"leave","leave":["01s9v73eeKC5P2QUmsEqfsi_ZmY-DaDPhs3wdFTmJkB8VzVJc1FSWUV5bVZVTEtBaVpZOUYxaDVMRlpsaG95enlFc2dXMXpQY3Y3dGNGNlNfemZiLXg5cXk1ZVNyTEkzNS0wcDZJZUdnelFYbmF6ZVMwcWRDbVBTNklLYkFHNUdwRDQ2c0VZR1RoX1JObmF2Q3hSb2YtbFNJOFRONkhFLWp2cWZBZnk2d2VSb1BsbG96VE90Vm45bFhOa2NwWWZfdTA1clJ4VFoxcHpJcHwyMjEzNTgwMTcx"]}}
2024-03-19 15:49:38.697 15732-15732 AndroidRuntime com.nextcloud.talk2 D Shutting down VM
2024-03-19 15:49:38.702 15732-15732 AndroidRuntime com.nextcloud.talk2 E FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 15732
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1441)
at java.util.HashMap$EntryIterator.next(HashMap.java:1475)
at java.util.HashMap$EntryIterator.next(HashMap.java:1473)
at com.nextcloud.talk.chat.ChatActivity.sendStopTypingMessage(ChatActivity.kt:2097)
at com.nextcloud.talk.chat.ChatActivity.updateOwnTypingStatus(ChatActivity.kt:2063)
at com.nextcloud.talk.chat.ChatActivity$initMessageInputView$1.onTextChanged(ChatActivity.kt:1162)
at android.widget.TextView.sendOnTextChanged(TextView.java:11881)
at android.widget.TextView.setText(TextView.java:6968)
at android.widget.TextView.setText(TextView.java:6751)
at android.widget.EditText.setText(EditText.java:133)
at android.widget.TextView.setText(TextView.java:6703)
at com.nextcloud.talk.chat.ChatActivity.onStart(ChatActivity.kt:575)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1510)
at android.app.Activity.performStart(Activity.java:8616)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4204)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
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:8762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
2024-03-19 15:49:38.735 15732-15732 Process com.nextcloud.talk2 I Sending signal. PID: 15732 SIG: 9
2024-03-19 15:49:39.328 1477-1521 WindowManager system_server E win=Window{9280569 u0 com.nextcloud.talk2/com.nextcloud.talk.activities.CallActivity EXITING} destroySurfaces: appStopped=false cleanupOnResume=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6539 com.android.server.wm.ActivityRecord.destroySurfaces:6520 com.android.server.wm.WindowState.onExitAnimationDone:5995 com.android.server.wm.ActivityRecord$$ExternalSyntheticLambda10.accept:2 java.util.ArrayList.forEach:1262 com.android.server.wm.ActivityRecord.onAnimationFinished:8607 com.android.server.wm.ActivityRecord.postApplyAnimation:6252
2024-03-19 15:49:40.075 19752-19752 nativeloader com.nextcloud.talk2 D Configuring classloader-namespace for other apk /data/app/~~7lbTYxiIqB-jrG8FI6_p4A==/com.nextcloud.talk2-0R1zH5b8yl__vfC9tvSYrg==/base.apk. target_sdk_version=34, uses_libraries=, library_path=/data/app/~~7lbTYxiIqB-jrG8FI6_p4A==/com.nextcloud.talk2-0R1zH5b8yl__vfC9tvSYrg==/lib/arm64:/data/app/~~7lbTYxiIqB-jrG8FI6_p4A==/com.nextcloud.talk2-0R1zH5b8yl__vfC9tvSYrg==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand:/data/user/0/com.nextcloud.talk2
2024-03-19 15:49:40.097 19752-19752 GraphicsEnvironment com.nextcloud.talk2 V ANGLE Developer option for 'com.nextcloud.talk2' set to: 'default'
2024-03-19 15:49:40.098 19752-19752 GraphicsEnvironment com.nextcloud.talk2 V ANGLE GameManagerService for com.nextcloud.talk2: false
2024-03-19 15:49:40.099 19752-19752 GraphicsEnvironment com.nextcloud.talk2
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
As far i could see this is identical to actorType, so 'source' was removed and actorType is now used.
This makes checks in ParticipantItem etc more clean
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
roomToken was added unnecessarily as it already exists as "token"
By using the duplicated roomToken, this also introduced a bug when that it could be empty.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
with same userId on both servers, the invitation panel could get shown also there were no invitations for the current account
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
In general it's a bad idea to use recyclerview inside scrollviews because of poor performance! So this is only a fix until everything is replaced with jetpack compose.
setHasFixedSize and isNestedScrollingEnabled were set to false. This might not be necessary for the current implementation, but it's recommended when using NestedScrollView.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Without this fix, the avatars for "normal" messages were not able to show avatars.
Only the messages that contained messageParameters with actor were able to show avatars(for example "userX invited userY")
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Before this with http 406 it threw a NPE and UI was shown as loading state.
With this commit an empty list is returned when there is a http error.
http 406 happens for federated rooms for now. So it might be that Shared items screen will be hidden by additional commits.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
As lastMessageId is not available for federatedRooms, the API on server side now allows the messageID to be optional. This is done by this commit: messageId is null when it's a federated room.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Without this commit, the read status was broken as X-Chat-Last-Common-Read was not used. It was removed by
https://github.com/nextcloud/talk-android/pull/3630
As a result all messages were marked as unread after waiting for 30 seconds.
With this commit the X-Chat-Last-Common-Read is used again.
Messages are marked as read again also after 30 seconds.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
also restores view position to that message and then resumes audio playback if was playing.
it allows to continue playing audio on screen rotation.
Signed-off-by: Giacomo Pacini <giacomopacini98@gmail.com>
so that audio continues playing when activity in background.
if backpressed, stops mediaplayer
Signed-off-by: Giacomo Pacini <giacomopacini98@gmail.com>
How to test:
pre-requirement:
There are open conversations
without this commit:
1. go to search screen
2. go back to conversation list
-> all open conversations are listed below own conversations
with this commit:
1. go to search screen
2. go back to conversation list
-> only own conversations are listed
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
To support federated rooms, capabilities have to be checked from the room which now also has capabilities.
If room is not federated, capabilities fromuser are still checked.
This is why CapabilitiesUtil had to be refactored to accept SpreedCapabilities which can come from room or user.
Other than that, many other changes were made as a result of this change.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
android-talk-webrtc in version 121.6167.0 doesn't allow access to
WebRtcAudioManager
WebRtcAudioUtils
anymore.
These classes were used for
HARDWARE_AEC_EXCLUDE_SET
and
OPEN_SL_ES_INCLUDE_SET
lists, which were not updated for years.
For these reasons the checks for HARDWARE_AEC_EXCLUDE_SET and OPEN_SL_ES_INCLUDE_SET are removed.
If people are complaining about different behaviour of audio performance/echoes, it's worth to have a closer look at the changes again.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
show test notification from
occ notification:test-push --talk username
This will directly show the push notification without to fetch any data from nextcloud instance.
Additionally some additions to documentation were made
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This will update the message when an edit was made on other devices.
So the system message will trigger that you are informed about a change. But instead to show the system message, you use it's information to immediately update the adapter.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Note to self option should only appear if conversation is available
- Added ic_edit_note_24_xml
- Implemented MVVM functions for cleaner data flow
- Added the option to the XML
- Works for Voice Messages
- Works for Files(and Gifs) + captions
- Works for GeoLocation Messages
- Added SnackBar
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
otherwise translators won't understand what this is.
As translations were already made a new key was introduced to avoid "Translated Untranslatable" warnings
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
When declining recording consent, 404 might be returned when leaving the call (because the call was not joined before).
It might not be the best option to handle this via onError, but for the moment (18.0.0 release) it's the most robust/lowest-risk solution without to change some state handling to check if the call was joined).
finish was added which makes sense anyway, but for declining recording consent the error snackbar was removed.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Fix injection in GetFirebasePushTokenWorker.
injection was not setup correctly in GetFirebasePushTokenWorker so the appPreferences were null. This resulted in the invinite loading screen during account setup if somehow onNewToken did not set the token.
- avoid to register push on every load of ConversationList.
- call GetFirebasePushTokenWorker instead of PushRegistrationWorker to make sure the firebase token is set(if onNewToken somehow fails to set it). Other than that, only call PushRegistrationWorker directly in NCFirebaseMessagingService as there the token is set.
- add logging
- trigger GetFirebasePushTokenWorker daily with periodical worker (instead monthly), and combine this with PushRegistrationWorker as this is defined inside GetFirebasePushTokenWorker
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
crash:
E Failed to get NC notification
retrofit2.adapter.rxjava2.HttpException: HTTP 404
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:57)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:38)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:48)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:35)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:608)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
2023-11-30 10:48:11.049 5352-5597 WM-WorkerWrapper com.nextcloud.talk2 I Worker result SUCCESS for Work [ id=f899eadb-9fd0-4bdf-8cdf-a1ea4a1aa11b, tags={ com.nextcloud.talk.jobs.NotificationWorker } ]
2023-11-30 10:48:11.056 5352-5352 AndroidRuntime com.nextcloud.talk2 D Shutting down VM
2023-11-30 10:48:11.058 5352-5352 AndroidRuntime com.nextcloud.talk2 E FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 5352
java.lang.IllegalArgumentException: No suitable parent found from the given view. Please provide a valid view.
at com.google.android.material.snackbar.Snackbar.makeInternal(Snackbar.java:200)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Implement MediaRecorderState handling
- Fixed lifecycle bug - recording and locked UI now ends after app exits
- Saves Waveform to storage after initial loading
- Fixes File caption crashes
- A couple other bugs
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- replace remaining controllers with activities
- remove conductor lib
- modify some code related to account management and conductor
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
How to test:
add
.doOnNext {
throw (RuntimeException("Exception!!!!!!!!!!!!!!!!!!!!!"))
}
after
.subscribeOn(Schedulers.io())
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Whenever there was an error when unregistering from notifications, the user was not deleted.
This could lead to multiple bugs.
Furthermore, external signaling server connection and arbitrary storage is now always handled for user deletion, which was not the case before.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Added 4 new model data classes
- Added the new API function to NcApi
- Implemented the changes in the Repository + ViewModel
- Implemented the changes in the Activity
- Added some helper functions to support impl
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- Added dialog_file_attachment_preview.xml
- Added FileAttachmentPreviewFragment.kt
- Edited ChatActivity to add captions to uploaded files, also refactored some code
- Edited the Outgoing, Incoming, and Generic Preview holders to have a caption
- Fixed some bugs with RemoteFileBrowser
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- extract dialog to SaveToStorageDialogFragment
- add ability to save files of other mimetypes than images
- use MaterialAlertDialogBuilder
- save files to matching folders depending on mimeType
- show toast
- change download icon
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
11-02 03:45:20.115 27450 27450 D CallActivity: initGridAdapter
11-02 03:45:20.116 27450 27450 D CallActivity: removeParticipantDisplayItem
11-02 03:45:20.116 27450 27450 D CallActivity: removeParticipantDisplayItem
11-02 03:45:20.119 27450 27450 W MagicWebRTCUtils: No payload types with name H264
11-02 03:45:20.141 27450 27450 W System.err: java.lang.NullPointerException: Parameter specified as non-null is null: method com.nextcloud.talk.activities.CallActiv
ity$OfferAnswerNickProvider$WebRtcMessageListener.onOffer, parameter nick
11-02 03:45:20.141 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity$OfferAnswerNickProvider$WebRtcMessageListener.onOffer(Unknown Source:7
)
11-02 03:45:20.141 27450 27450 W System.err: at com.nextcloud.talk.signaling.WebRtcMessageNotifier.notifyOffer(WebRtcMessageNotifier.java:99)
11-02 03:45:20.141 27450 27450 W System.err: at com.nextcloud.talk.signaling.SignalingMessageReceiver.processSignalingMessage(SignalingMessageReceiver.java:746)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity$InternalSignalingMessageReceiver.process(CallActivity.kt:2707)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity.receivedSignalingMessage(CallActivity.kt:1889)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity.receivedSignalingMessages(CallActivity.kt:1865)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity.access$receivedSignalingMessages(CallActivity.kt:190)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity$pullSignalingMessages$5.onNext(CallActivity.kt:1768)
11-02 03:45:20.142 27450 27450 W System.err: at com.nextcloud.talk.activities.CallActivity$pullSignalingMessages$5.onNext(CallActivity.kt:1762)
11-02 03:45:20.142 27450 27450 W System.err: at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableRetryWhen$RepeatWhenObserver.onNext(ObservableRetryWhen.java
:100)
11-02 03:45:20.143 27450 30048 W MagicWebRTCUtils: No payload types with name H264
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101
)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableTakeWhile$TakeWhileObserver.onNext(ObservableTakeWhile.java:
88)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableRepeatWhen$RepeatWhenObserver.onNext(ObservableRepeatWhen.ja
va:100)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.
java:201)
11-02 03:45:20.143 27450 27450 W System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255
)
11-02 03:45:20.144 27450 27450 W System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
11-02 03:45:20.144 27450 27450 W System.err: at android.os.Handler.handleCallback(Handler.java:938)
11-02 03:45:20.144 27450 27450 W System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
11-02 03:45:20.144 27450 27450 W System.err: at android.os.Looper.loop(Looper.java:223)
11-02 03:45:20.144 27450 27450 W System.err: at android.app.ActivityThread.main(ActivityThread.java:7664)
11-02 03:45:20.144 27450 27450 W System.err: at java.lang.reflect.Method.invoke(Native Method)
11-02 03:45:20.144 27450 27450 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
11-02 03:45:20.144 27450 27450 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
11-02 03:45:20.145 27450 27450 E AndroidRuntime: FATAL EXCEPTION: main
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
this is just a quickfix to get the correct context. However a better way would be to avoid using a context inside viewModel.
stacktrace:
303-13303 AndroidRuntime com.nextcloud.talk2 E FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 13303
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nextcloud.talk2/com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x7f1301f3
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3311)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3460)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2047)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7590)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f1301f3
at android.content.res.Resources.getText(Resources.java:381)
at android.content.res.MiuiResources.getText(MiuiResources.java:97)
at android.content.res.Resources.getString(Resources.java:474)
at com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel.<init>(RemoteFileBrowserItemsViewModel.kt:99)
at com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel_Factory.newInstance(RemoteFileBrowserItemsViewModel_Factory.java:50)
at com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel_Factory.get(RemoteFileBrowserItemsViewModel_Factory.java:39)
at com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel_Factory.get(RemoteFileBrowserItemsViewModel_Factory.java:12)
at com.nextcloud.talk.dagger.modules.ViewModelFactory.create(ViewModelModule.kt:53)
at androidx.lifecycle.ViewModelProvider$Factory.create(ViewModelProvider.kt:83)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity.initViewModel(RemoteFileBrowserActivity.kt:124)
at com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity.onCreate(RemoteFileBrowserActivity.kt:110)
at android.app.Activity.performCreate(Activity.java:7893)
at android.app.Activity.performCreate(Activity.java:7880)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3286)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3460)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2047)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7590)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2023-10-26 14:29:28.357 13303-13303 nextcloud.talk com.nextcloud.talk2 W Attempt to remove non-JNI local reference, dumping thread
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Can not add participants to the room
- Can not allow guests
- Can not make read-only
- Can not make listable
- Can not change permissions
- Can not set lobby
- Can not enable SIP
- Can not configure breakout rooms
- Can not call
- Custom Avatar
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- Fixes a bug with the processing taking to long
- Added a bunch of comments, to make maintaining this more easier
- Added LifeCycle Awareness
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
androidx.emoji2:emoji2:1.4.0 seems to fix the bug that emojis in markdown headlines are rendered too large.
To use v1.4.0 of emoji2 it was necessary to bump compileSdk to v34, which in turn required the minor changes to the overwritten
onDraw of View class.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
The "operation view" at the bottom is replaced by snackbars.
I have removed the join via public link feature for now. This was buggy, complex and incomplete. This feature must be reimplemented in a more useful place (login screen, so you can use it as a guest without using an existing instance).
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Without this fix, the ChatActivity would be started again in FileViewerUtils. There was an endless loop between ChatActivity and FileViewerUtils because of the wrong context.
Instead to open the browser, the app did nothing or freezed.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
When sharing a file by context menu that is not downloaded yet, do not open it after download but just share it. This is done by 'openWhenDownloaded' variable in chatMessage.
Pass a method to downloadFileToCache, so it's more flexible what to do when download finished.
Add some minor changes
- Added new Dialog Fragment
- Added API functions for handling reminders
- Added JSON Models for those reminders
- Implemented the reminder functions using MVVM
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
...by setting the correct context.
In removeCurrentAccount
the
WorkManager.getInstance(this) (introduced with commit 943286dd)
must be
WorkManager.getInstance(applicationContext)
because otherwise the worker is dropped when the activity is finished and might not do it's work beforehand (race condition?).
This results in users that keep the
scheduledForDeletion = true
so the next time someone tries to login with this user,
userManager.checkIfUserIsScheduledForDeletion(loginData.username!!, baseUrl!!).blockingGet()
in WebViewLoginController#parseAndLoginFromWebView
is true and
ApplicationWideMessageHolder.getInstance().messageType
is set to
ApplicationWideMessageHolder.MessageType.ACCOUNT_SCHEDULED_FOR_DELETION
which results in the "The account is scheduled for deletion, and cannot be changed" message in ServerSelectionController.
This is just a guess and i was not able to reproduce it.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
"Sharing files from storage is not possible without permission" popped up after app startup because notification permission was requested.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- Larger Bar gap
- Centered time below play/pause button
- Time is the same color as the play/pause button
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- Created AudioUtils for processing audio messages
- Created Waveform Seekbar, for visualizing a FloatArray
- Time limit of about 5 seconds, else shows regular seekbar
- Also made mediaPlayer smoother
- Fixed time discontinuity bug when playing voice messages, but only on API 28 or higher
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
this led to duplicated call of fetchSignalingSettings.
because it's already called from checkDevicePermissions().
From my pov it shouldn't be triggered in onMicrophoneClick() again, at least i can not think of any scenario and while testing everything worked as expected.
The duplicated call was there since ever(?), but after implementing #3216 this also caused the call duration timer to be run twice.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
- I did a bunch of UI logic in ChatActivity and view_message_input, mainly in setting up the recording interface
- I created a custom component, MicInputCloud, under the hood it's 3 ovals, with a hole cut in the center for the icon. The ovals are at around 50% opacity, and they each have their own rotations and size changes animated. General rotation speed and colors can be overridden by the activity implementing it.
- I also added a floating action button to activity_chat, to show when the voice recording is locked or not.
- I can replay or pause preview voice recordings before sending or deleting
- Preview voice recording is now smoother and click boxes are bigger and well defined
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
- Added duration of the voice message playing
- Fixed the seekbar bug, and made it more smoother
Signed-off-by: Julius Linus <julius.linus@nextcloud.com>
Everytime a second attempt was made to enter a call, the connection failed.
How to reproduce:
- Enter the ChatActivity
-> joins the room (so the new session is in the ApplicationWideCurrentRoomHolder)
- Start call
-> in the CallActivity we don't join again and instead execute callOrJoinRoomViaWebSocket()
- Call connection is successful
- Hangup on android
-> the ApplicationWideCurrentRoomHolder gets cleared (so also it's session)
- Staying in the chat and start the call another time
-> When we open CallActivity another time, ApplicationWideCurrentRoomHolder.sessionId is empty.Because of this, in joinRoomAndCall, joinRoom is executed again.
But as we are still in the room and have a session, joinRoom is problematic because on serverside in SignalingController - if there is still a session - it's considered as old.
So Nextcloud now sends a backend message (disinvite) to the external signaling controller that the session (of the first join) was removed.
So the External signaling server removes the session and closes the websocket. (The message for this might be improved, see https://github.com/strukturag/nextcloud-spreed-signaling/issues/512)
As the websocket is now closed, it won't be possible for the android app to send any signaling message anymore. There will just be the connecting screen and the call connection fails.
Solution for now:
ApplicationWideCurrentRoomHolder.getInstance().clear() should not be executed when hanging up, so the session won't be cleared and in the next attempt to start the call the room is not joined again mistakenly.
Instead to clear the `ApplicationWideCurrentRoomHolder`, only
setInCall(false);
setDialing(false);
are set so that the method isNotInCall() in ChatActivity remains working correctly.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
without this change the continue button was broken (no room token -> response 404 for getRoom. But for creating an open conversation getRoom should not be executed at all) and the emoji button was missing
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
reported via gplay:
Exception java.lang.NullPointerException:
at com.nextcloud.talk.profile.ProfileActivity$save$1.onError (ProfileActivity.kt:457)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated (ObservableObserveOn.java:281)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:257)
at android.app.ActivityThread.main (ActivityThread.java:8220)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:626)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1015)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
could happen when using long click on header when using the conversation search
Exception java.lang.ClassCastException:
at com.nextcloud.talk.conversationlist.ConversationsListActivity.onItemLongClick (ConversationsListActivity.kt:1027)
at eu.davidea.viewholders.FlexibleViewHolder.onLongClick (FlexibleViewHolder.java:144)
at android.view.View.performLongClickInternal (View.java:8240)
at android.view.View.performLongClick (View.java:8198)
at android.view.View.performLongClick (View.java:8216)
at android.view.View$CheckForLongPress.run (View.java:30194)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:246)
at android.app.ActivityThread.main (ActivityThread.java:8653)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This does not fix the root cause. So probably position should not be -1 here.
However if it is -1, this commit avoids the following exception and swiping to reply simply won't work.
Exception java.lang.ArrayIndexOutOfBoundsException: length=163; index=-1
at java.util.ArrayList.get (ArrayList.java:439)
at com.nextcloud.talk.chat.ChatActivity$setupSwipeToReply$messageSwipeController$1.showReplyUI (ChatActivity.kt:1144)
at com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback.setTouchListener$lambda$0 (MessageSwipeCallback.kt:137)
at com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback.$r8$lambda$hYMm2zsKL8yVqo4e364Wb8cWEW8
at com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback$$ExternalSyntheticLambda0.onTouch
at android.view.View.dispatchTouchEvent (View.java:15046)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3115)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2788)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2802)
at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:500)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1912)
at android.app.Activity.dispatchTouchEvent (Activity.java:4299)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent (WindowCallbackWrapper.java:70)
at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:458)
at android.view.View.dispatchPointerEvent (View.java:15309)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:6778)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:6578)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:6034)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:6057)
at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:6222)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:6065)
at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:6279)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:6038)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:6057)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:6065)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:6038)
at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:9206)
at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:9157)
at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:9126)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:9329)
at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:267)
at android.os.MessageQueue.nativePollOnce
at android.os.MessageQueue.next (MessageQueue.java:335)
at android.os.Looper.loopOnce (Looper.java:161)
at android.os.Looper.loop (Looper.java:288)
at android.app.ActivityThread.main (ActivityThread.java:7918)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
handleActionFromContact was not executed in onCreate of the MainActivity which is now fixed by this commit.
+ refactoring some intent handling
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
com.nextcloud.talk2 E Failed to searchContactsByPhoneNumber
java.lang.NullPointerException: Parameter specified as non-null is null: method com.nextcloud.talk.models.json.search.ContactsByNumberOCS.setMap, parameter <set-?>
at com.nextcloud.talk.models.json.search.ContactsByNumberOCS.setMap(Unknown Source:2)
at com.nextcloud.talk.models.json.search.ContactsByNumberOCS$$JsonObjectMapper.parseField(ContactsByNumberOCS$$JsonObjectMapper.java:56)
at com.nextcloud.talk.models.json.search.ContactsByNumberOCS$$JsonObjectMapper.parse(ContactsByNumberOCS$$JsonObjectMapper.java:33)
at com.nextcloud.talk.models.json.search.ContactsByNumberOCS$$JsonObjectMapper.parse(ContactsByNumberOCS$$JsonObjectMapper.java:16)
at com.nextcloud.talk.models.json.search.ContactsByNumberOverall$$JsonObjectMapper.parseField(ContactsByNumberOverall$$JsonObjectMapper.java:40)
at com.nextcloud.talk.models.json.search.ContactsByNumberOverall$$JsonObjectMapper.parse(ContactsByNumberOverall$$JsonObjectMapper.java:30)
at com.nextcloud.talk.models.json.search.ContactsByNumberOverall$$JsonObjectMapper.parse(ContactsByNumberOverall$$JsonObjectMapper.java:13)
at com.bluelinelabs.logansquare.JsonMapper.parse(JsonMapper.java:52)
at com.bluelinelabs.logansquare.LoganSquare.parse(LoganSquare.java:69)
at com.github.aurae.retrofit2.LoganSquareResponseBodyConverter.convert(LoganSquareResponseBodyConverter.java:30)
at com.github.aurae.retrofit2.LoganSquareResponseBodyConverter.convert(LoganSquareResponseBodyConverter.java:16)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:204)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:46)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:35)
at io.reactivex.Observable.subscribe(Observable.java:12284)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:608)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.AppCompat (or a descendant).
at com.google.android.material.internal.ThemeEnforcement.checkTheme (ThemeEnforcement.java:247)
at com.google.android.material.internal.ThemeEnforcement.checkAppCompatTheme (ThemeEnforcement.java:212)
at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme (ThemeEnforcement.java:147)
at com.google.android.material.internal.ThemeEnforcement.obtainTintedStyledAttributes (ThemeEnforcement.java:114)
at com.google.android.material.textfield.TextInputLayout.<init> (TextInputLayout.java:472)
at com.google.android.material.textfield.TextInputLayout.<init> (TextInputLayout.java:451)
at com.google.android.material.textfield.TextInputLayout.<init> (TextInputLayout.java:447)
at com.nextcloud.talk.settings.SettingsActivity.askForPhoneNumber (SettingsActivity.kt:935)
at com.nextcloud.talk.settings.SettingsActivity.access$askForPhoneNumber (SettingsActivity.kt:105)
at com.nextcloud.talk.settings.SettingsActivity$checkForPhoneNumber$1.onNext (SettingsActivity.kt:915)
at com.nextcloud.talk.settings.SettingsActivity$checkForPhoneNumber$1.onNext (SettingsActivity.kt:908)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
at android.os.Handler.handleCallback (Handler.java:942)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:211)
at android.os.Looper.loop (Looper.java:300)
at android.app.ActivityThread.main (ActivityThread.java:8294)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1028)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
without this fix, it could happen that pullChatMessagesPending remains true after the conversation screen was in background. As a result the check
if (pullChatMessagesPending) {
Log.d(TAG, "pullChatMessages - pullChatMessagesPending is true, exiting")
return
}
in pullChatMessages() always returns without to pull chat messages (so there was even no long-polling anymore).
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
without this fix:
after login the conversation list opened multiple times for the same user when other users already exist
reason:
proceedWithLogin() in AccountVerificationController is called multiple times because for ALL accounts (for (User user : userEntityObjectList)) the workers send their results via eventBus to
AccountVerificationController#onMessageEvent(eventStatus: EventStatus)
So depending on how many accounts exist, the ConversationList was loaded x times.
solution:
if internalAccountId is already the active one, no need to load the conversationList another time.
when there is only one account -> currentUser id and internalAccountId are the same so it would not enter the condition. Thus also allowing it when only one user exists.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
otherwise the list in the ConversationListActivity would handle it which results in unexpected user actions dialog popup
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
The parsed result was without quotes which resulted in error:
Unterminated object at character 21 of [{fromLabel=English (US),
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
sending too much data via intent always is a bad pattern which can lead to TransactionTooLargeException.
When OpenAI translation is enabled, the capabilities contain a ton of translation combinations. These capabilities are contained in 'currentUser' as well in 'selectedConversation'. So, TransactionTooLargeException was thrown.
this PR:
- avoids passing too much data as parcelables in intents (esp. conversation and user)
- introduces MVVM patterns to load required data (esp conversation) from backend (for now via requests, in the future from database first)
- introduces ConversationModel which is created out of the Conversation json model
- loads user data via injection when possible
- creates some quickfixes in ConversationBottomDialog, EntryMenuController and OperationsMenuController.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
# Send start/stop typing
Send "Typing" every 10 sec when there was a change
Send stop typing:
- when input is deleted
- when there was no input during the 10s timer
- when on leaving room
# Receive start/stop typing
Clear typing for participant after 15s if no start typing-message was received.
Use userId instead sessionId to manage typing participants. This ensures participants are not shown multiple times when using multiple devices with the same user (multisession). To get the userId via websocket, SignalingMessageReceiver and WebSocketInstance had to be modified to pass the CallWebSocketMessage in case the signalingMessage.type is related to typing. Not sure if this is the best solution but didn't find any other way.
Typing is not handled when the userId is of the own user (this could happen when using multiple devices)
In case userId is null (which happens for guests), their sessionId is used as key for the typingParticipants map.
# Other
Disable setting for typing indicator when no HPB is used + Avoid crash in chat when no HPB is used.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
this commit fixes bugs from d3056ff2825e53040ca49b86b84f91f73a3eb11c and 1185dcf17a99ca62efd32f8a53c298ec4fd6c4d0
fix onBackPressed handling to use OnBackPressedCallback
remove unnecessary onBackPressedCallback's when they only finished the activity
replaced some finishAffinity methods with finish
...
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
..."Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them as annotation attributes" by using @KeyByString
keys were also wrong by copy&paste and are now fixed
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Without this refreshing of capabilites, depending settings (for now read privacy) were never updated until app was started again because the user still contained old capabilities.
This fix will also be necessary for the typing indicator setting.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
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>
The CallParticipantModel observer now also emits one-time events that
are not reflected in the model state.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
hide delete option from conversation info edit view if no custom avatar is set
remove themed avatars (This is the price of being able to have emoji avatars)
fix dark mode url
remove avatarVersion from url if it's null
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Since most controllers were replaced by activities, the screen locking was temporarily broken. This commit fixes the screen locking to also work with the activities.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
only show users avatars.
conversation avatars were removed again for now, because this would need more work to add custom view to the supportActionBar in order to show themed drawables.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
otherwise:
E FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 13169
io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | kotlin.UninitializedPropertyAccessException: lateinit property optionsMenu has not been initialized
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:126)
at android.os.Handler.handleCallback(Handler.java:942)
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:8757)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property optionsMenu has not been initialized
at com.nextcloud.talk.conversation.info.ConversationInfoActivity.showOptionsMenu(ConversationInfoActivity.kt:214)
at com.nextcloud.talk.conversation.info.ConversationInfoActivity$fetchRoomInfo$1.onNext(ConversationInfoActivity.kt:670)
at com.nextcloud.talk.conversation.info.ConversationInfoActivity$fetchRoomInfo$1.onNext(ConversationInfoActivity.kt:652)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:942)
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:8757)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
this looks smoother when loading the avatars (less flickering)
"error" and "fallback" take over if something goes wrong.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Placeholder avatars now also come from the server. This means themed avatars from the android app itself are no longer used here. The static placeholder icons defined in loadConversationAvatar are only used when the http request fails completely.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Placeholder avatars now also come from the server. This means themed avatars from the android app itself are no longer used here. The static placeholder icons defined in loadConversationAvatar are only used when the http request fails completely.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Problem:
i want to load avatars and if no avatar is received, i want to show the placeholder.
However with coil it's not possible to make the placeholders rounded. See https://github.com/coil-kt/coil/issues/37
I could just set the old rounded drawables that we have, but then theming wouldn't work!
So i ask myself what the best solution could be:
- Somehow check beforehand if an avatar is set at all? and then choose between loading the avatar or loading the the static drawables in their own loading request.
- Somehow check if the avatar response is empty. And if yes, make another request to load the static drawables.
- Use jetpack compose instead of coil to clip the image? See https://stackoverflow.com/questions/66014834/how-to-draw-a-circular-image-in-android-jetpack-compose
- create new svg's? Somehow it should be possible to invert a circle and just overlay it over an image..?
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Because of "supported-reactions" and "predefined-backgrounds" the capabilities cannot be parsed with
`var config: HashMap<String, HashMap<String, String>>?`
As a result it was not possible to login into the app.
This is now
`var config: HashMap<String, HashMap<String, @RawValue @Contextual Any>>?` while always checking for the type when accessing the values.
"supported-reactions" and "predefined-backgrounds" are not handled yet.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
for now the message is shown empty. should be improved!
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.nextcloud.talk2, PID: 29567
java.lang.NullPointerException
at com.nextcloud.talk.models.json.chat.ChatMessage.getText(ChatMessage.kt:264)
at com.nextcloud.talk.adapters.messages.OutcomingTextMessageViewHolder.processParentMessage(OutcomingTextMessageViewHolder.kt:168)
at com.nextcloud.talk.adapters.messages.OutcomingTextMessageViewHolder.onBind(OutcomingTextMessageViewHolder.kt:100)
at com.nextcloud.talk.adapters.messages.OutcomingTextMessageViewHolder.onBind(OutcomingTextMessageViewHolder.kt:54)
at com.stfalcon.chatkit.messages.MessageHolders.bind(MessageHolders.java:596)
at com.stfalcon.chatkit.messages.MessagesListAdapter.onBindViewHolder(MessagesListAdapter.java:110)
at com.nextcloud.talk.adapters.messages.TalkMessagesListAdapter.onBindViewHolder(TalkMessagesListAdapter.java:50)
at com.nextcloud.talk.adapters.messages.TalkMessagesListAdapter.onBindViewHolder(TalkMessagesListAdapter.java:32)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7678)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7761)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6582)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6848)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6688)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6684)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2362)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1662)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1622)
at androidx.recyclerview.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1425)
at androidx.recyclerview.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1158)
at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:2009)
at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5789)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:847)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
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:8741)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
With this, it's not opened again with onBackPressed in location view. But it still opens again when app was interrupted and being shown again.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.controllers.ProfileController$save$1.onError (ProfileController.kt:457)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated (ObservableObserveOn.java:281)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
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
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>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.controllers.ChatController.setupSwipeToReply (ChatController.kt:419)
at com.nextcloud.talk.controllers.ChatController.access$setupSwipeToReply (ChatController.kt:221)
at com.nextcloud.talk.controllers.ChatController$getRoomInfo$1.onNext (ChatController.kt:378)
at com.nextcloud.talk.controllers.ChatController$getRoomInfo$1.onNext (ChatController.kt:362)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
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:7830)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1040)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.extensions.ImageViewExtensionsKt.replaceAvatar
at com.nextcloud.talk.utils.DisplayUtils.loadAvatarImage (DisplayUtils.java:465)
at com.nextcloud.talk.controllers.ProfileController$uploadAvatar$1.onNext (ProfileController.kt:645)
at com.nextcloud.talk.controllers.ProfileController$uploadAvatar$1.onNext (ProfileController.kt:639)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
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>
Chips with emojis were not shown correctly.
The message with the emoji was not correctly replaced, that's why now the key itself is passed and replaced with the chip instead to replace a text with emoji with a chip.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This change will use the own okHttpClient which also contains the trusted key.
It will avoid the SSLHandshakeException:
E/RealImageLoader: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(:com.google.android.gms@224915028@22.49.15 (100400-499306216):25)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:379)
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:337)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Before this change the initinalization of the trusted key store was
combined in one try-catch-block. If anything went wrong an new in memory
trusted key store was created. Programming against an exception is an
bad pattern.
So the initialization is now splitted into multiple try-catch-blocks
with it's own scopes and the decision if the trusted key store is newly
created in memory or loaded from a exisitng file is done by an if
condition check.
Signed-off-by: Tim Krüger <t@timkrueger.me>
this is already done in onAttach which seems to do the job fine after using workManager queues and fixing to set externalSignalingServer to user.
See commits da1714bb and 29a37086
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This is necessary as many of the workers store user data. When running in parallel, there are race conditions and user data that was stored by one worker gets directly overwritten by the next worker. E.g. this happened with the "externalSignalingServer" attribute of user:
SignalingSettingsWorker saved the user with the externalSignalingServer value, but then
CapabilitiesWorker kicked in and saved the user without this value.
Because of this, in WebsocketConnectionsWorker getExternalSignalingServer() of the user was null.
Because of this, webSocketConnectionHelper.getExternalSignalingInstanceForServer(..) was not called.
So the webSocketInstanceMap in WebSocketConnectionHelper was never filled.
This is why WebSocketConnectionHelper.getMagicWebSocketInstanceForUserId(..) in ChatController failed to get a webSocketInstance.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
the "historyRead" didn't make any sense to me, and deleting it solved the issue to avoid duplicated messages when the response was HTTP_CODE_NOT_MODIFIED
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
The solution was to avoid recursive call off pullChatMessages if lookIntoFuture is false.
However the recursive call has to be made when fetching messages for the first time:
if (isFirstMessagesProcessing || lookIntoFuture) {
pullChatMessages(true,...)
}
For this, setting of isFirstMessagesProcessing had to be moved below this code.
Furthermore in the commit:
add logging & refactoring
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
currentConversation should have already been set, but it makes sense to set it with the most current data of this case.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.controllers.ChatController.startACall (ChatController.kt:2792)
at com.nextcloud.talk.controllers.ChatController.onOptionsItemSelected (ChatController.kt:2699)
at com.bluelinelabs.conductor.Controller.optionsItemSelected (Controller.java:1399)
at com.bluelinelabs.conductor.Router.onOptionsItemSelected (Router.java:703)
at com.bluelinelabs.conductor.internal.LifecycleHandler.onOptionsItemSelected (LifecycleHandler.java:282)
at android.app.Fragment.performOptionsItemSelected (Fragment.java:2652)
at android.app.FragmentManagerImpl.dispatchOptionsItemSelected (FragmentManager.java:3189)
at android.app.FragmentController.dispatchOptionsItemSelected (FragmentController.java:374)
at android.app.Activity.onMenuItemSelected (Activity.java:4517)
at androidx.activity.ComponentActivity.onMenuItemSelected (ComponentActivity.java:514)
at androidx.fragment.app.FragmentActivity.onMenuItemSelected (FragmentActivity.java:352)
at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected (AppCompatActivity.java:266)
at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected (WindowCallbackWrapper.java:110)
at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick (ToolbarActionBar.java:66)
at androidx.appcompat.widget.Toolbar$1.onMenuItemClick (Toolbar.java:221)
at androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected (ActionMenuView.java:781)
at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected (MenuBuilder.java:836)
at androidx.appcompat.view.menu.MenuItemImpl.invoke (MenuItemImpl.java:159)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:987)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:977)
at androidx.appcompat.widget.ActionMenuView.invokeItem (ActionMenuView.java:625)
at androidx.appcompat.view.menu.ActionMenuItemView.onClick (ActionMenuItemView.java:156)
at android.view.View.performClick (View.java:7881)
at android.widget.TextView.performClick (TextView.java:16203)
at android.view.View.performClickInternal (View.java:7858)
at android.view.View.-$$Nest$mperformClickInternal
at android.view.View$PerformClick.run (View.java:30863)
at android.os.Handler.handleCallback (Handler.java:942)
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:8772)
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:1067)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.controllers.ChatController$onViewBound$11.onTouch (ChatController.kt:867)
at android.view.View.dispatchTouchEvent (View.java:15540)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3316)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2990)
at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:1112)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1971)
at android.app.Activity.dispatchTouchEvent (Activity.java:4388)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent (WindowCallbackWrapper.java:70)
at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:1070)
at android.view.View.dispatchPointerEvent (View.java:15803)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:8153)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:7877)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7213)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:7270)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:7236)
at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:7434)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:7244)
at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:7491)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7217)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:7270)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:7236)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:7244)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7217)
at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:10788)
at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:10676)
at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:10632)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:10926)
at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:285)
at android.os.MessageQueue.nativePollOnce
at android.os.MessageQueue.next (MessageQueue.java:335)
at android.os.Looper.loopOnce (Looper.java:186)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8757)
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:1067)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Exception java.lang.NullPointerException:
at com.nextcloud.talk.controllers.ChatController.processMessagesFromTheFuture (ChatController.kt:2500)
at com.nextcloud.talk.controllers.ChatController.processMessages (ChatController.kt:2443)
at com.nextcloud.talk.controllers.ChatController.processMessagesResponse (ChatController.kt:2404)
at com.nextcloud.talk.controllers.ChatController.access$processMessagesResponse (ChatController.kt:221)
at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext (ChatController.kt:2315)
at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext (ChatController.kt:2300)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal (ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run (ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:124)
at android.os.Handler.handleCallback (Handler.java:942)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:201)
at android.os.Looper.loop (Looper.java:288)
at android.app.ActivityThread.main (ActivityThread.java:7872)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
I don't know why scrollToPositionWithOffset was used. scrollToPosition(0) works just fine.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
When clicking on a conversation in conversation overview, restrict opening immediately.
If joinRoomWithPassword in ChatController is reached in any other way (for example by creating a new conversation while being in a call), then it's restricted to join the room.
All this is done to avoid NPE:
D/ChatController: pullChatMessages - pullChatMessages[lookIntoFuture > 0] - got response
W/System.err: java.lang.NullPointerException
W/System.err: at com.nextcloud.talk.controllers.ChatController.modifyMessageCount(ChatController.kt:2536)
W/System.err: at com.nextcloud.talk.controllers.ChatController.addMessagesToAdapter(ChatController.kt:2515)
W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessagesFromTheFuture(ChatController.kt:2489)
W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessages(ChatController.kt:2437)
W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessagesResponse(ChatController.kt:2398)
W/System.err: at com.nextcloud.talk.controllers.ChatController.access$processMessagesResponse(ChatController.kt:221)
W/System.err: at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2309)
W/System.err: at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2294)
W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
W/System.err: at android.os.Handler.handleCallback(Handler.java:883)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:100)
W/System.err: at android.os.Looper.loop(Looper.java:224)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7590)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Known issues:
- doesn't respect handling for other instances. E.g. when receiving notification from other instance and open it.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Fix to always allow opening same room when being in call
Fix to set also other properties for ApplicationWideCurrentRoomHolder when joining room in chat.
Otherwise it could have been possible to not be allowed to open this chat again from conversation list while being in call.
In a next step, ApplicationWideCurrentRoomHolder should be refactored to hold the conversation itself. Maybe in a map of users to handle different instances.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Before it was requested every 5 sec even when not waiting in a lobby.
This is a first improvement to reduce requests. In a next step, more signaling messages should be handled to maybe even avoid recursive calls at all.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
1)
Use session id returned from join room
= introduce sessionIdAfterRoomJoined to make clear this is the session to use instead of currentConversation?.sessionId
See https://nextcloud-talk.readthedocs.io/en/latest/conversation/#get-user-s-conversations :
"'0' if not connected, otherwise an up to 512 character long string that is the identifier of the user's session making the request. Should only be used to pre-check if the user joined already with this session, but this might be outdated by the time of usage, so better check via Get list of participants in a conversation"
2)
Also, trigger getRoomInfo() or handleFromNotification() in onAttach() instead of in onViewBound.
onViewBound is not called when returning back from an other view (e.g. conversation infos) so after this, new messages were not handled.
Furthermore, getRoomInfo()/joinRoomWithPassword() in onViewBound and onAttach were sometimes both called, because the handling of validSessionId was buggy. This resulted in duplicated messages.
3)
Use ApplicationWideCurrentRoomHolder to set sessionId from call and check in ChatController if there is already a session for the room. If yes, use this instead to joinRoom again.
This is necessary for PictureInPicture mode. Otherwise, call would be left whenever ChatController joins room again.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
avoid:
2023-03-01 16:47:40.443 23569-23628 UploadAndS...ilesWorker com.nextcloud.talk2 E Something went wrong when trying to upload file
java.lang.NullPointerException
at com.nextcloud.talk.jobs.UploadAndShareFilesWorker.showFailedToUploadNotification(UploadAndShareFilesWorker.kt:258)
at com.nextcloud.talk.jobs.UploadAndShareFilesWorker.doWork(UploadAndShareFilesWorker.kt:163)
at androidx.work.Worker$1.run(Worker.java:86)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
2023-03-01 16:47:40.444 23569-23607 WM-WorkerWrapper com.nextcloud.talk2 E Work [ id=27e4e319-a966-4515-ac07-d6ad7ee68268, tags={ com.nextcloud.talk.jobs.UploadAndShareFilesWorker } ] failed because it threw an exception/error
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:311)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.NullPointerException
at com.nextcloud.talk.jobs.UploadAndShareFilesWorker.showFailedToUploadNotification(UploadAndShareFilesWorker.kt:258)
at com.nextcloud.talk.jobs.UploadAndShareFilesWorker.doWork(UploadAndShareFilesWorker.kt:167)
at androidx.work.Worker$1.run(Worker.java:86)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
2023-03-01 16:47:40.446 23569-23607 WM-WorkerWrapper com.nextcloud.talk2 I Worker result FAILURE for Work [ id=27e4e319-a966-
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2023-02-27 12:29:00.275 995-995 AndroidRuntime.........
java.lang.NullPointerException
at com.nextcloud.talk.controllers.ChatController.modifyMessageCount(ChatController.kt:2536)
at com.nextcloud.talk.controllers.ChatController.addMessagesToAdapter(ChatController.kt:2515)
at com.nextcloud.talk.controllers.ChatController.processMessagesFromTheFuture(ChatController.kt:2489)
at com.nextcloud.talk.controllers.ChatController.processMessages(ChatController.kt:2437)
at com.nextcloud.talk.controllers.ChatController.processMessagesResponse(ChatController.kt:2398)
at com.nextcloud.talk.controllers.ChatController.access$processMessagesResponse(ChatController.kt:221)
at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2309)
at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2294)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:942)
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:8741)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
...for preparation to replace Dialog that was openend in ChatController. It will be replaced by Notification Actions.
The dialog was not opened when already being in a chat, because remapChatController only moved the currentChatController to top so to won't be initialized again. That's why the dialog didn't pop up for this case.
As a solution, the actions should be available directly inside the notification.
For this, it must be avoided that the "recording available" notification is closed whenever the chat is opened.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
more call recording states are:
3 = Starting video recording
4 = Starting audio recording
5 = Recording failed
these actions were added:
- Show grey recording icon to moderators if recording is starting
- Show toast to moderators if recording failed
- Add system message for recording failed
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>