From bf6f71c2b523fa07fca5873e735516ff37928807 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Fri, 27 Jan 2023 09:15:12 +0100 Subject: [PATCH] [Labs] Prefer lower root spaces in bottom space bar Change-Id: I884f52bb29d7279350e1101fdc9fd995461534e0 --- .../src/main/res/values/strings_sc.xml | 2 + .../list/home/spacebar/SpaceBarController.kt | 38 +++++++++++++------ .../features/settings/VectorPreferences.kt | 7 ++++ .../src/main/res/xml/vector_settings_labs.xml | 7 ++++ 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/library/ui-strings/src/main/res/values/strings_sc.xml b/library/ui-strings/src/main/res/values/strings_sc.xml index 15f57952ed..148d267d8c 100644 --- a/library/ui-strings/src/main/res/values/strings_sc.xml +++ b/library/ui-strings/src/main/res/values/strings_sc.xml @@ -146,6 +146,8 @@ Swipe chat list to switch space Allow to switch between root spaces by swiping horizontally in the chat list + Prefer lower root space + Prioritize showing spaces in the bottom space bar that you have moved to the top of your root space list Only alert once Omit alert sounds for new messages if there is already an open notification for that chat diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/spacebar/SpaceBarController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/spacebar/SpaceBarController.kt index 8a1faa0fcb..f7440ea778 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/spacebar/SpaceBarController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/spacebar/SpaceBarController.kt @@ -25,11 +25,13 @@ import com.airbnb.epoxy.Carousel import com.airbnb.epoxy.Carousel.SnapHelperFactory import com.airbnb.epoxy.EpoxyController import com.airbnb.epoxy.EpoxyModel +import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.github.rubensousa.gravitysnaphelper.GravitySnapHelper import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.list.UnreadCounterBadgeView +import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject @@ -39,6 +41,7 @@ import kotlin.math.min class SpaceBarController @Inject constructor( val stringProvider: StringProvider, private val avatarRenderer: AvatarRenderer, + private val vectorPreferences: VectorPreferences, ) : EpoxyController() { private var data: SpaceBarData = SpaceBarData() @@ -61,6 +64,7 @@ class SpaceBarController @Inject constructor( private fun addSpaces(host: SpaceBarController, spaces: List, selectedSpace: RoomSummary?) { spaceBarCarousel { + enableSnap(host.vectorPreferences.preferSpecificSpacePagerSpace()) id("spaces_carousel") padding( Carousel.Padding( @@ -146,12 +150,21 @@ class SpaceBarController @Inject constructor( // Scroll to an element such that the new selection is roughly in the middle val firstVisible = lm.findFirstCompletelyVisibleItemPosition() val visibleRange = lm.findLastCompletelyVisibleItemPosition() - firstVisible + 1 - val overshoot = visibleRange/2 - val currentMiddle = firstVisible + overshoot - if (currentMiddle < position) { - effectivePosition = position + overshoot - } else if (currentMiddle > position) { - effectivePosition = position - overshoot + if (vectorPreferences.preferSpecificSpacePagerSpace()) { // scroll to smallest space possible + effectivePosition = when { + position < 1 -> 0 // show home only if it is selected + firstVisible < 1 && position <= visibleRange -> 1 + visibleRange // hide home + position > firstVisible + visibleRange -> position // make selection visible by scrolling right + else -> max(1, position - visibleRange) // make selection visible by scrolling left, as right as possible without scrolling to home + } + } else { // center current space + val overshoot = visibleRange / 2 + val currentMiddle = firstVisible + overshoot + if (currentMiddle < position) { + effectivePosition = position + overshoot + } else if (currentMiddle > position) { + effectivePosition = position - overshoot + } } // List limits effectivePosition = max(0, min(effectivePosition, lm.itemCount-1)) @@ -168,16 +181,19 @@ private inline fun SpaceBarCarouselModelBuilder.withModelsFrom( } @ModelView(autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT) -internal class SpaceBarCarousel(context: Context?) : Carousel(context) { +class SpaceBarCarousel(context: Context?) : Carousel(context) { + private var mEnableSnap: Boolean = false + @ModelProp // Couldn't get ModelProp to work without explicit setter + fun setEnableSnap(value: Boolean) { + mEnableSnap = value + } override fun getSnapHelperFactory(): SnapHelperFactory? { - return null // SpaceBarSnapHelperFactory() + return if (mEnableSnap) SpaceBarSnapHelperFactory() else null } } -/* internal class SpaceBarSnapHelperFactory: SnapHelperFactory() { override fun buildSnapHelper(context: Context?): SnapHelper { - return GravitySnapHelper(Gravity.CENTER) + return GravitySnapHelper(Gravity.START) } } - */ diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index d2fb3493c8..0723e30e82 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -252,6 +252,7 @@ class VectorPreferences @Inject constructor( private const val SETTINGS_JUMP_TO_BOTTOM_ON_SEND = "SETTINGS_JUMP_TO_BOTTOM_ON_SEND" private const val SETTINGS_SPACE_MEMBERS_IN_SPACE_ROOMS = "SETTINGS_SPACE_MEMBERS_IN_SPACE_ROOMS" private const val SETTINGS_ENABLE_SPACE_PAGER = "SETTINGS_ENABLE_SPACE_PAGER" + private const val SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE = "SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE" private const val SETTINGS_NOTIF_ONLY_ALERT_ONCE = "SETTINGS_NOTIF_ONLY_ALERT_ONCE" private const val SETTINGS_HIDE_CALL_BUTTONS = "SETTINGS_HIDE_CALL_BUTTONS" private const val SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER = "SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER" @@ -1223,6 +1224,11 @@ class VectorPreferences @Inject constructor( return defaultPrefs.getBoolean(SETTINGS_ENABLE_SPACE_PAGER, false) } + // SC addition + fun preferSpecificSpacePagerSpace(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE, false) + } + // SC addition fun onlyAlertOnce(): Boolean { return defaultPrefs.getBoolean(SETTINGS_NOTIF_ONLY_ALERT_ONCE, false) @@ -1292,6 +1298,7 @@ class VectorPreferences @Inject constructor( .putBoolean(SETTINGS_FOLLOW_SYSTEM_LOCALE, true) .putBoolean(SETTINGS_ENABLE_MEMBER_NAME_CLICK, false) .putBoolean(SETTINGS_CLEAR_HIGHLIGHT_ON_SCROLL, true) + .putBoolean(SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE, true) .apply() } diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index 2971fb538a..0b2c6f67c7 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -67,6 +67,13 @@ android:title="@string/settings_enable_space_pager" android:summary="@string/settings_enable_space_pager_summary" /> + +