mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-25 17:27:45 +00:00
Add unread count to conversation view
This commit is contained in:
parent
201b8c8e68
commit
f66309afd8
@ -5,11 +5,13 @@ import android.animation.ValueAnimator
|
|||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
|
import android.graphics.Typeface
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.loader.app.LoaderManager
|
import androidx.loader.app.LoaderManager
|
||||||
import androidx.loader.content.Loader
|
import androidx.loader.content.Loader
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
@ -18,6 +20,7 @@ import kotlinx.android.synthetic.main.activity_conversation_v2.*
|
|||||||
import kotlinx.android.synthetic.main.activity_conversation_v2.view.*
|
import kotlinx.android.synthetic.main.activity_conversation_v2.view.*
|
||||||
import kotlinx.android.synthetic.main.activity_conversation_v2_action_bar.*
|
import kotlinx.android.synthetic.main.activity_conversation_v2_action_bar.*
|
||||||
import kotlinx.android.synthetic.main.activity_home.*
|
import kotlinx.android.synthetic.main.activity_home.*
|
||||||
|
import kotlinx.android.synthetic.main.view_conversation.view.*
|
||||||
import kotlinx.android.synthetic.main.view_input_bar.view.*
|
import kotlinx.android.synthetic.main.view_input_bar.view.*
|
||||||
import kotlinx.android.synthetic.main.view_input_bar_recording.*
|
import kotlinx.android.synthetic.main.view_input_bar_recording.*
|
||||||
import kotlinx.android.synthetic.main.view_input_bar_recording.view.*
|
import kotlinx.android.synthetic.main.view_input_bar_recording.view.*
|
||||||
@ -331,6 +334,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
unreadCountTextView.text = formattedUnreadCount
|
unreadCountTextView.text = formattedUnreadCount
|
||||||
val textSize = if (unreadCount < 100) 12.0f else 9.0f
|
val textSize = if (unreadCount < 100) 12.0f else 9.0f
|
||||||
unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize)
|
unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize)
|
||||||
|
unreadCountTextView.setTypeface(Typeface.DEFAULT, if (unreadCount < 100) Typeface.BOLD else Typeface.NORMAL)
|
||||||
|
unreadCountIndicator.isVisible = (unreadCount != 0)
|
||||||
}
|
}
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
@ -34,8 +34,6 @@ class ConversationRecyclerView : RecyclerView {
|
|||||||
|
|
||||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||||
bottomOffset += dy // FIXME: Not sure this is fully accurate, but it seems close enough
|
bottomOffset += dy // FIXME: Not sure this is fully accurate, but it seems close enough
|
||||||
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
|
|
||||||
Log.d("Test", "${layoutManager.findFirstVisibleItemPosition()}")
|
|
||||||
delegate?.handleConversationRecyclerViewBottomOffsetChanged(abs(bottomOffset))
|
delegate?.handleConversationRecyclerViewBottomOffsetChanged(abs(bottomOffset))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -4,9 +4,11 @@ import android.content.Context
|
|||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
|
import android.util.TypedValue
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kotlinx.android.synthetic.main.view_conversation.view.*
|
import kotlinx.android.synthetic.main.view_conversation.view.*
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
@ -37,13 +39,20 @@ class ConversationView : LinearLayout {
|
|||||||
fun bind(thread: ThreadRecord, isTyping: Boolean, glide: GlideRequests) {
|
fun bind(thread: ThreadRecord, isTyping: Boolean, glide: GlideRequests) {
|
||||||
this.thread = thread
|
this.thread = thread
|
||||||
populateUserPublicKeyCacheIfNeeded(thread.threadId, context) // FIXME: This is a bad place to do this
|
populateUserPublicKeyCacheIfNeeded(thread.threadId, context) // FIXME: This is a bad place to do this
|
||||||
|
val unreadCount = thread.unreadCount
|
||||||
if (thread.recipient.isBlocked) {
|
if (thread.recipient.isBlocked) {
|
||||||
accentView.setBackgroundResource(R.color.destructive)
|
accentView.setBackgroundResource(R.color.destructive)
|
||||||
accentView.visibility = View.VISIBLE
|
accentView.visibility = View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
accentView.setBackgroundResource(R.color.accent)
|
accentView.setBackgroundResource(R.color.accent)
|
||||||
accentView.visibility = if (thread.unreadCount > 0) View.VISIBLE else View.INVISIBLE
|
accentView.visibility = if (unreadCount > 0) View.VISIBLE else View.INVISIBLE
|
||||||
}
|
}
|
||||||
|
val formattedUnreadCount = if (unreadCount < 100) unreadCount.toString() else "99+"
|
||||||
|
unreadCountTextView.text = formattedUnreadCount
|
||||||
|
val textSize = if (unreadCount < 100) 12.0f else 9.0f
|
||||||
|
unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize)
|
||||||
|
unreadCountTextView.setTypeface(Typeface.DEFAULT, if (unreadCount < 100) Typeface.BOLD else Typeface.NORMAL)
|
||||||
|
unreadCountIndicator.isVisible = (unreadCount != 0)
|
||||||
profilePictureView.glide = glide
|
profilePictureView.glide = glide
|
||||||
profilePictureView.update(thread.recipient, thread.threadId)
|
profilePictureView.update(thread.recipient, thread.threadId)
|
||||||
val senderDisplayName = getUserDisplayName(thread.recipient) ?: thread.recipient.address.toString()
|
val senderDisplayName = getUserDisplayName(thread.recipient) ?: thread.recipient.address.toString()
|
||||||
@ -53,7 +62,7 @@ class ConversationView : LinearLayout {
|
|||||||
val rawSnippet = thread.getDisplayBody(context)
|
val rawSnippet = thread.getDisplayBody(context)
|
||||||
val snippet = highlightMentions(rawSnippet, thread.threadId, context)
|
val snippet = highlightMentions(rawSnippet, thread.threadId, context)
|
||||||
snippetTextView.text = snippet
|
snippetTextView.text = snippet
|
||||||
snippetTextView.typeface = if (thread.unreadCount > 0) Typeface.DEFAULT_BOLD else Typeface.DEFAULT
|
snippetTextView.typeface = if (unreadCount > 0) Typeface.DEFAULT_BOLD else Typeface.DEFAULT
|
||||||
snippetTextView.visibility = if (isTyping) View.GONE else View.VISIBLE
|
snippetTextView.visibility = if (isTyping) View.GONE else View.VISIBLE
|
||||||
if (isTyping) {
|
if (isTyping) {
|
||||||
typingIndicatorView.startAnimation()
|
typingIndicatorView.startAnimation()
|
||||||
|
@ -98,6 +98,7 @@
|
|||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
|
android:id="@+id/unreadCountIndicator"
|
||||||
android:layout_width="20dp"
|
android:layout_width="20dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="20dp"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
|
@ -41,18 +41,46 @@
|
|||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:gravity="center_vertical">
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:id="@+id/conversationViewDisplayNameTextView"
|
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:maxLines="1"
|
android:orientation="horizontal"
|
||||||
android:ellipsize="end"
|
android:gravity="center_vertical">
|
||||||
android:textAlignment="viewStart"
|
|
||||||
android:textSize="@dimen/medium_font_size"
|
<TextView
|
||||||
android:textStyle="bold"
|
android:id="@+id/conversationViewDisplayNameTextView"
|
||||||
android:textColor="@color/text"
|
android:layout_width="wrap_content"
|
||||||
tools:text="I'm a very long display name. What are you going to do about it?" />
|
android:layout_height="wrap_content"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textSize="@dimen/medium_font_size"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:textColor="@color/text"
|
||||||
|
tools:text="I'm a very long display name. What are you going to do about it?" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/unreadCountIndicator"
|
||||||
|
android:layout_width="20dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_marginStart="4dp"
|
||||||
|
android:background="@drawable/circle_tintable"
|
||||||
|
android:backgroundTint="@color/conversation_unread_count_indicator_background">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/unreadCountTextView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:textSize="@dimen/very_small_font_size"
|
||||||
|
android:textColor="@color/text"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:text="8" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/timestampTextView"
|
android:id="@+id/timestampTextView"
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
<color name="link_preview_background">#000000</color>
|
<color name="link_preview_background">#000000</color>
|
||||||
<color name="scroll_to_bottom_button_background">#171717</color>
|
<color name="scroll_to_bottom_button_background">#171717</color>
|
||||||
<color name="scroll_to_bottom_button_border">#99FFFFFF</color>
|
<color name="scroll_to_bottom_button_border">#99FFFFFF</color>
|
||||||
<color name="conversation_unread_count_indicator_background">#1F1F1F</color>
|
<color name="conversation_unread_count_indicator_background">#303030</color>
|
||||||
|
|
||||||
<array name="profile_picture_placeholder_colors">
|
<array name="profile_picture_placeholder_colors">
|
||||||
<item>#5ff8b0</item>
|
<item>#5ff8b0</item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user