[Labs] Prefer lower root spaces in bottom space bar
Change-Id: I884f52bb29d7279350e1101fdc9fd995461534e0
This commit is contained in:
parent
a411437d53
commit
bf6f71c2b5
@ -146,6 +146,8 @@
|
||||
|
||||
<string name="settings_enable_space_pager">Swipe chat list to switch space</string>
|
||||
<string name="settings_enable_space_pager_summary">Allow to switch between root spaces by swiping horizontally in the chat list</string>
|
||||
<string name="settings_space_pager_prefer_space_1">Prefer lower root space</string>
|
||||
<string name="settings_space_pager_prefer_space_1_summary">Prioritize showing spaces in the bottom space bar that you have moved to the top of your root space list</string>
|
||||
|
||||
<string name="settings_notif_only_alert_once">Only alert once</string>
|
||||
<string name="settings_notif_only_alert_once_summary">Omit alert sounds for new messages if there is already an open notification for that chat</string>
|
||||
|
@ -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<RoomSummary?>, 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 <T> 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)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,13 @@
|
||||
android:title="@string/settings_enable_space_pager"
|
||||
android:summary="@string/settings_enable_space_pager_summary" />
|
||||
|
||||
<im.vector.app.core.preference.VectorSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE"
|
||||
android:dependency="SETTINGS_ENABLE_SPACE_PAGER"
|
||||
android:title="@string/settings_space_pager_prefer_space_1"
|
||||
android:summary="@string/settings_space_pager_prefer_space_1_summary" />
|
||||
|
||||
<im.vector.app.core.preference.VectorSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="SETTINGS_SHOW_OPEN_ANONYMOUS"
|
||||
|
Loading…
x
Reference in New Issue
Block a user