diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt index b1381aad915e..4bb6dc51793d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt @@ -174,6 +174,7 @@ import com.ichi2.anki.utils.ShortcutUtils import com.ichi2.anki.utils.ext.dismissAllDialogFragments import com.ichi2.anki.utils.ext.getSizeOfBitmapFromCollection import com.ichi2.anki.utils.ext.launchCollectionInLifecycleScope +import com.ichi2.anki.utils.ext.positionIsVisible import com.ichi2.anki.utils.ext.setFragmentResultListener import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.anki.utils.runWithOOMCheck @@ -784,6 +785,12 @@ open class DeckPicker : fun onFocusedDeckChanged(deckId: DeckId?) { val position = deckId?.let { viewModel.findDeckPosition(it) } ?: 0 + + // Skip centering if the deck is already on screen. + // Scrolling during a tap animation causes deck labels to overlap on older devices. + if (decksLayoutManager.positionIsVisible(position)) { + return + } // HACK: a small delay is required before scrolling works deckPickerBinding.decks.postDelayed({ decksLayoutManager.scrollToPositionWithOffset(position, deckPickerBinding.decks.height / 2) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/LinearLayoutManager.kt b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/LinearLayoutManager.kt index 6127d65dd8ca..32f4fc8fa492 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/LinearLayoutManager.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/LinearLayoutManager.kt @@ -35,3 +35,8 @@ val LinearLayoutManager.visibleItemPositions: IntRange } return first..last } + +/** + * Returns true if the position is currently visible. + */ +fun LinearLayoutManager.positionIsVisible(position: Int): Boolean = position in visibleItemPositions