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..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 @@ -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 by 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 {