Skip to content

Commit

Permalink
Merge pull request #611 from stakwork/aa/feature/chat-scroll-down
Browse files Browse the repository at this point in the history
Implement scroll down button on chat
  • Loading branch information
tomastiminskas authored Jul 12, 2023
2 parents c7a4942 + 5f5c944 commit a4eef08
Show file tree
Hide file tree
Showing 13 changed files with 129 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/primaryBlue" />
<corners
android:topLeftRadius="10dp"
android:topRightRadius="0dp"
android:bottomRightRadius="0dp"
android:bottomLeftRadius="10dp" />
</shape>
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ internal class MessageListAdapter<ARGS : NavArgs>(
}

fun forceScrollToBottom() {
recyclerView.scrollToPosition(messages.size)
recyclerView.layoutManager?.smoothScrollToPosition(recyclerView, null, messages.size);
}

fun highlightAndScrollToSearchResult(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import chat.sphinx.chat_common.ui.viewstate.header.ChatHeaderViewState
import chat.sphinx.chat_common.ui.viewstate.menu.ChatMenuViewState
import chat.sphinx.chat_common.ui.viewstate.messageholder.setView
import chat.sphinx.chat_common.ui.viewstate.messagereply.MessageReplyViewState
import chat.sphinx.chat_common.ui.viewstate.scrolldown.ScrollDownViewState
import chat.sphinx.chat_common.ui.viewstate.search.MessagesSearchViewState
import chat.sphinx.chat_common.ui.viewstate.selected.MenuItemState
import chat.sphinx.chat_common.ui.viewstate.selected.SelectedMessageViewState
Expand Down Expand Up @@ -127,6 +128,7 @@ abstract class ChatFragment<
protected abstract val moreMenuBinding: LayoutMenuBottomBinding
protected abstract val recyclerView: RecyclerView
protected abstract val pinHeaderBinding: LayoutChatPinedMessageHeaderBinding?
protected abstract val scrollDownButtonBinding: LayoutScrollDownButtonBinding

protected abstract val menuEnablePayments: Boolean

Expand Down Expand Up @@ -201,6 +203,7 @@ abstract class ChatFragment<
setupHeader(insetterActivity)
setupAttachmentSendPreview(insetterActivity)
setupAttachmentFullscreen(insetterActivity)
setupScrollDown()
setupRecyclerView()

viewModel.screenInit()
Expand Down Expand Up @@ -809,6 +812,12 @@ abstract class ChatFragment<
}
}

private fun setupScrollDown(){
scrollDownButtonBinding.root.setOnClickListener {
forceScrollToBottom()
}
}

private fun setupRecyclerView() {
val linearLayoutManager = LinearLayoutManager(binding.root.context)
val messageListAdapter = MessageListAdapter(
Expand Down Expand Up @@ -838,6 +847,13 @@ abstract class ChatFragment<
viewModel.readMessages()
}
}

if (recyclerView.canScrollVertically(1)) {
viewModel.scrollDownViewStateContainer.updateViewState(ScrollDownViewState.On)
}
else {
viewModel.scrollDownViewStateContainer.updateViewState(ScrollDownViewState.Off)
}
}
})
}
Expand Down Expand Up @@ -1705,6 +1721,19 @@ abstract class ChatFragment<
}
}
}
onStopSupervisor.scope.launch(viewModel.mainImmediate) {
viewModel.scrollDownViewStateContainer.collect { viewState ->
@Exhaustive
when (viewState) {
is ScrollDownViewState.On -> {
scrollDownButtonBinding.root.visible
}
is ScrollDownViewState.Off -> {
scrollDownButtonBinding.root.gone
}
}
}
}
}

var searchTextListener: TextWatcher = object : TextWatcher {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import chat.sphinx.chat_common.ui.viewstate.mentions.MessageMentionsViewState
import chat.sphinx.chat_common.ui.viewstate.menu.ChatMenuViewState
import chat.sphinx.chat_common.ui.viewstate.messageholder.*
import chat.sphinx.chat_common.ui.viewstate.messagereply.MessageReplyViewState
import chat.sphinx.chat_common.ui.viewstate.scrolldown.ScrollDownViewState
import chat.sphinx.chat_common.ui.viewstate.search.MessagesSearchViewState
import chat.sphinx.chat_common.ui.viewstate.selected.SelectedMessageViewState
import chat.sphinx.chat_common.util.*
Expand Down Expand Up @@ -169,6 +170,10 @@ abstract class ChatViewModel<ARGS : NavArgs>(
ViewStateContainer(MessageMentionsViewState.MessageMentions(listOf()))
}

val scrollDownViewStateContainer: ViewStateContainer<ScrollDownViewState> by lazy {
ViewStateContainer(ScrollDownViewState.Off)
}

protected abstract val chatSharedFlow: SharedFlow<Chat?>

abstract val headerInitialHolderSharedFlow: SharedFlow<InitialHolderViewState>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package chat.sphinx.chat_common.ui.viewstate.scrolldown

import io.matthewnelson.concept_views.viewstate.ViewState

sealed class ScrollDownViewState: ViewState<ScrollDownViewState>() {

object On: ScrollDownViewState()
object Off: ScrollDownViewState()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/background_scroll_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="@dimen/scroll_down_button_width"
android:layout_height="@dimen/scroll_down_button_height"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/text_view_chat_scroll_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/material_icons_regular"
android:gravity="start"
android:text="@string/material_icon_name_expand_more"
android:textColor="@color/primaryText"
android:textSize="30sp"
android:layout_marginStart="@dimen/default_small_layout_margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>


</androidx.constraintlayout.widget.ConstraintLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,7 @@
<dimen name="chat_tribe_pin_icon_width">94dp</dimen>
<dimen name="chat_tribe_pin_icon_height">94dp</dimen>
<dimen name="chat_tribe_pin_icon_margin_top">48dp</dimen>

<dimen name="scroll_down_button_width">50dp</dimen>
<dimen name="scroll_down_button_height">40dp</dimen>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ internal class ChatContactFragment: ChatFragment<
LayoutMenuBottomBinding::bind, R.id.include_layout_menu_bottom_more
)

override val scrollDownButtonBinding: LayoutScrollDownButtonBinding by viewBinding(
LayoutScrollDownButtonBinding::bind, R.id.include_chat_contact_scroll_down
)

override val pinHeaderBinding: LayoutChatPinedMessageHeaderBinding?
get() = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,16 @@
android:src="@drawable/bottom_bar_elevation_gradient"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container" />

<include
android:id="@+id/include_chat_contact_scroll_down"
layout="@layout/layout_scroll_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_marginBottom="@dimen/default_double_layout_margin"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container"
app:layout_constraintEnd_toEndOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_constraint_chat_footer_container"
android:layout_width="match_parent"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ internal class ChatGroupFragment: ChatFragment<
LayoutMenuBottomBinding::bind, R.id.include_layout_menu_bottom_more
)

override val scrollDownButtonBinding: LayoutScrollDownButtonBinding by viewBinding(
LayoutScrollDownButtonBinding::bind, R.id.include_chat_group_scroll_down
)

override val pinHeaderBinding: LayoutChatPinedMessageHeaderBinding?
get() = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,16 @@
android:src="@drawable/bottom_bar_elevation_gradient"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container" />

<include
android:id="@+id/include_chat_group_scroll_down"
layout="@layout/layout_scroll_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_marginBottom="@dimen/default_double_layout_margin"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container"
app:layout_constraintEnd_toEndOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_constraint_chat_footer_container"
android:layout_width="match_parent"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ internal class ChatTribeFragment: ChatFragment<
get() = binding.includeLayoutMenuBottomCall
override val moreMenuBinding: LayoutMenuBottomBinding
get() = binding.includeLayoutMenuBottomMore
override val scrollDownButtonBinding: LayoutScrollDownButtonBinding
get() = binding.includeChatTribeScrollDown
override val attachmentFullscreenBinding: LayoutAttachmentFullscreenBinding
get() = binding.includeChatTribeAttachmentFullscreen
private val mentionMembersPopup: LayoutChatTribeMemberMentionPopupBinding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,16 @@
android:src="@drawable/bottom_bar_elevation_gradient"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container" />

<include
android:id="@+id/include_chat_tribe_scroll_down"
layout="@layout/layout_scroll_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_marginBottom="@dimen/default_double_layout_margin"
app:layout_constraintBottom_toTopOf="@+id/layout_constraint_chat_footer_container"
app:layout_constraintEnd_toEndOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_constraint_chat_footer_container"
android:layout_width="match_parent"
Expand Down

0 comments on commit a4eef08

Please sign in to comment.