From e1ea742023a0b28a228d2861a503adea39bd877c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 13:59:58 +0100 Subject: [PATCH 1/8] Fix crash reported from rageshake --- .../settings/VectorSettingsNotificationPreferenceFragment.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsNotificationPreferenceFragment.kt index b397cd1cf6..5e7bc9d95b 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsNotificationPreferenceFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsNotificationPreferenceFragment.kt @@ -118,6 +118,10 @@ class VectorSettingsNotificationPreferenceFragment @Inject constructor( } override fun onFailure(failure: Throwable) { + if (!isAdded) { + return + } + // revert the check box switchPref.isChecked = !switchPref.isChecked Toast.makeText(activity, R.string.unknown_error, Toast.LENGTH_SHORT).show() From 4280bc0780f6df70fae13adc93f5c5c00d81c032 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 14:10:51 +0100 Subject: [PATCH 2/8] Fix crash reported from rageshake --- .../internal/network/NetworkCallbackStrategy.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/NetworkCallbackStrategy.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/NetworkCallbackStrategy.kt index 83df3c0a4f..a639c61678 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/NetworkCallbackStrategy.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/NetworkCallbackStrategy.kt @@ -22,6 +22,7 @@ import android.content.IntentFilter import android.net.ConnectivityManager import android.net.Network import android.os.Build +import timber.log.Timber import javax.inject.Inject internal interface NetworkCallbackStrategy { @@ -70,7 +71,16 @@ internal class PreferredNetworkCallbackStrategy @Inject constructor(context: Con } override fun unregister() { + // It can crash after an application update, if not registered + val doUnregister = hasChangedCallback != null hasChangedCallback = null - conn.unregisterNetworkCallback(networkCallback) + if (doUnregister) { + // Add a try catch for safety + try { + conn.unregisterNetworkCallback(networkCallback) + } catch (t: Throwable) { + Timber.e(t, "Unable to unregister network callback") + } + } } } From 054b467caf9c5020cf7cad38e41b74aed59f5121 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 14:18:48 +0100 Subject: [PATCH 3/8] Fix crash reported from rageshake --- .../im/vector/riotx/core/platform/EllipsizingTextView.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/core/platform/EllipsizingTextView.kt b/vector/src/main/java/im/vector/riotx/core/platform/EllipsizingTextView.kt index 70af607753..2e5786b57d 100644 --- a/vector/src/main/java/im/vector/riotx/core/platform/EllipsizingTextView.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/EllipsizingTextView.kt @@ -38,6 +38,7 @@ import android.text.TextUtils.substring import android.text.style.ForegroundColorSpan import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView +import timber.log.Timber import java.util.ArrayList import java.util.regex.Pattern @@ -300,7 +301,13 @@ class EllipsizingTextView @JvmOverloads constructor(context: Context, attrs: Att private inner class EllipsizeEndStrategy : EllipsizeStrategy() { override fun createEllipsizedText(fullText: CharSequence?): CharSequence? { val layout = createWorkingLayout(fullText) - val cutOffIndex = layout.getLineEnd(maxLines - 1) + val cutOffIndex = try { + layout.getLineEnd(maxLines - 1) + } catch (exception: IndexOutOfBoundsException) { + // Not sure to understand why this is happening + Timber.e(exception, "IndexOutOfBoundsException, maxLine: $maxLines") + 0 + } val textLength = fullText!!.length var cutOffLength = textLength - cutOffIndex if (cutOffLength < ELLIPSIS.length) cutOffLength = ELLIPSIS.length From ccf72ffaa7fab31c14d4ef476ee8e85b0ea9f294 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 14:50:01 +0100 Subject: [PATCH 4/8] Fix crash reported from rageshake --- .../vector/riotx/features/permalink/PermalinkHandler.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/permalink/PermalinkHandler.kt b/vector/src/main/java/im/vector/riotx/features/permalink/PermalinkHandler.kt index 84a25060cc..bcf981fc92 100644 --- a/vector/src/main/java/im/vector/riotx/features/permalink/PermalinkHandler.kt +++ b/vector/src/main/java/im/vector/riotx/features/permalink/PermalinkHandler.kt @@ -20,16 +20,16 @@ import android.content.Context import android.net.Uri import im.vector.matrix.android.api.permalinks.PermalinkData import im.vector.matrix.android.api.permalinks.PermalinkParser -import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.util.Optional import im.vector.matrix.rx.rx +import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.features.navigation.Navigator import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import javax.inject.Inject -class PermalinkHandler @Inject constructor(private val session: Session, +class PermalinkHandler @Inject constructor(private val activeSessionHolder: ActiveSessionHolder, private val navigator: Navigator) { fun launch( @@ -80,7 +80,8 @@ class PermalinkHandler @Inject constructor(private val session: Session, } private fun PermalinkData.RoomLink.getRoomId(): Single> { - return if (isRoomAlias) { + val session = activeSessionHolder.getSafeActiveSession() + return if (isRoomAlias && session != null) { // At the moment we are not fetching on the server as we don't handle not join room session.rx().getRoomIdByAlias(roomIdOrAlias, false).subscribeOn(Schedulers.io()) } else { @@ -92,6 +93,7 @@ class PermalinkHandler @Inject constructor(private val session: Session, * Open room either joined, or not */ private fun openRoom(context: Context, roomId: String?, eventId: String?, buildTask: Boolean) { + val session = activeSessionHolder.getSafeActiveSession() ?: return return if (roomId != null && session.getRoom(roomId) != null) { navigator.openRoom(context, roomId, eventId, buildTask) } else { From 4bb3fb128f9ab7d6d60b87078696c9b0d0e9f0dd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 14:54:36 +0100 Subject: [PATCH 5/8] Fix crash reported from rageshake --- .../im/vector/riotx/features/media/ImageContentRenderer.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/media/ImageContentRenderer.kt b/vector/src/main/java/im/vector/riotx/features/media/ImageContentRenderer.kt index d11af4f350..e497d9ce04 100644 --- a/vector/src/main/java/im/vector/riotx/features/media/ImageContentRenderer.kt +++ b/vector/src/main/java/im/vector/riotx/features/media/ImageContentRenderer.kt @@ -144,9 +144,9 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder: return } - imageView.setImageLoaderCallback(object: DefaultImageLoaderCallback { + imageView.setImageLoaderCallback(object : DefaultImageLoaderCallback { override fun onSuccess(image: File?) { - imageView.ssiv.orientation = ORIENTATION_USE_EXIF + imageView.ssiv?.orientation = ORIENTATION_USE_EXIF } }) From a13fec84b090c6be4b7b1a9fba5302fb2b76cadc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 15:00:25 +0100 Subject: [PATCH 6/8] Fix crash reported from rageshake --- .../vector/riotx/fdroid/receiver/AlarmSyncBroadcastReceiver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/AlarmSyncBroadcastReceiver.kt b/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/AlarmSyncBroadcastReceiver.kt index cf30e2daa2..8c9cdbf63b 100644 --- a/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/AlarmSyncBroadcastReceiver.kt +++ b/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/AlarmSyncBroadcastReceiver.kt @@ -48,7 +48,7 @@ class AlarmSyncBroadcastReceiver : BroadcastReceiver() { } } - val sessionId = intent.getStringExtra(SyncService.EXTRA_SESSION_ID) + val sessionId = intent.getStringExtra(SyncService.EXTRA_SESSION_ID) ?: return // This method is called when the BroadcastReceiver is receiving an Intent broadcast. Timber.d("RestartBroadcastReceiver received intent") VectorSyncService.newIntent(context, sessionId).let { From 054d7668efbb9585f249673d894c8cc619e6146a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 15:19:47 +0100 Subject: [PATCH 7/8] Fix crash reported from rageshake --- .../im/vector/riotx/features/attachments/AttachmentsHelper.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vector/src/main/java/im/vector/riotx/features/attachments/AttachmentsHelper.kt b/vector/src/main/java/im/vector/riotx/features/attachments/AttachmentsHelper.kt index 8eb7a5bb52..c9ee1cb6e5 100644 --- a/vector/src/main/java/im/vector/riotx/features/attachments/AttachmentsHelper.kt +++ b/vector/src/main/java/im/vector/riotx/features/attachments/AttachmentsHelper.kt @@ -25,6 +25,7 @@ import com.kbeanie.multipicker.api.Picker.PICK_CONTACT import com.kbeanie.multipicker.api.Picker.PICK_FILE import com.kbeanie.multipicker.api.Picker.PICK_IMAGE_CAMERA import com.kbeanie.multipicker.api.Picker.PICK_IMAGE_DEVICE +import com.kbeanie.multipicker.core.ImagePickerImpl import com.kbeanie.multipicker.core.PickerManager import im.vector.matrix.android.BuildConfig import im.vector.matrix.android.api.session.content.ContentAttachmentData @@ -157,6 +158,9 @@ class AttachmentsHelper private constructor(private val context: Context, if (resultCode == Activity.RESULT_OK) { val pickerManager = getPickerManagerForRequestCode(requestCode) if (pickerManager != null) { + if (pickerManager is ImagePickerImpl) { + pickerManager.reinitialize(capturePath) + } pickerManager.submit(data) return true } From 4ba8a42977cd7e48623d48f6b4d6b4e8bdabafb0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Feb 2020 15:32:52 +0100 Subject: [PATCH 8/8] Fix crash reported from rageshake --- .../android/internal/session/content/ThumbnailExtractor.kt | 2 +- .../internal/session/room/send/LocalEchoEventFactory.kt | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ThumbnailExtractor.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ThumbnailExtractor.kt index f8935e9283..083cac0278 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ThumbnailExtractor.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ThumbnailExtractor.kt @@ -46,7 +46,7 @@ internal object ThumbnailExtractor { } private fun extractVideoThumbnail(attachment: ContentAttachmentData): ThumbnailData? { - val thumbnail = ThumbnailUtils.createVideoThumbnail(attachment.path, MediaStore.Video.Thumbnails.MINI_KIND) + val thumbnail = ThumbnailUtils.createVideoThumbnail(attachment.path, MediaStore.Video.Thumbnails.MINI_KIND) ?: return null val outputStream = ByteArrayOutputStream() thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) val thumbnailWidth = thumbnail.width diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt index f77f4b7f3a..51de36291d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt @@ -16,6 +16,7 @@ package im.vector.matrix.android.internal.session.room.send +import android.graphics.Bitmap import android.media.MediaMetadataRetriever import androidx.exifinterface.media.ExifInterface import im.vector.matrix.android.R @@ -275,9 +276,9 @@ internal class LocalEchoEventFactory @Inject constructor( mediaDataRetriever.setDataSource(attachment.path) // Use frame to calculate height and width as we are sure to get the right ones - val firstFrame = mediaDataRetriever.frameAtTime - val height = firstFrame.height - val width = firstFrame.width + val firstFrame: Bitmap? = mediaDataRetriever.frameAtTime + val height = firstFrame?.height ?: 0 + val width = firstFrame?.width ?: 0 mediaDataRetriever.release() val thumbnailInfo = ThumbnailExtractor.extractThumbnail(attachment)?.let {