From 41c0d4d14f727b08d67e3e5ff713b69b3fb62a10 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Thu, 26 Aug 2021 13:50:23 +0300 Subject: [PATCH 1/2] Fix crash on lollipop devices due to onVisibilityChanged is called before constructor. --- changelog.d/3897.bugfix | 1 + .../composer/VoiceMessageRecorderView.kt | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 changelog.d/3897.bugfix diff --git a/changelog.d/3897.bugfix b/changelog.d/3897.bugfix new file mode 100644 index 0000000000..cad8560ca4 --- /dev/null +++ b/changelog.d/3897.bugfix @@ -0,0 +1 @@ +Crash on opening a room on Android 5.0 and 5.1 - Regression with Voice message \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt index 47e72b46f7..92a7e9d60a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt @@ -40,11 +40,7 @@ import kotlin.math.floor /** * Encapsulates the voice message recording view and animations. */ -class VoiceMessageRecorderView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), VoiceMessagePlaybackTracker.Listener { +class VoiceMessageRecorderView: ConstraintLayout, VoiceMessagePlaybackTracker.Listener { interface Callback { // Return true if the recording is started @@ -54,7 +50,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor( fun onVoicePlaybackButtonClicked() } - private val views: ViewVoiceMessageRecorderBinding + private lateinit var views: ViewVoiceMessageRecorderBinding var callback: Callback? = null var voiceMessagePlaybackTracker: VoiceMessagePlaybackTracker? = null @@ -80,7 +76,17 @@ class VoiceMessageRecorderView @JvmOverloads constructor( private val distanceToCancel = dimensionConverter.dpToPx(120).toFloat() private val rtlXMultiplier = context.resources.getInteger(R.integer.rtl_x_multiplier) - init { + // Don't convert to primary constructor. + // We need to define views as lateinit var to be able to check if initialized for the bug fix on api 21 and 22. + @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 + ) : super(context, attrs, defStyleAttr) { + initialize() + } + + fun initialize() { inflate(context, R.layout.view_voice_message_recorder, this) views = ViewVoiceMessageRecorderBinding.bind(this) @@ -90,6 +96,9 @@ class VoiceMessageRecorderView @JvmOverloads constructor( override fun onVisibilityChanged(changedView: View, visibility: Int) { super.onVisibilityChanged(changedView, visibility) + // onVisibilityChanged is called before constructor on api 21 and 22. + if (!this::views.isInitialized) return + if (changedView == this && visibility == VISIBLE) { views.voiceMessageMicButton.contentDescription = context.getString(R.string.a11y_start_voice_message) } else { From 72a6d6c9a66c7db00d660a6898a7e22bfe722896 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Aug 2021 16:31:20 +0200 Subject: [PATCH 2/2] Update vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt --- .../home/room/detail/composer/VoiceMessageRecorderView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt index 92a7e9d60a..5f4f53cf1e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt @@ -96,7 +96,7 @@ class VoiceMessageRecorderView: ConstraintLayout, VoiceMessagePlaybackTracker.Li override fun onVisibilityChanged(changedView: View, visibility: Int) { super.onVisibilityChanged(changedView, visibility) - // onVisibilityChanged is called before constructor on api 21 and 22. + // onVisibilityChanged is called by constructor on api 21 and 22. if (!this::views.isInitialized) return if (changedView == this && visibility == VISIBLE) {