diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 40df89010..0c1c1ff0b 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1318,7 +1318,9 @@ public class CallActivity extends CallBaseActivity { @Override public void onDestroy() { - signalingMessageReceiver.removeListener(offerMessageListener); + if (signalingMessageReceiver != null) { + signalingMessageReceiver.removeListener(offerMessageListener); + } if (localStream != null) { localStream.dispose(); @@ -2591,12 +2593,18 @@ public class CallActivity extends CallBaseActivity { private void stopCallingSound() { if (mediaPlayer != null) { - if (mediaPlayer.isPlaying()) { - mediaPlayer.stop(); + try { + if (mediaPlayer.isPlaying()) { + mediaPlayer.stop(); + } + } catch (IllegalStateException e) { + Log.e(TAG, "mediaPlayer was not initialized", e); + } finally { + if (mediaPlayer != null) { + mediaPlayer.release(); + } + mediaPlayer = null; } - - mediaPlayer.release(); - mediaPlayer = null; } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 1fd6a931a..2324c0506 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -846,8 +846,10 @@ class ChatController(args: Bundle) : showRecordAudioUi(true) - if (sliderInitX == 0.0F) { - sliderInitX = binding?.messageInputView?.slideToCancelDescription?.x!! + binding?.messageInputView?.slideToCancelDescription?.x?.let { + if (sliderInitX == 0.0F) { + sliderInitX = it + } } val movedX: Float = event.x @@ -1002,6 +1004,7 @@ class ChatController(args: Bundle) : adapter?.update(message) } + @Suppress("Detekt.TooGenericExceptionCaught") private fun initMediaPlayer(message: ChatMessage) { if (message != currentlyPlayedVoiceMessage) { currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) } @@ -1010,15 +1013,22 @@ class ChatController(args: Bundle) : if (mediaPlayer == null) { val fileName = message.selectedIndividualHashMap!!["name"] val absolutePath = context.cacheDir.absolutePath + "/" + fileName - mediaPlayer = MediaPlayer().apply { - setDataSource(absolutePath) - prepare() - } - currentlyPlayedVoiceMessage = message - message.voiceMessageDuration = mediaPlayer!!.duration / VOICE_MESSAGE_SEEKBAR_BASE - mediaPlayer!!.setOnCompletionListener { - stopMediaPlayer(message) + try { + mediaPlayer = MediaPlayer().apply { + setDataSource(absolutePath) + prepare() + } + + currentlyPlayedVoiceMessage = message + message.voiceMessageDuration = mediaPlayer!!.duration / VOICE_MESSAGE_SEEKBAR_BASE + + mediaPlayer!!.setOnCompletionListener { + stopMediaPlayer(message) + } + } catch (e: Exception) { + Log.e(TAG, "failed to initialize mediaPlayer", e) + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() } } else { Log.e(TAG, "mediaPlayer was not null. This should not happen!") @@ -1034,9 +1044,18 @@ class ChatController(args: Bundle) : mediaPlayerHandler.removeCallbacksAndMessages(null) - mediaPlayer?.stop() - mediaPlayer?.release() - mediaPlayer = null + try { + mediaPlayer?.let { + if (it.isPlaying) { + it.stop() + } + } + } catch (e: IllegalStateException) { + Log.e(TAG, "mediaPlayer was not initialized", e) + } finally { + mediaPlayer?.release() + mediaPlayer = null + } } override fun updateMediaPlayerProgressBySlider(messageWithSlidedProgress: ChatMessage, progress: Int) { @@ -2492,11 +2511,15 @@ class ChatController(args: Bundle) : if (previousMessageId > NO_PREVIOUS_MESSAGE_ID) { chatMessage.previousMessageId = previousMessageId - } else if (adapter?.isEmpty != true) { - if (adapter!!.items[0].item is ChatMessage) { - chatMessage.previousMessageId = (adapter!!.items[0].item as ChatMessage).jsonMessageId - } else if (adapter!!.items.size > 1 && adapter!!.items[1].item is ChatMessage) { - chatMessage.previousMessageId = (adapter!!.items[1].item as ChatMessage).jsonMessageId + } else { + adapter?.let { + if (!it.isEmpty) { + if (it.items[0].item is ChatMessage) { + chatMessage.previousMessageId = (it.items[0].item as ChatMessage).jsonMessageId + } else if (it.items.size > 1 && it.items[1].item is ChatMessage) { + chatMessage.previousMessageId = (it.items[1].item as ChatMessage).jsonMessageId + } + } } } @@ -3420,6 +3443,7 @@ class ChatController(args: Bundle) : private const val VOICE_RECORD_CANCEL_SLIDER_X: Int = -50 private const val VOICE_MESSAGE_META_DATA = "{\"messageType\":\"voice-message\"}" private const val VOICE_MESSAGE_FILE_SUFFIX = ".mp3" + // Samplingrate 22050 was chosen because somehow 44100 failed to playback on safari when recorded on android. // Please test with firefox, chrome, safari and mobile clients if changing anything regarding the sound. private const val VOICE_MESSAGE_SAMPLING_RATE = 22050 diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index 944eae8a9..e4adb432a 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -543,7 +543,7 @@ class ConversationInfoController(args: Bundle) : .java ).setInputData(it).build() ) - popTwoLastControllers() + router.popToRoot() } } @@ -613,16 +613,10 @@ class ConversationInfoController(args: Bundle) : DeleteConversationWorker::class.java ).setInputData(it).build() ) - popTwoLastControllers() + router.popToRoot() } } - private fun popTwoLastControllers() { - var backstack = router.backstack - backstack = backstack.subList(0, backstack.size - 2) - router.setBackstack(backstack, HorizontalChangeHandler()) - } - private fun fetchRoomInfo() { var apiVersion = 1 // FIXME Fix API checking with guests? diff --git a/app/src/main/java/com/nextcloud/talk/controllers/LockedController.kt b/app/src/main/java/com/nextcloud/talk/controllers/LockedController.kt index 2fde68332..7519742ee 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/LockedController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/LockedController.kt @@ -144,7 +144,7 @@ class LockedController : BaseController(R.layout.controller_locked) { "popCurrentController because 'we are authenticated'. backstacksize= " + router.backstack.size ) - router.popCurrentController() + router.popToRoot() } } } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java index 231b2dc30..2676c5746 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java @@ -269,7 +269,7 @@ public class PeerConnectionWrapper { public void sendChannelData(DataChannelMessage dataChannelMessage) { ByteBuffer buffer; - if (dataChannel != null) { + if (dataChannel != null && dataChannelMessage != null) { try { buffer = ByteBuffer.wrap(LoganSquare.serialize(dataChannelMessage).getBytes()); dataChannel.send(new DataChannel.Buffer(buffer, false));