Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ open class CardBrowser :
}

override var fragmented: Boolean
get() = viewModel.isFragmented
get() = Prefs.showSplitView && viewModel.isFragmented
set(_) {
throw UnsupportedOperationException()
}
Expand Down Expand Up @@ -235,7 +235,8 @@ open class CardBrowser :
*/
// TODO: Consider refactoring by storing noteEditorFrame and similar views in a sealed class (e.g., FragmentAccessor).
val fragmented =
Prefs.devIsCardBrowserFragmented &&
Prefs.showSplitView &&
Prefs.devIsCardBrowserFragmented &&
!useSearchView &&
binding.noteEditorFrame?.visibility == View.VISIBLE
Timber.i("Using split Browser: %b", fragmented)
Expand Down
5 changes: 4 additions & 1 deletion AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateEditor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi
tempNoteType = CardTemplateNotetype.fromBundle(savedInstanceState)
}

fragmented = binding.fragmentContainer?.isVisible == true
fragmented = Prefs.showSplitView && binding.fragmentContainer?.isVisible == true

setNavigationBarColor(R.attr.alternativeBackgroundColor)

Expand All @@ -236,6 +236,9 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi
leftPaneWeightKey = PREF_TEMPLATE_EDITOR_PANE_WEIGHT,
rightPaneWeightKey = PREF_TEMPLATE_PREVIEWER_PANE_WEIGHT,
)
} else {
binding.fragmentContainer?.isVisible = false
binding.cardTemplateEditorResizingDivider?.isVisible = false
}

// Open TemplatePreviewerFragment if in fragmented mode
Expand Down
25 changes: 21 additions & 4 deletions AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ package com.ichi2.anki
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.Configuration
import android.database.SQLException
import android.graphics.Color
import android.graphics.PixelFormat
Expand All @@ -39,6 +38,7 @@ import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
Expand Down Expand Up @@ -276,8 +276,8 @@ open class DeckPicker :

override var fragmented: Boolean
get() =
resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK ==
Configuration.SCREENLAYOUT_SIZE_XLARGE
Prefs.showSplitView &&
resources.configuration.screenWidthDp >= 840
set(_) = throw UnsupportedOperationException()

// Short animation duration from system
Expand Down Expand Up @@ -509,6 +509,18 @@ open class DeckPicker :
}

setViewBinding(binding)
if (!fragmented) {
binding.studyoptionsFragment?.isVisible = false
binding.resizingDivider?.isVisible = false
// Ensure the deck picker pane fills the full width
deckPickerBinding.root.let { pane ->
(pane.layoutParams as? android.widget.LinearLayout.LayoutParams)?.let {
it.width = ViewGroup.LayoutParams.MATCH_PARENT
it.weight = 0f
pane.layoutParams = it
}
}
}
enableToolbar()
// TODO This method is run on every activity recreation, which can happen often.
// It seems that the original idea was for for this to only run once, on app start.
Expand Down Expand Up @@ -770,7 +782,7 @@ open class DeckPicker :
}

fun onResizingDividerVisibilityChanged(isVisible: Boolean) {
binding.resizingDivider?.isVisible = isVisible
binding.resizingDivider?.isVisible = isVisible && fragmented
}

fun onCardsDueChanged(dueCount: Int?) {
Expand Down Expand Up @@ -1946,6 +1958,11 @@ open class DeckPicker :
* @return whether the panel was shown
*/
private fun tryShowStudyOptionsPanel(): Boolean {
if (!fragmented) {
binding.studyoptionsFragment?.isVisible = false
binding.resizingDivider?.isVisible = false
return false
}
val containerId = binding.studyoptionsFragment?.id ?: return false
supportFragmentManager.commit {
replace(containerId, StudyOptionsFragment())
Expand Down
8 changes: 7 additions & 1 deletion AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class NoteEditorActivity :
private var refreshPreviewerJob: Job? = null

val fragmented: Boolean
get() = previewerFrame?.isVisible == true
get() = Prefs.showSplitView && previewerFrame?.isVisible == true

private lateinit var binding: ActivityNoteEditorBinding

Expand All @@ -94,6 +94,12 @@ class NoteEditorActivity :
setContentView(binding.root)

previewerFrame = binding.previewerFrame
// Hide the preview pane and divider when split view is disabled so the layout collapses
// to single-pane and the toolbar preview icon becomes available again.
if (previewerFrame != null && !Prefs.showSplitView) {
binding.previewerFrameLayout?.isVisible = false
binding.noteEditorResizingDivider?.isVisible = false
}
Timber.i("Note Editor is in %s mode", if (fragmented) "split" else "single-pane")

// TODO: specify how non-null but invalid extras are handled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ object AnalyticsConstants {
R.string.show_audio_play_buttons_key, // Show play buttons on cards with audio (reversed in collection: HIDE_AUDIO_PLAY_BUTTONS)
R.string.pref_display_filenames_in_browser_key, // Display filenames in card browser
R.string.show_deck_title_key, // Show deck title
R.string.show_split_view_key, // Show split view
// ******************************** Controls *********************************************
R.string.gestures_preference, // Enable gestures
R.string.gestures_corner_touch_preference, // 9-point touch
Expand Down
7 changes: 7 additions & 0 deletions AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,13 @@ open class PrefsRepository(

val exitViaDoubleTapBack by booleanPref(R.string.exit_via_double_tap_back_key, false)

/**
* Whether to show side-by-side split panes on large screens.
* Applies to the note editor, card browser, and template editor.
* When false, all screens use a single-pane layout.
*/
var showSplitView by booleanPref(R.string.show_split_view_key, defaultValue = true)

// ****************************************** Sync ****************************************** //

val isAutoSyncEnabled by booleanPref(R.string.automatic_sync_choice_key, false)
Expand Down
3 changes: 3 additions & 0 deletions AnkiDroid/src/main/res/values/10-preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<string name="pref_cat_workarounds" maxLength="41">Workarounds</string>
<string name="pref_cat_plugins" maxLength="41">Plugins</string>
<string name="pref_cat_editing" maxLength="41">Editing</string>
<string name="pref_cat_layout" maxLength="41">Layout</string>

<!-- preferences.xml entries-->
<string name="whiteboard_stroke_width" maxLength="41">Stroke width</string>
Expand Down Expand Up @@ -179,6 +180,8 @@
<string name="accessibility" maxLength="41">Accessibility</string>
<!-- Paste clipboard image as png option -->
<string name="paste_as_png" maxLength="41">Paste clipboard images as PNG</string>
<string name="show_split_view" maxLength="41">Split view</string>
<string name="show_split_view_summ">Show side-by-side panes on large screens in the note editor, card browser, template editor, and deck picker</string>
<string name="exit_via_double_tap_back" maxLength="41">Press back twice to go back/exit</string>
<string name="exit_via_double_tap_back_summ">To avoid accidentally leaving the study screen or the app</string>
<!-- Allow all files in media imports -->
Expand Down
1 change: 1 addition & 0 deletions AnkiDroid/src/main/res/values/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<string name="pref_backup_limits_screen_key">backupLimitsScreen</string>
<!-- Editing -->
<string name="paste_png_key">pastePNG</string>
<string name="show_split_view_key">showSplitView</string>
<!-- Switch Profile -->
<string name="pref_switch_profile_screen_key">switchProfileScreen</string>
<string name="pref_enable_switch_profile_key">enableSwitchProfile</string>
Expand Down
7 changes: 7 additions & 0 deletions AnkiDroid/src/main/res/xml/preferences_appearance.xml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,13 @@
android:defaultValue="false"
android:title="@string/show_deck_title"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_cat_layout">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="@string/show_split_view_key"
android:summary="@string/show_split_view_summ"
android:title="@string/show_split_view" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/card_browser">
<SwitchPreferenceCompat
android:checked="false"
Expand Down
4 changes: 2 additions & 2 deletions AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class DeckPickerTest : RobolectricTest() {
companion object {
@ParameterizedRobolectricTestRunner.Parameters
@JvmStatic // required for initParameters
fun initParameters(): Collection<String> = listOf("normal", "xlarge")
fun initParameters(): Collection<String> = listOf("normal", "w1280dp")
}

@Before
Expand Down Expand Up @@ -537,7 +537,7 @@ class DeckPickerTest : RobolectricTest() {

@Test
fun checkDisplayOfStudyOptionsOnTablet() {
assumeTrue("We are running on a tablet", qualifiers!!.contains("xlarge"))
assumeTrue("We are running on a tablet", qualifiers!!.contains("w1280dp"))
val deckPickerEx =
super.startActivityNormallyOpenCollectionWithIntent(
DeckPickerEx::class.java,
Expand Down
4 changes: 2 additions & 2 deletions AnkiDroid/src/test/java/com/ichi2/testutils/ScreenSize.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import org.robolectric.RuntimeEnvironment
import timber.log.Timber

/** [block] runs with a runtime qualifier emulating a split-pane display */
fun withSplitPaneUi(block: () -> Unit) = withQualifier("sw700dp", block)
fun withSplitPaneUi(block: () -> Unit) = withQualifier("w840dp", block)

fun withQualifier(
newQualifier: String,
Expand All @@ -38,7 +38,7 @@ fun withQualifier(
}

/** [block] runs with a runtime qualifier emulating a split-pane display */
suspend fun withSplitPaneUiAsync(block: suspend () -> Unit) = withQualifierAsync("sw700dp", block)
suspend fun withSplitPaneUiAsync(block: suspend () -> Unit) = withQualifierAsync("w840dp", block)

suspend fun withQualifierAsync(
newQualifier: String,
Expand Down
Loading