Skip to content

Commit cd2a5f9

Browse files
committed
fix(card-browser): only show focus if fragmented
1 parent 5bf60cb commit cd2a5f9

File tree

4 files changed

+56
-25
lines changed

4 files changed

+56
-25
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ open class CardBrowser :
158158
}
159159
}
160160

161+
override var fragmented: Boolean
162+
get() = viewModel.isFragmented
163+
set(value) {
164+
throw UnsupportedOperationException()
165+
}
166+
161167
private enum class TagsDialogListenerAction {
162168
FILTER,
163169
EDIT_TAGS,
@@ -367,8 +373,6 @@ open class CardBrowser :
367373
)
368374

369375
val launchOptions = intent?.toCardBrowserLaunchOptions() // must be called after super.onCreate()
370-
// must be called once we have an accessible collection
371-
viewModel = createViewModel(launchOptions)
372376

373377
setContentView(R.layout.card_browser)
374378
initNavigationDrawer(findViewById(android.R.id.content))
@@ -381,10 +385,11 @@ open class CardBrowser :
381385
* [fragmented] will be true if the view size is large otherwise false
382386
*/
383387
// TODO: Consider refactoring by storing noteEditorFrame and similar views in a sealed class (e.g., FragmentAccessor).
384-
fragmented =
385-
(noteEditorFrame?.visibility == View.VISIBLE).apply {
386-
Timber.i("Using split Browser: %b", fragmented)
387-
}
388+
val fragmented = noteEditorFrame?.visibility == View.VISIBLE
389+
Timber.i("Using split Browser: %b", fragmented)
390+
391+
// must be called once we have an accessible collection
392+
viewModel = createViewModel(launchOptions, fragmented)
388393

389394
supportFragmentManager.commit {
390395
replace(R.id.card_browser_frame, CardBrowserFragment())
@@ -843,7 +848,7 @@ open class CardBrowser :
843848
@NeedsTest("note edits are saved")
844849
@NeedsTest("I/O edits are saved")
845850
fun openNoteEditorForCard(cardId: CardId) {
846-
viewModel.handleCardSelection(cardId, fragmented)
851+
viewModel.handleCardSelection(cardId)
847852
}
848853

849854
/**
@@ -1780,17 +1785,22 @@ open class CardBrowser :
17801785
*
17811786
* @see showedActivityFailedScreen - we may not have AnkiDroidApp.instance and therefore can't
17821787
* create the ViewModel
1788+
*
1789+
* @param fragmented True if `noteEditorFrame` is non-null (x-large displays)
17831790
*/
1784-
private fun createViewModel(launchOptions: CardBrowserLaunchOptions?) =
1785-
ViewModelProvider(
1786-
viewModelStore,
1787-
CardBrowserViewModel.factory(
1788-
lastDeckIdRepository = AnkiDroidApp.instance.sharedPrefsLastDeckIdRepository,
1789-
cacheDir = cacheDir,
1790-
options = launchOptions,
1791-
),
1792-
defaultViewModelCreationExtras,
1793-
)[CardBrowserViewModel::class.java]
1791+
private fun createViewModel(
1792+
launchOptions: CardBrowserLaunchOptions?,
1793+
fragmented: Boolean,
1794+
) = ViewModelProvider(
1795+
viewModelStore,
1796+
CardBrowserViewModel.factory(
1797+
lastDeckIdRepository = AnkiDroidApp.instance.sharedPrefsLastDeckIdRepository,
1798+
cacheDir = cacheDir,
1799+
options = launchOptions,
1800+
isFragmented = fragmented,
1801+
),
1802+
defaultViewModelCreationExtras,
1803+
)[CardBrowserViewModel::class.java]
17941804

17951805
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
17961806
fun filterByTag(vararg tags: String) {

AnkiDroid/src/main/java/com/ichi2/anki/NavigationDrawerActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ abstract class NavigationDrawerActivity :
6060
/**
6161
* Navigation Drawer
6262
*/
63-
var fragmented = false
63+
open var fragmented = false
6464
protected set
6565
private var navButtonGoesBack = false
6666

AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@ import kotlin.math.max
9595
import kotlin.math.min
9696

9797
// TODO: move the tag computation to ViewModel
98+
99+
/**
100+
* @param lastDeckIdRepository returns the last selected ID. See [LastDeckIdRepository]
101+
* @param cacheDir Temporary location to store data too large to pass via intent
102+
* @param options Options passed to CardBrowser on startup
103+
* @param preferences Accessor for `SharedPreferences`
104+
* @param isFragmented `true` if a NoteEditor side panel is displayed (x-large displays)
105+
* @param manualInit test-only: defer `initCompleted` until `manualInit()` is called
106+
*/
98107
@NeedsTest("reverseDirectionFlow/sortTypeFlow are not updated on .launch { }")
99108
@NeedsTest("columIndex1/2 config is not not updated on init")
100109
@NeedsTest("13442: selected deck is not changed, as this affects the reviewer")
@@ -105,6 +114,7 @@ class CardBrowserViewModel(
105114
private val cacheDir: File,
106115
options: CardBrowserLaunchOptions?,
107116
preferences: SharedPreferencesProvider,
117+
val isFragmented: Boolean,
108118
private val manualInit: Boolean = false,
109119
) : ViewModel(),
110120
SharedPreferencesProvider by preferences {
@@ -213,6 +223,10 @@ class CardBrowserViewModel(
213223
val flowOfCardStateChanged = MutableSharedFlow<Unit>()
214224

215225
var focusedRow: CardOrNoteId? = null
226+
set(value) {
227+
if (!isFragmented) return
228+
field = value
229+
}
216230

217231
suspend fun queryAllSelectedCardIds() = selectedRows.queryCardIds(this.cardsOrNotes)
218232

@@ -451,11 +465,8 @@ class CardBrowserViewModel(
451465
rowLongPressFocusFlow.emit(id)
452466
}
453467

454-
fun handleCardSelection(
455-
cardId: CardId,
456-
fragmented: Boolean,
457-
) {
458-
createCardSelector(this)(cardId, fragmented)
468+
fun handleCardSelection(cardId: CardId) {
469+
createCardSelector(this)(cardId, isFragmented)
459470
}
460471

461472
/** Whether any rows are selected */
@@ -1130,6 +1141,7 @@ class CardBrowserViewModel(
11301141
fun factory(
11311142
lastDeckIdRepository: LastDeckIdRepository,
11321143
cacheDir: File,
1144+
isFragmented: Boolean,
11331145
preferencesProvider: SharedPreferencesProvider? = null,
11341146
options: CardBrowserLaunchOptions?,
11351147
) = viewModelFactory {
@@ -1139,6 +1151,7 @@ class CardBrowserViewModel(
11391151
cacheDir,
11401152
options,
11411153
preferencesProvider ?: AnkiDroidApp.sharedPreferencesProvider,
1154+
isFragmented,
11421155
)
11431156
}
11441157
}

AnkiDroid/src/test/java/com/ichi2/anki/browser/CardBrowserViewModelTest.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ class CardBrowserViewModelTest : JvmTest() {
588588
fun `suspend - notes - some cards suspended`() =
589589
runViewModelNotesTest(notes = 2) {
590590
// this suspends o single cid from a nid
591-
suspend(cards.first().toCardId(cardsOrNotes))
591+
suspend(cards.first().toCardId(cardsOrNotes) as CardId)
592592
ensureOpsExecuted(1) {
593593
selectAll()
594594
toggleSuspendCards()
@@ -1054,6 +1054,7 @@ class CardBrowserViewModelTest : JvmTest() {
10541054
cacheDir = createTransientDirectory(),
10551055
options = null,
10561056
preferences = AnkiDroidApp.sharedPreferencesProvider,
1057+
isFragmented = false,
10571058
manualInit = manualInit,
10581059
)
10591060
// makes ignoreValuesFromViewModelLaunch work under test
@@ -1078,6 +1079,7 @@ class CardBrowserViewModelTest : JvmTest() {
10781079
cacheDir = createTransientDirectory(),
10791080
options = null,
10801081
preferences = AnkiDroidApp.sharedPreferencesProvider,
1082+
isFragmented = false,
10811083
manualInit = manualInit,
10821084
)
10831085
// makes ignoreValuesFromViewModelLaunch work under test
@@ -1107,7 +1109,13 @@ class CardBrowserViewModelTest : JvmTest() {
11071109
}
11081110

11091111
val cache = File(createTempDirectory().pathString)
1110-
return CardBrowserViewModel(lastDeckIdRepository, cache, intent, AnkiDroidApp.sharedPreferencesProvider).apply {
1112+
return CardBrowserViewModel(
1113+
lastDeckIdRepository = lastDeckIdRepository,
1114+
cacheDir = cache,
1115+
options = intent,
1116+
isFragmented = false,
1117+
preferences = AnkiDroidApp.sharedPreferencesProvider,
1118+
).apply {
11111119
invokeInitialSearch()
11121120
}
11131121
}

0 commit comments

Comments
 (0)