Skip to content
Snippets Groups Projects
Commit cd03d68d authored by Taras's avatar Taras
Browse files

Create text message view

parent 803371f3
No related branches found
No related tags found
No related merge requests found
Showing
with 244 additions and 9 deletions
package com.futo.circles.base
class BaseRecycleViewDecoration {
}
\ No newline at end of file
package com.futo.circles.extensions
import android.content.Context
import android.support.annotation.DimenRes
fun Context.dimen(@DimenRes resource: Int): Int = resources.getDimensionPixelSize(resource)
\ No newline at end of file
......@@ -6,11 +6,14 @@ import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import by.kirich1409.viewbindingdelegate.viewBinding
import com.futo.circles.R
import com.futo.circles.base.BaseRvDecoration
import com.futo.circles.databinding.GroupTimelineFragmentBinding
import com.futo.circles.extensions.bindToFab
import com.futo.circles.extensions.dimen
import com.futo.circles.extensions.observeData
import com.futo.circles.extensions.setToolbarTitle
import com.futo.circles.ui.groups.timeline.list.GroupTimelineAdapter
import com.futo.circles.ui.groups.timeline.list.GroupTimelineViewHolder
import com.futo.circles.ui.groups.timeline.model.GroupMessage
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
......@@ -30,6 +33,12 @@ class GroupTimelineFragment : Fragment(R.layout.group_timeline_fragment) {
binding.tvGroupTimeline.apply {
adapter = listAdapter
addItemDecoration(
BaseRvDecoration.OffsetDecoration<GroupTimelineViewHolder>(
verticalOffset = context.dimen(R.dimen.group_post_item_offset),
horizontalOffset = context.dimen(R.dimen.group_post_item_offset)
)
)
bindToFab(binding.fbCreatePost)
}
setupObservers()
......
......@@ -22,7 +22,7 @@ class GroupTimelineAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GroupTimelineViewHolder {
return when (GroupMessageType.values()[viewType]) {
GroupMessageType.TEXT_MESSAGE -> TextMessageViewHolder(parent)
GroupMessageType.TEXT_MESSAGE -> TextMessageViewHolder(parent,urlResolver)
GroupMessageType.IMAGE_MESSAGE -> ImageMessageViewHolder(parent, urlResolver)
}
}
......
......@@ -7,13 +7,16 @@ import com.futo.circles.base.ViewBindingHolder
import com.futo.circles.databinding.GroupImageMessageListItemBinding
import com.futo.circles.databinding.GroupTextMessageListItemBinding
import com.futo.circles.extensions.loadMatrixThumbnail
import com.futo.circles.extensions.setIsEncryptedIcon
import com.futo.circles.ui.groups.timeline.model.GroupImageMessage
import com.futo.circles.ui.groups.timeline.model.GroupTextMessage
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import java.text.DateFormat
import java.util.*
sealed class GroupTimelineViewHolder(view: View) : RecyclerView.ViewHolder(view)
class TextMessageViewHolder(parent: ViewGroup) :
class TextMessageViewHolder(parent: ViewGroup, private val urlResolver: ContentUrlResolver?) :
GroupTimelineViewHolder(
inflate(parent, GroupTextMessageListItemBinding::inflate)
) {
......@@ -21,7 +24,16 @@ class TextMessageViewHolder(parent: ViewGroup) :
private companion object : ViewBindingHolder<GroupTextMessageListItemBinding>
fun bind(data: GroupTextMessage) {
binding.ivSenderImage.loadMatrixThumbnail(
data.sender.avatarUrl,
urlResolver,
binding.ivSenderImage.height
)
binding.tvUserName.text = data.sender.disambiguatedDisplayName
binding.tvUserId.text = data.sender.userId
binding.tvMessage.text = data.message
binding.ivEncrypted.setIsEncryptedIcon(data.isEncrypted)
binding.tvMessageTime.text = DateFormat.getDateTimeInstance().format(Date(data.timestamp))
}
}
......
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,16L6,16l-2,2L4,4h16v12z"/>
</vector>
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
</vector>
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
</vector>
......@@ -48,6 +48,7 @@
android:id="@+id/bottomNavigationView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:itemBackground="?selectableItemBackgroundBorderless"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
app:cardCornerRadius="4dp">
<TextView
android:id="@+id/tvMessage"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content">
</FrameLayout>
\ No newline at end of file
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="8dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineEnd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="8dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="8dp" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivSenderImage"
android:layout_width="40dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintStart_toStartOf="@id/guidelineStart"
app:layout_constraintTop_toTopOf="@id/guidelineTop"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent"
tools:background="@color/blue" />
<TextView
android:id="@+id/tvUserName"
style="@style/body"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:ellipsize="end"
android:lines="1"
app:layout_constraintBottom_toTopOf="@id/tvUserId"
app:layout_constraintEnd_toStartOf="@id/btnMore"
app:layout_constraintStart_toEndOf="@id/ivSenderImage"
app:layout_constraintTop_toTopOf="@id/ivSenderImage"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Android01" />
<TextView
android:id="@+id/tvUserId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="@id/ivSenderImage"
app:layout_constraintEnd_toEndOf="@id/tvUserName"
app:layout_constraintStart_toStartOf="@id/tvUserName"
app:layout_constraintTop_toBottomOf="@id/tvUserName"
tools:text="Android01@domain" />
<ImageButton
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:padding="4dp"
android:src="@drawable/ic_more"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tint="@color/blue" />
<TextView
android:id="@+id/tvMessage"
style="@style/body"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
app:layout_constraintStart_toStartOf="@id/guidelineStart"
app:layout_constraintTop_toBottomOf="@id/ivSenderImage"
tools:text="messsage" />
<ImageView
android:id="@+id/ivEncrypted"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@id/tvMessageTime"
app:layout_constraintDimensionRatio="h,1:1"
app:layout_constraintStart_toStartOf="@id/ivSenderImage"
app:layout_constraintTop_toTopOf="@id/tvMessageTime"
tools:src="@drawable/ic_lock" />
<TextView
android:id="@+id/tvMessageTime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:lines="1"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
app:layout_constraintStart_toEndOf="@id/ivEncrypted"
app:layout_constraintTop_toBottomOf="@id/tvMessage"
tools:text="some date" />
<View
android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="@dimen/divider_height"
android:layout_marginTop="8dp"
android:background="@color/divider_color"
app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
app:layout_constraintStart_toStartOf="@id/guidelineStart"
app:layout_constraintTop_toBottomOf="@id/tvMessageTime" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnLike"
style="@style/PostButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/like"
app:icon="@drawable/ic_unlike"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnReply"
app:layout_constraintStart_toStartOf="@id/guidelineStart"
app:layout_constraintTop_toBottomOf="@id/divider" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnReply"
style="@style/PostButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reply"
app:icon="@drawable/ic_reply"
app:layout_constraintBottom_toBottomOf="@id/btnLike"
app:layout_constraintEnd_toStartOf="@id/btnShare"
app:layout_constraintStart_toEndOf="@id/btnLike"
app:layout_constraintTop_toTopOf="@id/btnLike" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnShare"
style="@style/PostButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/share"
app:icon="@drawable/ic_share"
app:layout_constraintBottom_toBottomOf="@id/btnLike"
app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
app:layout_constraintStart_toEndOf="@id/btnReply"
app:layout_constraintTop_toTopOf="@id/btnLike" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
......@@ -8,6 +9,7 @@
android:id="@+id/tvGroupTimeline"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
......@@ -20,5 +22,6 @@
app:fabSize="normal"
app:layout_anchor="@id/tvGroupTimeline"
app:srcCompat="@drawable/ic_create"
app:tint="@color/white" />
app:tint="@color/white"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="divider_height">1dp</dimen>
<dimen name="group_post_item_offset">4dp</dimen>
</resources>
\ No newline at end of file
......@@ -22,6 +22,9 @@
<string name="my_circles">My Circles</string>
<string name="photo_galleries">Photo Galleries</string>
<string name="initial_device_name">%s (Android)</string>
<string name="like">Like</string>
<string name="reply">Reply</string>
<string name="share">Share</string>
<plurals name="member_plurals">
<item quantity="one">%d member</item>
......
......@@ -8,6 +8,16 @@
<item name="android:textSize">17sp</item>
</style>
<style name="PostButtonStyle" parent="@style/Widget.MaterialComponents.Button.TextButton.Icon">
<item name="textAllCaps">false</item>
<item name="cornerRadius">8dp</item>
<item name="android:textSize">15sp</item>
<item name="iconPadding">4dp</item>
<item name="iconSize">24dp</item>
<item name="android:padding">4dp</item>
<item name="android:minHeight">0dp</item>
</style>
<style name="headline" parent="TextAppearance.MaterialComponents.Headline6">
<item name="android:textStyle">bold</item>
<item name="android:textSize">17sp</item>
......@@ -38,4 +48,8 @@
<item name="android:textColor">@color/gray</item>
<item name="android:textSize">15sp</item>
</style>
<style name="ShapeAppearanceOverlay.App.CornerSize50Percent" parent="">
<item name="cornerSize">50%</item>
</style>
</resources>
\ No newline at end of file
......@@ -10,6 +10,7 @@
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<item name="colorControlHighlight">#330E7AFE</item>
<item name="android:statusBarColor">@color/status_bar_color</item>
</style>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment