Skip to content

Commit a369474

Browse files
david-allisonBrayanDSO
authored andcommitted
fix(card-browser): only show focus if fragmented
1 parent ad6b96c commit a369474

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
@@ -157,6 +157,12 @@ open class CardBrowser :
157157
}
158158
}
159159

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

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

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

388393
supportFragmentManager.commit {
389394
replace(R.id.card_browser_frame, CardBrowserFragment())
@@ -842,7 +847,7 @@ open class CardBrowser :
842847
@NeedsTest("note edits are saved")
843848
@NeedsTest("I/O edits are saved")
844849
fun openNoteEditorForCard(cardId: CardId) {
845-
viewModel.handleCardSelection(cardId, fragmented)
850+
viewModel.handleCardSelection(cardId)
846851
}
847852

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

17941804
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
17951805
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)