From 2f659f613dd030d69c87f41a857a84973c777ab8 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Tue, 12 May 2020 15:49:43 +0200 Subject: [PATCH] Initial message bubbles Drawables taken from AOSP Messaging --- .../riotx/core/ui/views/WrapWidthTextView.kt | 37 +++++++++++++++ .../timeline/factory/MessageItemFactory.kt | 2 + .../detail/timeline/item/MessageTextItem.kt | 43 ++++++++++++++++++ .../VectorSettingsPreferencesFragment.kt | 6 +++ .../riotx/features/themes/BubbleThemeUtils.kt | 27 +++++++++++ .../drawable-hdpi/msg_bubble_incoming.9.png | Bin 0 -> 469 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 472 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 344 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 598 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1593 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1751 bytes .../drawable-mdpi/msg_bubble_incoming.9.png | Bin 0 -> 339 bytes .../drawable-xhdpi/msg_bubble_incoming.9.png | Bin 0 -> 597 bytes .../drawable-xxhdpi/msg_bubble_incoming.9.png | Bin 0 -> 1582 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1731 bytes .../res/layout/item_timeline_event_base.xml | 1 + .../item_timeline_event_text_message_stub.xml | 4 +- vector/src/main/res/values-de/strings_sc.xml | 5 ++ vector/src/main/res/values/arrays_sc.xml | 15 ++++++ vector/src/main/res/values/attrs_sc.xml | 11 +++++ vector/src/main/res/values/strings_sc.xml | 5 ++ vector/src/main/res/values/theme_dark.xml | 3 ++ vector/src/main/res/values/theme_light.xml | 3 ++ vector/src/main/res/values/theme_sc.xml | 3 ++ .../res/xml/vector_settings_preferences.xml | 9 ++++ 25 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/core/ui/views/WrapWidthTextView.kt create mode 100644 vector/src/main/java/im/vector/riotx/features/themes/BubbleThemeUtils.kt create mode 100644 vector/src/main/res/drawable-hdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-ldrtl-hdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-ldrtl-mdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-ldrtl-xhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-ldrtl-xxxhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-mdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-xhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-xxhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/drawable-xxxhdpi/msg_bubble_incoming.9.png create mode 100644 vector/src/main/res/values/arrays_sc.xml create mode 100644 vector/src/main/res/values/attrs_sc.xml diff --git a/vector/src/main/java/im/vector/riotx/core/ui/views/WrapWidthTextView.kt b/vector/src/main/java/im/vector/riotx/core/ui/views/WrapWidthTextView.kt new file mode 100644 index 0000000000..aaf1ee3030 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/core/ui/views/WrapWidthTextView.kt @@ -0,0 +1,37 @@ +/* + * https://stackoverflow.com/questions/7439748/why-is-wrap-content-in-multiple-line-textview-filling-parent + */ + +package im.vector.riotx.core.ui.views; + +import android.content.Context +import android.text.Layout +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import kotlin.math.ceil + +class WrapWidthTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatTextView(context, attrs, defStyleAttr) { + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + val layout = this.layout ?: return + val width = ceil(getMaxLineWidth(layout)).toInt() + compoundPaddingLeft + compoundPaddingRight + val height = measuredHeight + setMeasuredDimension(width, height) + } + + private fun getMaxLineWidth(layout: Layout): Float { + var maxWidth = 0.0f + val lines = layout.lineCount + for (i in 0 until lines) { + if (layout.getLineWidth(i) > maxWidth) { + maxWidth = layout.getLineWidth(i) + } + } + return maxWidth + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt index ffb71a38c5..96cfcaf7cd 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -397,6 +397,8 @@ class MessageItemFactory @Inject constructor( .leftGuideline(avatarSizeProvider.leftGuideline) .attributes(attributes) .highlighted(highlight) + .outgoingMessage(informationData.sentByMe) + .incomingMessage(!informationData.sentByMe) .movementMethod(createLinkMovementMethod(callback)) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageTextItem.kt index fabdf22d14..e544576cfb 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -16,14 +16,24 @@ package im.vector.riotx.features.home.room.detail.timeline.item +import android.content.res.ColorStateList import android.text.method.MovementMethod +import android.view.Gravity +import android.widget.FrameLayout import androidx.appcompat.widget.AppCompatTextView +import androidx.core.content.ContextCompat import androidx.core.text.PrecomputedTextCompat import androidx.core.widget.TextViewCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.riotx.R import im.vector.riotx.features.home.room.detail.timeline.tools.findPillsAndProcess +import im.vector.riotx.features.themes.BubbleThemeUtils +import im.vector.riotx.features.themes.BubbleThemeUtils.BUBBLE_STYLE_BOTH +import im.vector.riotx.features.themes.BubbleThemeUtils.BUBBLE_STYLE_NONE +import im.vector.riotx.features.themes.BubbleThemeUtils.BUBBLE_STYLE_START +import im.vector.riotx.features.themes.ThemeUtils +import kotlin.math.round @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageTextItem : AbsMessageItem() { @@ -36,6 +46,10 @@ abstract class MessageTextItem : AbsMessageItem() { var useBigFont: Boolean = false @EpoxyAttribute var movementMethod: MovementMethod? = null + @EpoxyAttribute + var incomingMessage: Boolean = false + @EpoxyAttribute + var outgoingMessage: Boolean = false override fun bind(holder: Holder) { super.bind(holder) @@ -56,6 +70,35 @@ abstract class MessageTextItem : AbsMessageItem() { TextViewCompat.getTextMetricsParams(holder.messageView), null) holder.messageView.setTextFuture(textFuture) + + var bubbleStyle = if (incomingMessage || outgoingMessage) BubbleThemeUtils.getBubbleStyle(holder.messageView.context) else BUBBLE_STYLE_NONE + when (bubbleStyle) { + BUBBLE_STYLE_NONE -> { + holder.messageView.background = null + holder.messageView.setPadding(0, 0, 0, 0) + } + BUBBLE_STYLE_START, BUBBLE_STYLE_BOTH -> { + holder.messageView.setBackgroundResource(R.drawable.msg_bubble_incoming) + var tintColor = ColorStateList( + arrayOf(intArrayOf(0)), + intArrayOf(ThemeUtils.getColor(holder.messageView.context, + if (outgoingMessage) R.attr.sc_message_bg_outgoing else R.attr.sc_message_bg_incoming) + ) + ) + holder.messageView.backgroundTintList = tintColor + val density = holder.messageView.resources.displayMetrics.density + holder.messageView.setPaddingRelative( + round(20*density).toInt(), + round(8*density).toInt(), + round(8*density).toInt(), + round(8*density).toInt() + ) + } + } + if (holder.messageView.layoutParams is FrameLayout.LayoutParams) { + (holder.messageView.layoutParams as FrameLayout.LayoutParams).gravity = + if (outgoingMessage && bubbleStyle == BUBBLE_STYLE_BOTH) Gravity.END else Gravity.START + } } override fun getViewType() = STUB_ID diff --git a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsPreferencesFragment.kt index 9c240ad093..26f114cd44 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsPreferencesFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsPreferencesFragment.kt @@ -28,6 +28,7 @@ import im.vector.riotx.R import im.vector.riotx.core.preference.VectorListPreference import im.vector.riotx.core.preference.VectorPreference import im.vector.riotx.features.configuration.VectorConfiguration +import im.vector.riotx.features.themes.BubbleThemeUtils import im.vector.riotx.features.themes.ThemeUtils import javax.inject.Inject @@ -66,6 +67,11 @@ class VectorSettingsPreferencesFragment @Inject constructor( false } } + findPreference(BubbleThemeUtils.BUBBLE_STYLE_KEY)!! + .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> + BubbleThemeUtils.invalidateBubbleStyle() + true + } // Url preview findPreference(VectorPreferences.SETTINGS_SHOW_URL_PREVIEW_KEY)!!.let { diff --git a/vector/src/main/java/im/vector/riotx/features/themes/BubbleThemeUtils.kt b/vector/src/main/java/im/vector/riotx/features/themes/BubbleThemeUtils.kt new file mode 100644 index 0000000000..bf765d0f94 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/themes/BubbleThemeUtils.kt @@ -0,0 +1,27 @@ +package im.vector.riotx.features.themes + +import android.content.Context +import androidx.preference.PreferenceManager + +/** + * Util class for managing themes. + */ +object BubbleThemeUtils { + const val BUBBLE_STYLE_KEY = "BUBBLE_STYLE_KEY" + + const val BUBBLE_STYLE_NONE = "none" + const val BUBBLE_STYLE_START = "start" + const val BUBBLE_STYLE_BOTH = "both" + private var mBubbleStyle: String = "" + + fun getBubbleStyle(context: Context): String { + if (mBubbleStyle == "") { + mBubbleStyle = PreferenceManager.getDefaultSharedPreferences(context).getString(BUBBLE_STYLE_KEY, BUBBLE_STYLE_START)!! + } + return mBubbleStyle + } + + fun invalidateBubbleStyle() { + mBubbleStyle = "" + } +} diff --git a/vector/src/main/res/drawable-hdpi/msg_bubble_incoming.9.png b/vector/src/main/res/drawable-hdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7fed0a806a03c789de0b41f502d7ec7db52ca7c3 GIT binary patch literal 469 zcmV;`0V@89P)aolanOO1++sns(GMn9-`y#p=OE35*^du8)idcY&00000 LNkvXXu0mjfnCZqY literal 0 HcmV?d00001 diff --git a/vector/src/main/res/drawable-ldrtl-hdpi/msg_bubble_incoming.9.png b/vector/src/main/res/drawable-ldrtl-hdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ccc0cc8127bbede5224fea2b375f9b9376fc2 GIT binary patch literal 472 zcmV;}0Vn>6P) zyu-!80|#-;#T3CobZZP+S_0P=hl2i+wxA}L0>OePqFIO}MF+v4CJAw|Z-aK>kIU=s zy&ibBhxhZoJkJXck#S&_T*IZG-fH=f&F(?dF5&Zid}|;AmyE~HXbzL*2X2QirYzs1 z(-D8bWb(u@jIlOqH8$TYMQJ;N`Tg&xRN~9iAqW%hnA<%@skFUvavXTwCkln#)sz!p zCUa!)D;xk5iBkXu9&a!bxk0}#8fkn%#-35HZ~lUD1OtILRI9Ny7)LOdJ1~K90#)@I zgTcoCfZ^~H8jYYy%qAENzMAYC2higgpMH6JIGwYpl)hnWcZ2Y-x4i5=A((%!n5UhV zjx*`<6ZoSR*p#5dCiG(V=19APMLYM3inQ53*&n~LsiywaPn-YKHy&Jdm38q6Q$9Zy z&C- zHv}^`w^4CrLlmF6WBU5`094+&+%bOt4bthhs(YU+M$=MAr8=rpc!Q$Rp{gUp6(q}d zSXh|+1H&0)81pqSoIozuJ4Q#>kWRNY2PhQU{Re~-sK5UN(P(FLfOLHafCWpQQdWL2 z30Zz1Jw2P0+AN`%j*O-yadFXZvnvivSu8ea6T=v!D7RQziqwH&3>qJwtrNotBnWSq zm{>+8BQys{*S8oz7=d)%L_BVHM^yw-l7G1MaJzFPmlG+aw$iJC?0*<31!D{$q{2b5 z(b1G3N<{J1a;79bvF8w)A0b7_T2A$P?^$aI`JOUO+q2wbMTt8H>g_!us(SkGERW}f zgu};9fC>TAl+o37So4hE-Mx=w(n=Lr2WonH354ymT>hYa0?`Sti=p%Jp8x;=07*qoM6N<$g5MJP2><{9 literal 0 HcmV?d00001 diff --git a/vector/src/main/res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png b/vector/src/main/res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8fc747ee34eee35d224b929b3ca4acbc356d1b GIT binary patch literal 1593 zcmaJ>eNfY87%$*BipaeAu@juc=p1ae`Dj|2NJmSX0=gnpHkdduB!Py~rb~itInN0q z0^$Uj+ytEyL_XYfle%2Rc9ICi_Sc-2ULqUGl!q`~H5< z_mi5;jMQn7F_8*|Vp@8d#V)T}`PD>(%iqM4Mwh(Ik;q(W1z#w6DS=g(7`}i7(p^*$ zYiB9O|KV9SNudbix$Imi*Y*xU^DZ?N#Hf8PkIYsml9GKMigvORP{0;(ZUZ=S>?8ruF1f-L9m#fE}F*&AZHz{y3SN-R8G>SEney2Sv>H)@7s2rW!wFbo%{ zD4NAoSb>IB>Gh~yg`t>M2h)j#41!MRnT$^+;v{Odnyfm^iXfy0w^&g`QtI2|r zDHGguw1XPt>=QEQe z&ngFxX>luwo6W)CQ(#mN5pwC4vJO!r%{9g(pQjc+N7U9Quoa*C9h*Y?FKFFbh?Fb-Q4?>4yG zm9}k*O!o(Be8Wu<7l+n|ZK~*~xs$MQZ`}^JGPADtbYI`6mDbksOi}FF9%#!P{-rv4 z=!j-@z?rgh>+r&s{5kZ7gAF$Ss5z^mU=it`O*r%N-UnwK7)|KtStzaScwqng@vV_7 zGYBU?QvT5JL)`RDLo13;RP8s{Jj|-AD{0G$(kI=%bjNpfZF5ggMz+24TnqE{TbqLHz~p|sjN*O8Gv4SW%C~7N*h>B=Mv5F#6Z8r$Ee>m>UzW2Vjzu$L%vm0Y$ zB3aBJCWFCXX`@tndXJ=EmG@+NZ3~%KMQ^hxbv(6Xxxb^`i9IbIoT1qYx@Z z#(wQoye<|{l1>5;@kCr4gdsqJ@F0;8fuIEd3_=1v1oB~o3qhz*f|xW^oTemH zuhNX!q9qyIOi>P$&reTJ=cNmHq%)ZhAqc_;VLl9VX$04mVW%)R*X{})*PtR?xYOdG zETkRqXvBPBI!<~8gt)4OM z`!cP???N!P`%wG#xvWw^T2e#;P z6W1y5jB?J)JK*J|lkWs}TunH!H?7zA8j%v}D-CPr&)?a#T>N>`5HoG-78eUGG5=PV z`|z6POrZbQ!zXjFrhp6cIf*Mu&$X`D^3#>I?c#H`|@uzNV;pax#-~b2NgL_ z4<}^SPW>e`e(qI9A0%8=Zak{>pTb=4Rkv|}1OHmf)LGL{!#k}B$HmfpCC6Gdhwk}R zo*!-uPQqK)D{|U$D;}SLSVh(au8Elg=m=2Snb*EtJd^ohK3=?{%j|vq@cASCU1v)s z-8|b|zp3hD@hG-(RxnYX_$B=J~ zi>Yd{&5ivg00`VZ6j=I>EfK+iTWD?%J3hLw*3MzF&5~5#F(%HT{5o zjqgbGbMJ#xC}&W5&=9K5sc{CKi^`@=C6^QgwlxRG6_@GJ#$&Kmx}#jL$X=Ea$_bGU zE?(2&PGBEz{HyZCvjFA?w_`tw@JSnPJ!!cibOcF5dkXv7(>e#zCs_B-cy_Czh8-88 zJECrS$$K&Fz);l1x?8XMIGc)05qU9pv&8lb2`|4Yknh!(`)6H5BC{@N8QbO{hJsI` z%dfkNC-sI5s#g|0@!xZ}wqc?Eq-nvi9OY2kCHu(p?o^h*KWBGO+UZl;&jzc)f$dM% z<+XE8&AOexi}!nqwqDirtTE(q;$R_rc2ziQw&b@%|9QiCfi;=VY$r z?bq_n-xBA(-#^E!G_v|NV_pB&pAXLpd0n>FUlUfXKW)R^Ygb>dtvQe^yGW<|>RUUu zgA69KV^7RDuOQKI?D6Xai3YXFK38A43-CCci)B5`U?QV;IPr63{Ml#4K%vVkgBNeK zZk;M7>iV;O2BX%}^WKxTFa8~t%^u>D$&p}k$}lbd#_^AbBhUFixwCZA6VDCd%RetV im{9nEwQ|{oui}mx;bn4-e`A0Fz~JfX=d#Wzp$P!O{EM3a literal 0 HcmV?d00001 diff --git a/vector/src/main/res/drawable-xhdpi/msg_bubble_incoming.9.png b/vector/src/main/res/drawable-xhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0661fdba789fa348568b01299482fa29fff2e17d GIT binary patch literal 597 zcmV-b0;>IqP)*P_#)J^)}e`ilTvPBc^3uW4CXX0x&O z^ra<>p-|le)YA-yD~!bsnaioqQRn9~^!pp0qX5!0w|IG}KSw2#pL+sQlqwU6FYVj6 zy1LyHR6PE(J%|(>A3yLM6b#lotvs+)>Sr|i+iO%u5CE`H7^GnoJO;gjN~fo#0s#Qm z))uL%f208c04?j2T%b}Zz`40i`h0g%fSRz$$?tN3(&-^iOq@ys0sxYrX?}AH)MpnY zgaAfIcc7{j+fUjoqqR2}z8wo#-&An*^3M!;^Zz{9@G$q+&iLcDwG9S3zA zQi2?Nf105vHQP18;4J{*&J2aae{I)j+BM)-%QP)xYrLY=U>FDPff9)mghDrO9kv`vj3#7(Kq{ykMuUuaK j*jnTK3VXr#mizt(eh06M7!YU`00000NkvXXu0mjfUCISm literal 0 HcmV?d00001 diff --git a/vector/src/main/res/drawable-xxhdpi/msg_bubble_incoming.9.png b/vector/src/main/res/drawable-xxhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ab693b3e7c19e68ba8af37fbf5d9ead9aaa7fb32 GIT binary patch literal 1582 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 lG6AgN;eD4_u~}0N5W{&}^t>cK=N~z~tTq4u literal 0 HcmV?d00001 diff --git a/vector/src/main/res/layout/item_timeline_event_base.xml b/vector/src/main/res/layout/item_timeline_event_base.xml index 3ae80424cc..05d0dd797e 100644 --- a/vector/src/main/res/layout/item_timeline_event_base.xml +++ b/vector/src/main/res/layout/item_timeline_event_base.xml @@ -92,6 +92,7 @@ android:id="@+id/messageContentTextStub" style="@style/TimelineContentStubBaseParams" android:layout_height="wrap_content" + android:layout_width="wrap_content" android:inflatedId="@id/messageTextView" android:layout="@layout/item_timeline_event_text_message_stub" tools:visibility="visible" /> diff --git a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml index 59396db0e5..6b8f08833c 100644 --- a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml @@ -1,8 +1,8 @@ -(Gelöschte Nachricht) + Nachrichtblasen + Keine + Selbe Seite + Beide Seiten + diff --git a/vector/src/main/res/values/arrays_sc.xml b/vector/src/main/res/values/arrays_sc.xml new file mode 100644 index 0000000000..2c5305c28e --- /dev/null +++ b/vector/src/main/res/values/arrays_sc.xml @@ -0,0 +1,15 @@ + + + + + @string/bubble_style_none + @string/bubble_style_start + @string/bubble_style_both + + + none + start + both + + + diff --git a/vector/src/main/res/values/attrs_sc.xml b/vector/src/main/res/values/attrs_sc.xml new file mode 100644 index 0000000000..cafd386c83 --- /dev/null +++ b/vector/src/main/res/values/attrs_sc.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/vector/src/main/res/values/strings_sc.xml b/vector/src/main/res/values/strings_sc.xml index a24b245bc8..abc94df2b8 100644 --- a/vector/src/main/res/values/strings_sc.xml +++ b/vector/src/main/res/values/strings_sc.xml @@ -3,4 +3,9 @@ (Deleted message) + Message bubbles + None + Same side + Both sides + diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index a2be367e55..384d693562 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -216,6 +216,9 @@ @style/VectorSnackBarButton @style/VectorSnackBarText + + #FF465561 + #FF1A2027