Skip to content

Commit 0fb98a0

Browse files
committed
fix(card-browser): only show focus if fragmented
1 parent a3c1914 commit 0fb98a0

File tree

4 files changed

+55
-25
lines changed

4 files changed

+55
-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: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ import kotlin.math.max
9595
import kotlin.math.min
9696

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

215224
var focusedRow: CardOrNoteId? = null
225+
set(value) {
226+
if (!isFragmented) return
227+
field = value
228+
}
216229

217230
suspend fun queryAllSelectedCardIds() = selectedRows.queryCardIds(this.cardsOrNotes)
218231

@@ -451,11 +464,8 @@ class CardBrowserViewModel(
451464
rowLongPressFocusFlow.emit(id)
452465
}
453466

454-
fun handleCardSelection(
455-
cardId: CardId,
456-
fragmented: Boolean,
457-
) {
458-
createCardSelector(this)(cardId, fragmented)
467+
fun handleCardSelection(cardId: CardId) {
468+
createCardSelector(this)(cardId, isFragmented)
459469
}
460470

461471
/** Whether any rows are selected */
@@ -1130,6 +1140,7 @@ class CardBrowserViewModel(
11301140
fun factory(
11311141
lastDeckIdRepository: LastDeckIdRepository,
11321142
cacheDir: File,
1143+
isFragmented: Boolean,
11331144
preferencesProvider: SharedPreferencesProvider? = null,
11341145
options: CardBrowserLaunchOptions?,
11351146
) = viewModelFactory {
@@ -1139,6 +1150,7 @@ class CardBrowserViewModel(
11391150
cacheDir,
11401151
options,
11411152
preferencesProvider ?: AnkiDroidApp.sharedPreferencesProvider,
1153+
isFragmented,
11421154
)
11431155
}
11441156
}

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)