diff --git a/app/build.gradle b/app/build.gradle index 6a9db595aecda61eca9962b7f1aba56569183973..517c4710f3de04b87621b721380a13feda191399 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,8 +80,6 @@ dependencies { //Webp animations implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.25.0' - // Custom shadow - implementation 'com.github.BluRe-CN:ComplexView:1.1' //Markdown def markwon_version = "4.6.2" diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt index d0f1d8c0e007cd9b7db514bb0d8d64139e0f6e84..8c0856a46079efb1e2dc663d8a8ada7082d3a9b2 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt @@ -7,6 +7,7 @@ import android.view.View import androidx.appcompat.view.menu.MenuBuilder import androidx.fragment.app.viewModels import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.DividerItemDecoration import dagger.hilt.android.AndroidEntryPoint import org.futo.circles.R import org.futo.circles.core.extensions.getCurrentUserPowerLevel @@ -90,7 +91,7 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli } } - private fun invalidateMenu(){ + private fun invalidateMenu() { binding.toolbar.menu.clear() setupMenu() } @@ -149,6 +150,7 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli private fun setupViews() { binding.rvTimeline.apply { adapter = listAdapter + addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL)) MarkAsReadBuffer(this) { viewModel.markEventAsRead(it) } } binding.lCreatePost.setUp(object : CreatePostViewListener { diff --git a/app/src/main/java/org/futo/circles/view/PostHeaderView.kt b/app/src/main/java/org/futo/circles/view/PostHeaderView.kt index 9426085f3acd0b9143894ccb182426db37f5ebd8..6d61068d04fb88d7c5b5cb54573d334abc2cf9cb 100644 --- a/app/src/main/java/org/futo/circles/view/PostHeaderView.kt +++ b/app/src/main/java/org/futo/circles/view/PostHeaderView.kt @@ -91,7 +91,7 @@ class PostHeaderView( } @SuppressLint("RestrictedApi") - private fun showMenu() { + fun showMenu() { val unwrappedPost = post ?: return PopupMenu(context, binding.btnMore).apply { (menu as? MenuBuilder)?.setOptionalIconsVisible(true) diff --git a/app/src/main/java/org/futo/circles/view/PostLayout.kt b/app/src/main/java/org/futo/circles/view/PostLayout.kt index ea93176ad798ad8bee922802e2b428aceede0ed5..b3a82408faf6d00d0c07bd37eebf77d1509fce60 100644 --- a/app/src/main/java/org/futo/circles/view/PostLayout.kt +++ b/app/src/main/java/org/futo/circles/view/PostLayout.kt @@ -1,25 +1,24 @@ package org.futo.circles.view +import android.annotation.SuppressLint import android.content.Context -import android.graphics.drawable.GradientDrawable import android.util.AttributeSet +import android.view.GestureDetector import android.view.LayoutInflater +import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import androidx.constraintlayout.widget.ConstraintLayout -import com.blure.complexview.Shadow import org.futo.circles.R import org.futo.circles.core.extensions.setIsVisible -import org.futo.circles.databinding.LayoutPostBinding -import org.futo.circles.extensions.convertDpToPixel -import org.futo.circles.feature.timeline.post.markdown.MarkdownParser import org.futo.circles.core.model.MediaContent import org.futo.circles.core.model.PollContent import org.futo.circles.core.model.Post import org.futo.circles.core.model.PostContent -import org.futo.circles.model.PostItemPayload import org.futo.circles.core.model.TextContent +import org.futo.circles.databinding.LayoutPostBinding +import org.futo.circles.feature.timeline.post.markdown.MarkdownParser +import org.futo.circles.model.PostItemPayload import org.matrix.android.sdk.api.session.room.send.SendState @@ -42,10 +41,11 @@ interface PostOptionsListener { fun onInfoClicked(roomId: String, eventId: String) } +@SuppressLint("ClickableViewAccessibility") class PostLayout( context: Context, attrs: AttributeSet? = null, -) : ConstraintLayout(context, attrs) { +) : FrameLayout(context, attrs) { private val binding = LayoutPostBinding.inflate(LayoutInflater.from(context), this) @@ -53,12 +53,39 @@ class PostLayout( private var optionsListener: PostOptionsListener? = null private var post: Post? = null + private val gestureDetector = + GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { + override fun onDoubleTap(e: MotionEvent): Boolean { + post?.let { optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) } + return true + } + + override fun onLongPress(e: MotionEvent) { + binding.postHeader.showMenu() + } + + override fun onSingleTapConfirmed(e: MotionEvent): Boolean { + post?.let { optionsListener?.onReply(it.postInfo.roomId, it.id) } + return true + } + + override fun onDoubleTapEvent(e: MotionEvent) = true + override fun onDown(e: MotionEvent) = true + + }).apply { + setIsLongpressEnabled(true) + } + init { binding.lvContent.setOnClickListener { post?.let { if (it.content.isMedia()) optionsListener?.onShowPreview(it.postInfo.roomId, it.id) } } + binding.lCard.setOnTouchListener { _, event -> + gestureDetector.onTouchEvent(event) + false + } } fun setListener(postOptionsListener: PostOptionsListener) { @@ -74,7 +101,6 @@ class PostLayout( } fun setPayload(payload: PostItemPayload) { - setShadow(payload.readInfo.shouldIndicateAsNew) setSendStatus(payload.sendState, payload.readInfo.readByCount) binding.postFooter.setRepliesCount(payload.repliesCount) } @@ -84,10 +110,13 @@ class PostLayout( binding.postFooter.setData(data, userPowerLevel, isThread) setMentionBorder(data.content) setIsEdited(data.postInfo.isEdited) - setShadow(data.readInfo.shouldIndicateAsNew) setSendStatus(data.sendState, data.readInfo.readByCount) } + private fun setIsEdited(isEdited: Boolean) { + binding.tvEditedLabel.setIsVisible(isEdited) + } + private fun setMentionBorder(content: PostContent) { val hasMention = when (content) { is MediaContent -> content.mediaContentInfo.caption?.let { @@ -97,25 +126,10 @@ class PostLayout( is TextContent -> MarkdownParser.hasCurrentUserMention(content.message) is PollContent -> false } - if (hasMention) - binding.lCard.setBackgroundResource(R.drawable.bg_mention_highlight) + if (hasMention) binding.lCard.setBackgroundResource(R.drawable.bg_mention_highlight) else binding.lCard.background = null } - private fun setIsEdited(isEdited: Boolean) { - binding.tvEditedLabel.setIsVisible(isEdited) - } - - private fun setShadow(isNew: Boolean) { - val color = if (isNew) "#0E7AFE" else "#8E8E93" - binding.lShadow.shadow = - Shadow( - 1, 255, color, GradientDrawable.RECTANGLE, - FloatArray(8) { context.convertDpToPixel(4f) }, - Shadow.Position.CENTER - ) - } - private fun setSendStatus(sendState: SendState, readByCount: Int) { when { sendState.isSending() -> { @@ -141,7 +155,7 @@ class PostLayout( } override fun addView(child: View, index: Int, params: ViewGroup.LayoutParams?) { - if (child.id == R.id.lShadow) { + if (child.id == R.id.lCard) { super.addView(child, index, params) } else { findViewById<FrameLayout>(R.id.lvContent).addView(child, index, params) diff --git a/app/src/main/res/color/button_src_state_color.xml b/app/src/main/res/color/button_src_state_color.xml index 22fd48601102b643d1fbb5c6deabce0de29f4fc5..182d3263bf5b4242f022a4b4609f2ae03a5b1b3b 100644 --- a/app/src/main/res/color/button_src_state_color.xml +++ b/app/src/main/res/color/button_src_state_color.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="@color/blue" android:state_enabled="true" /> + <item android:color="@color/menu_icon_color" android:state_enabled="true" /> <item android:color="@color/gray" /> </selector> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_post.xml b/app/src/main/res/layout/layout_post.xml index fa70ba7868c97aa88bd5efbac06991c8c18e818d..a815b35036314a0d84f9fc1716caddbf0e085dbd 100644 --- a/app/src/main/res/layout/layout_post.xml +++ b/app/src/main/res/layout/layout_post.xml @@ -5,124 +5,89 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + tools:parentTag="android.widget.FrameLayout"> - <com.blure.complexview.ComplexView - android:id="@+id/lShadow" - android:layout_width="0dp" + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/lCard" + android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:radius="4dp" - app:shadow="true" - app:shadowColor="#0E7AFE" - app:shadowSpread="1"> + android:clickable="true" + android:focusable="true" + android:foreground="?selectableItemBackground"> - <com.blure.complexview.ComplexView - android:layout_width="match_parent" + <org.futo.circles.view.PostHeaderView + android:id="@+id/postHeader" + android:layout_width="0dp" android:layout_height="wrap_content" - app:color="@color/post_card_background_color" - app:radius="4dp"> + android:layout_marginHorizontal="8dp" + android:layout_marginTop="8dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/lCard" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - <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" /> - - <org.futo.circles.view.PostHeaderView - android:id="@+id/postHeader" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintEnd_toEndOf="@id/guidelineEnd" - app:layout_constraintStart_toStartOf="@id/guidelineStart" - app:layout_constraintTop_toTopOf="@id/guidelineTop" /> - - - <FrameLayout - android:id="@+id/lvContent" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:clickable="true" - android:focusable="true" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/postHeader" /> - - <LinearLayout - android:id="@+id/lReadInfo" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintEnd_toEndOf="@id/guidelineEnd" - app:layout_constraintTop_toBottomOf="@id/lvContent"> - - <ImageView - android:id="@+id/ivSendStatus" - android:layout_width="14dp" - android:layout_height="14dp" - android:layout_gravity="bottom" - android:layout_marginEnd="2dp" - android:src="@drawable/ic_sending" /> - - <TextView - android:id="@+id/tvReadByCount" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="4dp" - android:lines="1" - android:textSize="12sp" - app:layout_goneMarginEnd="0dp" - tools:text="12" /> - - <TextView - android:id="@+id/tvEditedLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:lines="1" - android:text="@string/edited_label" - android:textSize="12sp" - android:visibility="gone" - tools:visibility="visible" /> - - </LinearLayout> - - <org.futo.circles.view.PostFooterView - android:id="@+id/postFooter" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="@id/guidelineEnd" - app:layout_constraintStart_toStartOf="@id/guidelineStart" - app:layout_constraintTop_toBottomOf="@id/lReadInfo" - app:layout_goneMarginTop="8dp" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - </com.blure.complexview.ComplexView> - </com.blure.complexview.ComplexView> + <FrameLayout + android:id="@+id/lvContent" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:clickable="true" + android:focusable="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/postHeader" /> + + <LinearLayout + android:id="@+id/lReadInfo" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/lvContent"> + + <ImageView + android:id="@+id/ivSendStatus" + android:layout_width="14dp" + android:layout_height="14dp" + android:layout_gravity="bottom" + android:layout_marginEnd="2dp" + android:src="@drawable/ic_sending" /> + + <TextView + android:id="@+id/tvReadByCount" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="4dp" + android:lines="1" + android:textSize="12sp" + app:layout_goneMarginEnd="0dp" + tools:text="12" /> + + <TextView + android:id="@+id/tvEditedLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:lines="1" + android:text="@string/edited_label" + android:textSize="12sp" + android:visibility="gone" + tools:visibility="visible" /> + + </LinearLayout> + + <org.futo.circles.view.PostFooterView + android:id="@+id/postFooter" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginHorizontal="8dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/lReadInfo" + app:layout_goneMarginTop="8dp" /> + + </androidx.constraintlayout.widget.ConstraintLayout> </merge> \ No newline at end of file diff --git a/app/src/main/res/layout/view_post_footer.xml b/app/src/main/res/layout/view_post_footer.xml index 96cc5b6d1c40f80c5378b910a9a4a51fc49c05b6..a1bef382bcd6e0957329fc08897dc33422a3cf7a 100644 --- a/app/src/main/res/layout/view_post_footer.xml +++ b/app/src/main/res/layout/view_post_footer.xml @@ -6,26 +6,15 @@ android:layout_height="wrap_content" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> - <View - android:id="@+id/divider" - android:layout_width="0dp" - android:layout_height="@dimen/divider_height" - android:background="@color/divider_color" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - <HorizontalScrollView android:id="@+id/chipsScrollView" android:layout_width="0dp" android:layout_height="0dp" - android:visibility="gone" app:layout_constraintBottom_toBottomOf="@id/btnLike" app:layout_constraintEnd_toStartOf="@id/btnLike" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/btnLike" - tools:visibility="visible"> + app:layout_constraintTop_toTopOf="@id/btnLike"> <LinearLayout android:id="@+id/lReactions" @@ -36,15 +25,22 @@ </HorizontalScrollView> - <ImageButton + <com.google.android.material.button.MaterialButton android:id="@+id/btnLike" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_marginEnd="8dp" android:background="?selectableItemBackgroundBorderless" - android:padding="8dp" - android:src="@drawable/ic_emoji" + android:gravity="top" + android:minWidth="0dp" + android:minHeight="0dp" + android:paddingHorizontal="8dp" + app:icon="@drawable/ic_emoji" + app:iconGravity="textStart" + app:iconPadding="0dp" + app:iconSize="20dp" + app:iconTint="@color/button_src_state_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/btnReply" app:layout_constraintStart_toEndOf="@id/chipsScrollView" @@ -55,6 +51,7 @@ android:id="@+id/btnReply" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="6dp" android:background="?selectableItemBackgroundBorderless" android:gravity="top" android:minWidth="0dp" @@ -62,9 +59,11 @@ android:padding="2dp" android:textAlignment="gravity" android:textColor="@color/button_src_state_color" - android:textSize="16sp" + android:textSize="14sp" + app:iconPadding="2dp" app:icon="@drawable/ic_reply" app:iconGravity="textStart" + app:iconSize="20dp" app:iconTint="@color/button_src_state_color" app:layout_constraintBottom_toBottomOf="@id/btnLike" app:layout_constraintEnd_toStartOf="@id/btnShare" @@ -73,18 +72,25 @@ app:tint="@color/button_src_state_color" tools:text="30" /> - <ImageButton + <com.google.android.material.button.MaterialButton android:id="@+id/btnShare" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:background="?selectableItemBackgroundBorderless" - android:padding="8dp" - android:src="@drawable/ic_share" + android:gravity="top" + android:minWidth="0dp" + android:minHeight="0dp" + android:paddingHorizontal="8dp" + app:icon="@drawable/ic_share" + app:iconGravity="textStart" + app:iconPadding="0dp" + app:iconSize="20dp" + app:iconTint="@color/button_src_state_color" app:layout_constraintBottom_toBottomOf="@id/btnLike" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/btnReply" app:layout_constraintTop_toTopOf="@id/btnLike" - app:tint="@color/blue" /> + app:tint="@color/menu_icon_color" /> </merge> \ No newline at end of file diff --git a/app/src/main/res/layout/view_post_header.xml b/app/src/main/res/layout/view_post_header.xml index 24a0c2e06faab0b2340e8e6831494320837c747e..2f48f019247fce500fa6c793d8c2ce7c0b60b4a6 100644 --- a/app/src/main/res/layout/view_post_header.xml +++ b/app/src/main/res/layout/view_post_header.xml @@ -88,6 +88,6 @@ android:src="@drawable/ic_more" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/blue" /> + app:tint="@color/menu_icon_color" /> </merge> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 15639ec4d44bb63f9ea9f51ab1e56a5f7719de28..dd7e0e09b97aa6f163fdb31c56b390b320d49c2d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -18,7 +18,7 @@ <color name="gray">#8E8E93</color> <color name="close_background">#80000000</color> <color name="list_item_icon_color">@color/black</color> - <color name="highlight_color">#330E7AFE</color> + <color name="highlight_color">#4D0E7AFE</color> <color name="chip_selected_color">#800E7AFE</color> <color name="launcher_background_color">#00008b</color> <color name="transparent">#00000000</color>