Increase page change area and introduce delay to prevent accidental page changes

This commit is contained in:
Ensar Sarajčić
2023-07-19 15:45:29 +02:00
parent f0eb1254a3
commit d4b131ab23

View File

@ -56,6 +56,8 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
private var lastPage = 0 private var lastPage = 0
private var currentPage = 0 private var currentPage = 0
private var pageChangeLastArea = PageChangeArea.MIDDLE
private var pageChangeLastAreaEntryTime = 0L
private var pageChangeAnimLeftPercentage = 0f private var pageChangeAnimLeftPercentage = 0f
private var pageChangeEnabled = true private var pageChangeEnabled = true
@ -173,14 +175,36 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
} }
draggedItemCurrentCoords = Pair(x, y) draggedItemCurrentCoords = Pair(x, y)
if (x > right - sideMargins.right) { if (x > right - sideMargins.right - cellWidth / 2) {
nextOrAdditionalPage() doWithPageChangeDelay(PageChangeArea.RIGHT) {
} else if (x < left + 2 * sideMargins.left) { nextOrAdditionalPage()
prevPage() }
} else if (x < left + sideMargins.left + cellWidth / 2) {
doWithPageChangeDelay(PageChangeArea.LEFT) {
prevPage()
}
} else {
clearPageChangeFlags()
} }
redrawGrid() redrawGrid()
} }
private fun clearPageChangeFlags() {
pageChangeLastArea = PageChangeArea.MIDDLE
pageChangeLastAreaEntryTime = 0
}
private fun doWithPageChangeDelay(needed: PageChangeArea, pageChangeFunction: () -> Boolean) {
if (pageChangeLastArea != needed) {
pageChangeLastArea = needed
pageChangeLastAreaEntryTime = System.currentTimeMillis()
} else if (System.currentTimeMillis() - pageChangeLastAreaEntryTime > PAGE_CHANGE_HOLD_THRESHOLD) {
if (pageChangeFunction()) {
clearPageChangeFlags()
}
}
}
// figure out at which cell was the item dropped, if it is empty // figure out at which cell was the item dropped, if it is empty
fun itemDraggingStopped() { fun itemDraggingStopped() {
widgetViews.forEach { widgetViews.forEach {
@ -843,28 +867,37 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
private fun getMaxPage() = gridItems.map { it.page }.max() private fun getMaxPage() = gridItems.map { it.page }.max()
private fun nextOrAdditionalPage(redraw: Boolean = false) { private fun nextOrAdditionalPage(redraw: Boolean = false): Boolean {
if (currentPage < getMaxPage() + 1 && pageChangeEnabled) { if (currentPage < getMaxPage() + 1 && pageChangeEnabled) {
lastPage = currentPage lastPage = currentPage
currentPage++ currentPage++
handlePageChange(redraw) handlePageChange(redraw)
return true
} }
return false
} }
fun nextPage(redraw: Boolean = false) { fun nextPage(redraw: Boolean = false): Boolean {
if (currentPage < getMaxPage() && pageChangeEnabled) { if (currentPage < getMaxPage() && pageChangeEnabled) {
lastPage = currentPage lastPage = currentPage
currentPage++ currentPage++
handlePageChange(redraw) handlePageChange(redraw)
return true
} }
return false
} }
fun prevPage(redraw: Boolean = false) { fun prevPage(redraw: Boolean = false): Boolean {
if (currentPage > 0 && pageChangeEnabled) { if (currentPage > 0 && pageChangeEnabled) {
lastPage = currentPage lastPage = currentPage
currentPage-- currentPage--
handlePageChange(redraw) handlePageChange(redraw)
return true
} }
return false
} }
private fun handlePageChange(redraw: Boolean = false) { private fun handlePageChange(redraw: Boolean = false) {
@ -894,5 +927,12 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
companion object { companion object {
private const val ANIMATION_DURATION = 700L private const val ANIMATION_DURATION = 700L
private const val PAGE_CHANGE_BLOCKING_DURATION = ANIMATION_DURATION + 200L private const val PAGE_CHANGE_BLOCKING_DURATION = ANIMATION_DURATION + 200L
private const val PAGE_CHANGE_HOLD_THRESHOLD = 500L
private enum class PageChangeArea {
LEFT,
MIDDLE,
RIGHT
}
} }
} }