[merge] Fix build and get footered rich editor styled textView to work
Change-Id: I75876d563760caec76673372ff560cbd17577f45
This commit is contained in:
parent
11b1e54429
commit
254393152d
|
@ -26,6 +26,13 @@ interface AbstractFooteredTextView {
|
||||||
|
|
||||||
val footerState: FooterState
|
val footerState: FooterState
|
||||||
|
|
||||||
|
var footerHeight: Int
|
||||||
|
get() = footerState.footerHeight
|
||||||
|
set(value) { footerState.footerHeight = value }
|
||||||
|
var footerWidth: Int
|
||||||
|
get() = footerState.footerWidth
|
||||||
|
set(value) { footerState.footerWidth = value }
|
||||||
|
|
||||||
class FooterState {
|
class FooterState {
|
||||||
var footerHeight: Int = 0
|
var footerHeight: Int = 0
|
||||||
var footerWidth: Int = 0
|
var footerWidth: Int = 0
|
||||||
|
|
|
@ -9,8 +9,9 @@ import io.element.android.wysiwyg.EditorStyledTextView
|
||||||
class FooteredEditorStyledTextView @JvmOverloads constructor(
|
class FooteredEditorStyledTextView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attrs: AttributeSet? = null,
|
attrs: AttributeSet? = null,
|
||||||
defStyleAttr: Int = 0
|
// Note: Upstream EditorStyledTextView only does required initialization in (context, attrs) variant
|
||||||
): EditorStyledTextView(context, attrs, defStyleAttr), AbstractFooteredTextView {
|
//defStyleAttr: Int = 0
|
||||||
|
): EditorStyledTextView(context, attrs/*, defStyleAttr*/), AbstractFooteredTextView {
|
||||||
|
|
||||||
override val footerState: AbstractFooteredTextView.FooterState = AbstractFooteredTextView.FooterState()
|
override val footerState: AbstractFooteredTextView.FooterState = AbstractFooteredTextView.FooterState()
|
||||||
override fun getAppCompatTextView(): AppCompatTextView = this
|
override fun getAppCompatTextView(): AppCompatTextView = this
|
||||||
|
@ -24,7 +25,7 @@ class FooteredEditorStyledTextView @JvmOverloads constructor(
|
||||||
setMeasuredDimension(updatedMeasures.first, updatedMeasures.second)
|
setMeasuredDimension(updatedMeasures.first, updatedMeasures.second)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDraw(canvas: Canvas?) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
updateFooterOnPreDraw(canvas)
|
updateFooterOnPreDraw(canvas)
|
||||||
|
|
||||||
super.onDraw(canvas)
|
super.onDraw(canvas)
|
||||||
|
|
|
@ -210,8 +210,10 @@ abstract class MessageAudioItem : AbsMessageItem<MessageAudioItem.Holder>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
||||||
holder.captionView.footerWidth = width
|
(holder.captionView as? AbstractFooteredTextView)?.apply {
|
||||||
holder.captionView.footerHeight = height
|
footerWidth = width
|
||||||
|
footerHeight = height
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getViewStubId() = STUB_ID
|
override fun getViewStubId() = STUB_ID
|
||||||
|
@ -224,7 +226,7 @@ abstract class MessageAudioItem : AbsMessageItem<MessageAudioItem.Holder>() {
|
||||||
val audioPlaybackTime by bind<TextView>(R.id.audioPlaybackTime)
|
val audioPlaybackTime by bind<TextView>(R.id.audioPlaybackTime)
|
||||||
val progressLayout by bind<ViewGroup>(R.id.messageFileUploadProgressLayout)
|
val progressLayout by bind<ViewGroup>(R.id.messageFileUploadProgressLayout)
|
||||||
val fileSize by bind<TextView>(R.id.fileSize)
|
val fileSize by bind<TextView>(R.id.fileSize)
|
||||||
val captionView by bind<AbstractFooteredTextView>(R.id.messageCaptionView)
|
val captionView by bind<TextView>(R.id.messageCaptionView)
|
||||||
val audioPlaybackDuration by bind<TextView>(R.id.audioPlaybackDuration)
|
val audioPlaybackDuration by bind<TextView>(R.id.audioPlaybackDuration)
|
||||||
val audioSeekBar by bind<SeekBar>(R.id.audioSeekBar)
|
val audioSeekBar by bind<SeekBar>(R.id.audioSeekBar)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import android.widget.ImageView
|
||||||
import android.widget.ProgressBar
|
import android.widget.ProgressBar
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.appcompat.widget.AppCompatTextView
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.airbnb.epoxy.EpoxyAttribute
|
import com.airbnb.epoxy.EpoxyAttribute
|
||||||
import com.airbnb.epoxy.EpoxyModelClass
|
import com.airbnb.epoxy.EpoxyModelClass
|
||||||
|
@ -140,8 +141,10 @@ abstract class MessageFileItem : AbsMessageItem<MessageFileItem.Holder>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
||||||
holder.captionView.footerWidth = width
|
(holder.captionView as? AbstractFooteredTextView)?.apply {
|
||||||
holder.captionView.footerHeight = height
|
footerWidth = width
|
||||||
|
footerHeight = height
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getViewStubId() = STUB_ID
|
override fun getViewStubId() = STUB_ID
|
||||||
|
@ -154,7 +157,7 @@ abstract class MessageFileItem : AbsMessageItem<MessageFileItem.Holder>() {
|
||||||
val fileImageWrapper by bind<ViewGroup>(R.id.messageFileImageView)
|
val fileImageWrapper by bind<ViewGroup>(R.id.messageFileImageView)
|
||||||
val fileDownloadProgress by bind<ProgressBar>(R.id.messageFileProgressbar)
|
val fileDownloadProgress by bind<ProgressBar>(R.id.messageFileProgressbar)
|
||||||
val filenameView by bind<TextView>(R.id.messageFilenameView)
|
val filenameView by bind<TextView>(R.id.messageFilenameView)
|
||||||
val captionView by bind<AbstractFooteredTextView>(R.id.messageCaptionView)
|
val captionView by bind<TextView>(R.id.messageCaptionView)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import android.graphics.Bitmap
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
@ -222,8 +223,10 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
override fun reserveFooterSpace(holder: Holder, width: Int, height: Int) {
|
||||||
holder.captionView.footerWidth = width
|
(holder.captionView as? AbstractFooteredTextView)?.apply {
|
||||||
holder.captionView.footerHeight = height
|
footerWidth = width
|
||||||
|
footerHeight = height
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun applyScBubbleStyle(messageLayout: TimelineMessageLayout.ScBubble, holder: Holder) {
|
override fun applyScBubbleStyle(messageLayout: TimelineMessageLayout.ScBubble, holder: Holder) {
|
||||||
|
@ -253,7 +256,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
|
||||||
class Holder : AbsMessageItem.Holder(STUB_ID) {
|
class Holder : AbsMessageItem.Holder(STUB_ID) {
|
||||||
val progressLayout by bind<ViewGroup>(R.id.messageMediaUploadProgressLayout)
|
val progressLayout by bind<ViewGroup>(R.id.messageMediaUploadProgressLayout)
|
||||||
val imageView by bind<ImageView>(R.id.messageThumbnailView)
|
val imageView by bind<ImageView>(R.id.messageThumbnailView)
|
||||||
val captionView by bind<AbstractFooteredTextView>(R.id.messageCaptionView)
|
val captionView by bind<TextView>(R.id.messageCaptionView)
|
||||||
val playContentView by bind<ImageView>(R.id.messageMediaPlayView)
|
val playContentView by bind<ImageView>(R.id.messageMediaPlayView)
|
||||||
val mediaContentView by bind<ViewGroup>(R.id.messageContentMedia)
|
val mediaContentView by bind<ViewGroup>(R.id.messageContentMedia)
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
|
||||||
holder.previewUrlView.delegate = previewUrlCallback
|
holder.previewUrlView.delegate = previewUrlCallback
|
||||||
holder.previewUrlView.renderMessageLayout(attributes.informationData.messageLayout)
|
holder.previewUrlView.renderMessageLayout(attributes.informationData.messageLayout)
|
||||||
|
|
||||||
val messageView: AbstractFooteredTextView = holder.messageView(useRichTextEditorStyle) //if (useRichTextEditorStyle) holder.richMessageView else holder.plainMessageView
|
val messageView: AppCompatTextView = holder.messageView(useRichTextEditorStyle) //if (useRichTextEditorStyle) holder.richMessageView else holder.plainMessageView
|
||||||
if (useBigFont) {
|
if (useBigFont) {
|
||||||
messageView.textSize = 44F
|
messageView.textSize = 44F
|
||||||
} else {
|
} else {
|
||||||
|
@ -150,10 +150,10 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
|
||||||
lateinit var previewUrlView: AbstractPreviewUrlView // set to either previewUrlViewElement or previewUrlViewSc by layout
|
lateinit var previewUrlView: AbstractPreviewUrlView // set to either previewUrlViewElement or previewUrlViewSc by layout
|
||||||
private val richMessageStub by bind<ViewStub>(R.id.richMessageTextViewStub)
|
private val richMessageStub by bind<ViewStub>(R.id.richMessageTextViewStub)
|
||||||
private val plainMessageStub by bind<ViewStub>(R.id.plainMessageTextViewStub)
|
private val plainMessageStub by bind<ViewStub>(R.id.plainMessageTextViewStub)
|
||||||
val richMessageView: AbstractFooteredTextView by lazy {
|
val richMessageView: AppCompatTextView by lazy {
|
||||||
richMessageStub.inflate().findViewById(R.id.messageTextView)
|
richMessageStub.inflate().findViewById(R.id.messageTextView)
|
||||||
}
|
}
|
||||||
val plainMessageView: AbstractFooteredTextView by lazy {
|
val plainMessageView: AppCompatTextView by lazy {
|
||||||
plainMessageStub.inflate().findViewById(R.id.messageTextView)
|
plainMessageStub.inflate().findViewById(R.id.messageTextView)
|
||||||
}
|
}
|
||||||
fun messageView(useRichTextEditorStyle: Boolean) = if (useRichTextEditorStyle) richMessageView else plainMessageView
|
fun messageView(useRichTextEditorStyle: Boolean) = if (useRichTextEditorStyle) richMessageView else plainMessageView
|
||||||
|
@ -176,13 +176,15 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
|
||||||
|
|
||||||
///* // disabled for now: just set all in reserveFooterSpace to ensure space in all scenarios
|
///* // disabled for now: just set all in reserveFooterSpace to ensure space in all scenarios
|
||||||
// Currently, all states except data imply hidden preview
|
// Currently, all states except data imply hidden preview
|
||||||
if (state is PreviewUrlUiState.Data) {
|
(messageView as? AbstractFooteredTextView)?.apply {
|
||||||
// Don't reserve footer space in message view, but preview view
|
if (state is PreviewUrlUiState.Data) {
|
||||||
messageView?.footerWidth = 0
|
// Don't reserve footer space in message view, but preview view
|
||||||
messageView?.footerHeight = 0
|
footerWidth = 0
|
||||||
} else {
|
footerHeight = 0
|
||||||
messageView?.footerWidth = footerWidth
|
} else {
|
||||||
messageView?.footerHeight = footerHeight
|
footerWidth = footerWidth
|
||||||
|
footerHeight = footerHeight
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//messageView?.invalidate()
|
//messageView?.invalidate()
|
||||||
messageView?.requestLayout()
|
messageView?.requestLayout()
|
||||||
|
@ -209,8 +211,10 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
|
||||||
// This might be a race condition, but the UI-isssue if evaluated wrongly is negligible
|
// This might be a race condition, but the UI-isssue if evaluated wrongly is negligible
|
||||||
if (!holder.previewUrlView.isVisible) {
|
if (!holder.previewUrlView.isVisible) {
|
||||||
val messageView = holder.messageView(useRichTextEditorStyle)
|
val messageView = holder.messageView(useRichTextEditorStyle)
|
||||||
messageView.footerWidth = width
|
(messageView as? AbstractFooteredTextView)?.apply {
|
||||||
messageView.footerHeight = height
|
footerWidth = width
|
||||||
|
footerHeight = height
|
||||||
|
}
|
||||||
} // else: will be handled in onStateUpdated
|
} // else: will be handled in onStateUpdated
|
||||||
holder.previewUrlViewSc.footerWidth = height
|
holder.previewUrlViewSc.footerWidth = height
|
||||||
holder.previewUrlViewSc.footerHeight = height
|
holder.previewUrlViewSc.footerHeight = height
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
but it also makes it align better for RTL texts in RTL locales - at least
|
but it also makes it align better for RTL texts in RTL locales - at least
|
||||||
until the user pill is touched...
|
until the user pill is touched...
|
||||||
-->
|
-->
|
||||||
<io.element.android.wysiwyg.EditorStyledTextView
|
<im.vector.app.core.ui.views.FooteredEditorStyledTextView
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/messageTextView"
|
android:id="@+id/messageTextView"
|
||||||
|
|
Loading…
Reference in New Issue