diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt index e354be2f..e7b8b837 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt @@ -93,25 +93,26 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Callback, O } // Hide FAB when list is scrolling - epoxyRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - createChatFabMenu.removeCallbacks(showFabRunnable) + epoxyRecyclerView.addOnScrollListener( + object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + createChatFabMenu.removeCallbacks(showFabRunnable) - when (newState) { - RecyclerView.SCROLL_STATE_IDLE -> { - createChatFabMenu.postDelayed(showFabRunnable, 1000) - } - RecyclerView.SCROLL_STATE_DRAGGING, - RecyclerView.SCROLL_STATE_SETTLING -> { - when (roomListParams.displayMode) { - DisplayMode.HOME -> createChatFabMenu.hide() - DisplayMode.PEOPLE -> createChatRoomButton.hide() - else -> createGroupRoomButton.hide() + when (newState) { + RecyclerView.SCROLL_STATE_IDLE -> { + createChatFabMenu.postDelayed(showFabRunnable, 1000) + } + RecyclerView.SCROLL_STATE_DRAGGING, + RecyclerView.SCROLL_STATE_SETTLING -> { + when (roomListParams.displayMode) { + DisplayMode.HOME -> createChatFabMenu.hide() + DisplayMode.PEOPLE -> createChatRoomButton.hide() + else -> createGroupRoomButton.hide() + } + } } } - } - } - }) + }) } @@ -220,7 +221,7 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Callback, O return super.onBackPressed() } - // RoomSummaryController.Callback ************************************************************** +// RoomSummaryController.Callback ************************************************************** override fun onRoomSelected(room: RoomSummary) { roomListViewModel.accept(RoomListActions.SelectRoom(room)) diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/widget/FabMenuView.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/widget/FabMenuView.kt index 95b7179c..9210e7ac 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/widget/FabMenuView.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/widget/FabMenuView.kt @@ -18,56 +18,31 @@ package im.vector.riotredesign.features.home.room.list.widget import android.content.Context import android.util.AttributeSet -import android.view.ViewGroup -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.constraintlayout.widget.ConstraintSet +import androidx.constraintlayout.motion.widget.MotionLayout import androidx.core.view.isVisible -import androidx.transition.ChangeTransform -import androidx.transition.Transition -import androidx.transition.TransitionManager +import com.google.android.material.floatingactionbutton.FloatingActionButton import im.vector.riotredesign.R -import im.vector.riotredesign.core.animations.ANIMATION_DURATION_SHORT -import im.vector.riotredesign.core.animations.SimpleTransitionListener -import im.vector.riotredesign.core.animations.VectorFullTransitionSet import im.vector.riotredesign.features.themes.ThemeUtils -import kotlinx.android.synthetic.main.merge_fab_menu_view.view.* +import kotlinx.android.synthetic.main.motion_fab_menu_merge.view.* class FabMenuView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { + defStyleAttr: Int = 0) : MotionLayout(context, attrs, defStyleAttr) { var listener: Listener? = null - private var isFabMenuOpened = false - init { - inflate(context, R.layout.merge_fab_menu_view, this) + inflate(context, R.layout.motion_fab_menu_merge, this) } override fun onFinishInflate() { super.onFinishInflate() - // Collapse - ConstraintSet().also { - it.clone(context, R.layout.constraint_set_fab_menu_close) - it.applyTo(this) - } - - createRoomItemChat.isVisible = false - createRoomItemChatLabel.isVisible = false - createRoomItemGroup.isVisible = false - createRoomItemGroupLabel.isVisible = false - // Collapse end - // Tint label background listOf(createRoomItemChatLabel, createRoomItemGroupLabel) .forEach { it.setBackgroundResource(ThemeUtils.getResourceId(context, R.drawable.vector_label_background_light)) } - createRoomButton.setOnClickListener { - toggleFabMenu() - } - listOf(createRoomItemChat, createRoomItemChatLabel) .forEach { it.setOnClickListener { @@ -89,68 +64,25 @@ class FabMenuView @JvmOverloads constructor(context: Context, attrs: AttributeSe } fun show() { + isVisible = true createRoomButton.show() } fun hide() { - createRoomButton.hide() - } - - private fun openFabMenu() { - if (isFabMenuOpened) { - return - } - - toggleFabMenu() + createRoomButton.hide(object : FloatingActionButton.OnVisibilityChangedListener() { + override fun onHidden(fab: FloatingActionButton?) { + super.onHidden(fab) + isVisible = false + } + }) } private fun closeFabMenu() { - if (!isFabMenuOpened) { - return - } - - toggleFabMenu() - } - - private fun toggleFabMenu() { - isFabMenuOpened = !isFabMenuOpened - - TransitionManager.beginDelayedTransition(parent as? ViewGroup ?: this, - VectorFullTransitionSet().apply { - duration = ANIMATION_DURATION_SHORT - ChangeTransform() - addListener(object : SimpleTransitionListener() { - override fun onTransitionEnd(transition: Transition) { - // Hide the view after the transition for a better visual effect - createRoomItemChat.isVisible = isFabMenuOpened - createRoomItemChatLabel.isVisible = isFabMenuOpened - createRoomItemGroup.isVisible = isFabMenuOpened - createRoomItemGroupLabel.isVisible = isFabMenuOpened - } - }) - }) - - if (isFabMenuOpened) { - // Animate manually the rotation for a better effect - createRoomButton.animate().setDuration(ANIMATION_DURATION_SHORT).rotation(135f) - - - ConstraintSet().also { - it.clone(context, R.layout.constraint_set_fab_menu_open) - it.applyTo(this) - } - } else { - createRoomButton.animate().setDuration(ANIMATION_DURATION_SHORT).rotation(0f) - - ConstraintSet().also { - it.clone(context, R.layout.constraint_set_fab_menu_close) - it.applyTo(this) - } - } + transitionToStart() } fun onBackPressed(): Boolean { - if (isFabMenuOpened) { + if (currentState == R.id.constraint_set_fab_menu_open) { closeFabMenu() return true } diff --git a/vector/src/main/res/layout/constraint_set_fab_menu_close.xml b/vector/src/main/res/layout/constraint_set_fab_menu_close.xml deleted file mode 100644 index 4df0e8d0..00000000 --- a/vector/src/main/res/layout/constraint_set_fab_menu_close.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/layout/constraint_set_fab_menu_open.xml b/vector/src/main/res/layout/constraint_set_fab_menu_open.xml deleted file mode 100644 index fc47458e..00000000 --- a/vector/src/main/res/layout/constraint_set_fab_menu_open.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_room_list.xml b/vector/src/main/res/layout/fragment_room_list.xml index 452451f7..729afb2b 100644 --- a/vector/src/main/res/layout/fragment_room_list.xml +++ b/vector/src/main/res/layout/fragment_room_list.xml @@ -17,6 +17,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" + app:layoutDescription="@xml/motion_scene_fab_menu" + tools:showPaths="true" tools:visibility="visible" /> + + app:layoutDescription="@xml/motion_scene_fab_menu" + tools:motionProgress="0.65" + tools:parentTag="androidx.constraintlayout.motion.widget.MotionLayout" + tools:showPaths="true"> + app:tint="@color/black" /> @@ -43,19 +44,19 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:src="@drawable/ic_fab_add_chat" - android:visibility="gone" - app:backgroundTint="?riotx_fab_secondary_bg" + app:backgroundTint="#FFFFFF" app:fabCustomSize="48dp" app:maxImageSize="29dp" - app:tint="?riotx_fab_secondary_color" - tools:ignore="MissingConstraints" - tools:visibility="visible" /> + app:tint="@color/black" /> @@ -63,11 +64,7 @@ android:id="@+id/createRoomButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="bottom|end" android:src="@drawable/ic_fab_add" - android:visibility="gone" - app:maxImageSize="14dp" - tools:ignore="MissingConstraints" - tools:visibility="visible" /> + app:maxImageSize="14dp" /> diff --git a/vector/src/main/res/xml/motion_scene_fab_menu.xml b/vector/src/main/res/xml/motion_scene_fab_menu.xml new file mode 100644 index 00000000..646cfc34 --- /dev/null +++ b/vector/src/main/res/xml/motion_scene_fab_menu.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file