[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">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_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">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>
|
<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.Carousel.SnapHelperFactory
|
||||||
import com.airbnb.epoxy.EpoxyController
|
import com.airbnb.epoxy.EpoxyController
|
||||||
import com.airbnb.epoxy.EpoxyModel
|
import com.airbnb.epoxy.EpoxyModel
|
||||||
|
import com.airbnb.epoxy.ModelProp
|
||||||
import com.airbnb.epoxy.ModelView
|
import com.airbnb.epoxy.ModelView
|
||||||
import com.github.rubensousa.gravitysnaphelper.GravitySnapHelper
|
import com.github.rubensousa.gravitysnaphelper.GravitySnapHelper
|
||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.core.resources.StringProvider
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
import im.vector.app.features.home.room.list.UnreadCounterBadgeView
|
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.session.room.model.RoomSummary
|
||||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -39,6 +41,7 @@ import kotlin.math.min
|
|||||||
class SpaceBarController @Inject constructor(
|
class SpaceBarController @Inject constructor(
|
||||||
val stringProvider: StringProvider,
|
val stringProvider: StringProvider,
|
||||||
private val avatarRenderer: AvatarRenderer,
|
private val avatarRenderer: AvatarRenderer,
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
) : EpoxyController() {
|
) : EpoxyController() {
|
||||||
|
|
||||||
private var data: SpaceBarData = SpaceBarData()
|
private var data: SpaceBarData = SpaceBarData()
|
||||||
@ -61,6 +64,7 @@ class SpaceBarController @Inject constructor(
|
|||||||
|
|
||||||
private fun addSpaces(host: SpaceBarController, spaces: List<RoomSummary?>, selectedSpace: RoomSummary?) {
|
private fun addSpaces(host: SpaceBarController, spaces: List<RoomSummary?>, selectedSpace: RoomSummary?) {
|
||||||
spaceBarCarousel {
|
spaceBarCarousel {
|
||||||
|
enableSnap(host.vectorPreferences.preferSpecificSpacePagerSpace())
|
||||||
id("spaces_carousel")
|
id("spaces_carousel")
|
||||||
padding(
|
padding(
|
||||||
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
|
// Scroll to an element such that the new selection is roughly in the middle
|
||||||
val firstVisible = lm.findFirstCompletelyVisibleItemPosition()
|
val firstVisible = lm.findFirstCompletelyVisibleItemPosition()
|
||||||
val visibleRange = lm.findLastCompletelyVisibleItemPosition() - firstVisible + 1
|
val visibleRange = lm.findLastCompletelyVisibleItemPosition() - firstVisible + 1
|
||||||
val overshoot = visibleRange/2
|
if (vectorPreferences.preferSpecificSpacePagerSpace()) { // scroll to smallest space possible
|
||||||
val currentMiddle = firstVisible + overshoot
|
effectivePosition = when {
|
||||||
if (currentMiddle < position) {
|
position < 1 -> 0 // show home only if it is selected
|
||||||
effectivePosition = position + overshoot
|
firstVisible < 1 && position <= visibleRange -> 1 + visibleRange // hide home
|
||||||
} else if (currentMiddle > position) {
|
position > firstVisible + visibleRange -> position // make selection visible by scrolling right
|
||||||
effectivePosition = position - overshoot
|
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
|
// List limits
|
||||||
effectivePosition = max(0, min(effectivePosition, lm.itemCount-1))
|
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)
|
@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? {
|
override fun getSnapHelperFactory(): SnapHelperFactory? {
|
||||||
return null // SpaceBarSnapHelperFactory()
|
return if (mEnableSnap) SpaceBarSnapHelperFactory() else null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
internal class SpaceBarSnapHelperFactory: SnapHelperFactory() {
|
internal class SpaceBarSnapHelperFactory: SnapHelperFactory() {
|
||||||
override fun buildSnapHelper(context: Context?): SnapHelper {
|
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_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_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_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_NOTIF_ONLY_ALERT_ONCE = "SETTINGS_NOTIF_ONLY_ALERT_ONCE"
|
||||||
private const val SETTINGS_HIDE_CALL_BUTTONS = "SETTINGS_HIDE_CALL_BUTTONS"
|
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"
|
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)
|
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
|
// SC addition
|
||||||
fun onlyAlertOnce(): Boolean {
|
fun onlyAlertOnce(): Boolean {
|
||||||
return defaultPrefs.getBoolean(SETTINGS_NOTIF_ONLY_ALERT_ONCE, false)
|
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_FOLLOW_SYSTEM_LOCALE, true)
|
||||||
.putBoolean(SETTINGS_ENABLE_MEMBER_NAME_CLICK, false)
|
.putBoolean(SETTINGS_ENABLE_MEMBER_NAME_CLICK, false)
|
||||||
.putBoolean(SETTINGS_CLEAR_HIGHLIGHT_ON_SCROLL, true)
|
.putBoolean(SETTINGS_CLEAR_HIGHLIGHT_ON_SCROLL, true)
|
||||||
|
.putBoolean(SETTINGS_SPACE_PAGER_BAR_PREFER_SPACE, true)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +67,13 @@
|
|||||||
android:title="@string/settings_enable_space_pager"
|
android:title="@string/settings_enable_space_pager"
|
||||||
android:summary="@string/settings_enable_space_pager_summary" />
|
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
|
<im.vector.app.core.preference.VectorSwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="SETTINGS_SHOW_OPEN_ANONYMOUS"
|
android:key="SETTINGS_SHOW_OPEN_ANONYMOUS"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user