فهرست منبع

Split general and reading mode sheet settings

arkon 4 سال پیش
والد
کامیت
64c47bbaed

+ 2 - 118
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderGeneralSettings.kt

@@ -3,22 +3,14 @@ package eu.kanade.tachiyomi.ui.reader.setting
 import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
-import android.widget.CompoundButton
-import android.widget.Spinner
-import androidx.annotation.ArrayRes
 import androidx.core.view.isVisible
 import androidx.core.widget.NestedScrollView
-import androidx.lifecycle.lifecycleScope
-import com.tfcporciuncula.flow.Preference
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
-import eu.kanade.tachiyomi.data.preference.asImmediateFlow
 import eu.kanade.tachiyomi.databinding.ReaderGeneralSettingsBinding
 import eu.kanade.tachiyomi.ui.reader.ReaderActivity
-import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
-import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
-import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
-import kotlinx.coroutines.flow.launchIn
+import eu.kanade.tachiyomi.util.preference.bindToIntPreference
+import eu.kanade.tachiyomi.util.preference.bindToPreference
 import uy.kohesive.injekt.injectLazy
 
 /**
@@ -35,29 +27,12 @@ class ReaderGeneralSettings @JvmOverloads constructor(context: Context, attrs: A
         addView(binding.root)
 
         initGeneralPreferences()
-
-        when ((context as ReaderActivity).viewer) {
-            is PagerViewer -> initPagerPreferences()
-            is WebtoonViewer -> initWebtoonPreferences()
-        }
     }
 
     /**
      * Init general reader preferences.
      */
     private fun initGeneralPreferences() {
-        binding.viewer.onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
-            (context as ReaderActivity).presenter.setMangaViewer(position)
-
-            val mangaViewer = (context as ReaderActivity).presenter.getMangaViewer()
-            if (mangaViewer == ReadingModeType.WEBTOON.prefValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.prefValue) {
-                initWebtoonPreferences()
-            } else {
-                initPagerPreferences()
-            }
-        }
-        binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.viewer ?: 0, false)
-
         binding.rotationMode.bindToPreference(preferences.rotation(), 1)
         binding.backgroundColor.bindToIntPreference(preferences.readerTheme(), R.array.reader_themes_values)
         binding.showPageNumber.bindToPreference(preferences.showPageNumber())
@@ -73,95 +48,4 @@ class ReaderGeneralSettings @JvmOverloads constructor(context: Context, attrs: A
             binding.cutoutShort.bindToPreference(preferences.cutoutShort())
         }
     }
-
-    /**
-     * Init the preferences for the pager reader.
-     */
-    private fun initPagerPreferences() {
-        binding.webtoonPrefsGroup.root.isVisible = false
-        binding.pagerPrefsGroup.root.isVisible = true
-
-        binding.pagerPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get()
-
-        binding.pagerPrefsGroup.tappingInverted.bindToPreference(preferences.pagerNavInverted())
-
-        binding.pagerPrefsGroup.pagerNav.bindToPreference(preferences.navigationModePager())
-        binding.pagerPrefsGroup.scaleType.bindToPreference(preferences.imageScaleType(), 1)
-        binding.pagerPrefsGroup.zoomStart.bindToPreference(preferences.zoomStart(), 1)
-        binding.pagerPrefsGroup.cropBorders.bindToPreference(preferences.cropBorders())
-
-        // Makes so that dual page invert gets hidden away when turning of dual page split
-        binding.dualPageSplit.bindToPreference(preferences.dualPageSplitPaged())
-        preferences.dualPageSplitPaged()
-            .asImmediateFlow { binding.dualPageInvert.isVisible = it }
-            .launchIn((context as ReaderActivity).lifecycleScope)
-        binding.dualPageInvert.bindToPreference(preferences.dualPageInvertPaged())
-    }
-
-    /**
-     * Init the preferences for the webtoon reader.
-     */
-    private fun initWebtoonPreferences() {
-        binding.pagerPrefsGroup.root.isVisible = false
-        binding.webtoonPrefsGroup.root.isVisible = true
-
-        binding.webtoonPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get()
-
-        binding.webtoonPrefsGroup.tappingInverted.bindToPreference(preferences.webtoonNavInverted())
-
-        binding.webtoonPrefsGroup.webtoonNav.bindToPreference(preferences.navigationModeWebtoon())
-        binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(preferences.cropBordersWebtoon())
-        binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
-
-        // Makes so that dual page invert gets hidden away when turning of dual page split
-        binding.dualPageSplit.bindToPreference(preferences.dualPageSplitWebtoon())
-        preferences.dualPageSplitWebtoon()
-            .asImmediateFlow { binding.dualPageInvert.isVisible = it }
-            .launchIn((context as ReaderActivity).lifecycleScope)
-        binding.dualPageInvert.bindToPreference(preferences.dualPageInvertWebtoon())
-    }
-
-    /**
-     * Binds a checkbox or switch view with a boolean preference.
-     */
-    private fun CompoundButton.bindToPreference(pref: Preference<Boolean>) {
-        isChecked = pref.get()
-        setOnCheckedChangeListener { _, isChecked -> pref.set(isChecked) }
-    }
-
-    /**
-     * Binds a spinner to an int preference with an optional offset for the value.
-     */
-    private fun Spinner.bindToPreference(pref: Preference<Int>, offset: Int = 0) {
-        onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
-            pref.set(position + offset)
-        }
-        setSelection(pref.get() - offset, false)
-    }
-
-    /**
-     * Binds a spinner to an enum preference.
-     */
-    private inline fun <reified T : Enum<T>> Spinner.bindToPreference(pref: Preference<T>) {
-        val enumConstants = T::class.java.enumConstants
-
-        onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
-            enumConstants?.get(position)?.let { pref.set(it) }
-        }
-
-        enumConstants?.indexOf(pref.get())?.let { setSelection(it, false) }
-    }
-
-    /**
-     * Binds a spinner to an int preference. The position of the spinner item must
-     * correlate with the [intValues] resource item (in arrays.xml), which is a <string-array>
-     * of int values that will be parsed here and applied to the preference.
-     */
-    private fun Spinner.bindToIntPreference(pref: Preference<Int>, @ArrayRes intValuesResource: Int) {
-        val intValues = resources.getStringArray(intValuesResource).map { it.toIntOrNull() }
-        onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
-            pref.set(intValues[position]!!)
-        }
-        setSelection(intValues.indexOf(pref.get()), false)
-    }
 }

+ 106 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderReadingModeSettings.kt

@@ -0,0 +1,106 @@
+package eu.kanade.tachiyomi.ui.reader.setting
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.core.view.isVisible
+import androidx.core.widget.NestedScrollView
+import androidx.lifecycle.lifecycleScope
+import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.data.preference.PreferencesHelper
+import eu.kanade.tachiyomi.data.preference.asImmediateFlow
+import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding
+import eu.kanade.tachiyomi.ui.reader.ReaderActivity
+import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
+import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
+import eu.kanade.tachiyomi.util.preference.bindToIntPreference
+import eu.kanade.tachiyomi.util.preference.bindToPreference
+import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
+import kotlinx.coroutines.flow.launchIn
+import uy.kohesive.injekt.injectLazy
+
+/**
+ * Sheet to show reader and viewer preferences.
+ */
+class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
+    NestedScrollView(context, attrs) {
+
+    private val preferences: PreferencesHelper by injectLazy()
+
+    private val binding = ReaderReadingModeSettingsBinding.inflate(LayoutInflater.from(context), this, false)
+
+    init {
+        addView(binding.root)
+
+        initGeneralPreferences()
+
+        when ((context as ReaderActivity).viewer) {
+            is PagerViewer -> initPagerPreferences()
+            is WebtoonViewer -> initWebtoonPreferences()
+        }
+    }
+
+    /**
+     * Init general reader preferences.
+     */
+    private fun initGeneralPreferences() {
+        binding.viewer.onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
+            (context as ReaderActivity).presenter.setMangaViewer(position)
+
+            val mangaViewer = (context as ReaderActivity).presenter.getMangaViewer()
+            if (mangaViewer == ReadingModeType.WEBTOON.prefValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.prefValue) {
+                initWebtoonPreferences()
+            } else {
+                initPagerPreferences()
+            }
+        }
+        binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.viewer ?: 0, false)
+    }
+
+    /**
+     * Init the preferences for the pager reader.
+     */
+    private fun initPagerPreferences() {
+        binding.webtoonPrefsGroup.root.isVisible = false
+        binding.pagerPrefsGroup.root.isVisible = true
+
+        binding.pagerPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get()
+
+        binding.pagerPrefsGroup.tappingInverted.bindToPreference(preferences.pagerNavInverted())
+
+        binding.pagerPrefsGroup.pagerNav.bindToPreference(preferences.navigationModePager())
+        binding.pagerPrefsGroup.scaleType.bindToPreference(preferences.imageScaleType(), 1)
+        binding.pagerPrefsGroup.zoomStart.bindToPreference(preferences.zoomStart(), 1)
+        binding.pagerPrefsGroup.cropBorders.bindToPreference(preferences.cropBorders())
+
+        // Makes so that dual page invert gets hidden away when turning of dual page split
+        binding.pagerPrefsGroup.dualPageSplit.bindToPreference(preferences.dualPageSplitPaged())
+        preferences.dualPageSplitPaged()
+            .asImmediateFlow { binding.pagerPrefsGroup.dualPageInvert.isVisible = it }
+            .launchIn((context as ReaderActivity).lifecycleScope)
+        binding.pagerPrefsGroup.dualPageInvert.bindToPreference(preferences.dualPageInvertPaged())
+    }
+
+    /**
+     * Init the preferences for the webtoon reader.
+     */
+    private fun initWebtoonPreferences() {
+        binding.pagerPrefsGroup.root.isVisible = false
+        binding.webtoonPrefsGroup.root.isVisible = true
+
+        binding.webtoonPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get()
+
+        binding.webtoonPrefsGroup.tappingInverted.bindToPreference(preferences.webtoonNavInverted())
+
+        binding.webtoonPrefsGroup.webtoonNav.bindToPreference(preferences.navigationModeWebtoon())
+        binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(preferences.cropBordersWebtoon())
+        binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
+
+        // Makes so that dual page invert gets hidden away when turning of dual page split
+        binding.webtoonPrefsGroup.dualPageSplit.bindToPreference(preferences.dualPageSplitWebtoon())
+        preferences.dualPageSplitWebtoon()
+            .asImmediateFlow { binding.webtoonPrefsGroup.dualPageInvert.isVisible = it }
+            .launchIn((context as ReaderActivity).lifecycleScope)
+        binding.webtoonPrefsGroup.dualPageInvert.bindToPreference(preferences.dualPageInvertWebtoon())
+    }
+}

+ 6 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderSettingsSheet.kt

@@ -8,16 +8,18 @@ import eu.kanade.tachiyomi.widget.sheet.TabbedBottomSheetDialog
 
 class ReaderSettingsSheet(private val activity: ReaderActivity) : TabbedBottomSheetDialog(activity) {
 
+    private val readingModeSettings = ReaderReadingModeSettings(activity)
     private val generalSettings = ReaderGeneralSettings(activity)
     private val colorFilterSettings = ReaderColorFilterSettings(activity)
 
     private val sheetBackgroundDim = window?.attributes?.dimAmount ?: 0.25f
 
     init {
+        val filterTabIndex = getTabViews().indexOf(colorFilterSettings)
         binding.tabs.addOnTabSelectedListener(object : SimpleTabSelectedListener() {
             // Remove dimmed backdrop so color filter changes can be previewed
             override fun onTabSelected(tab: TabLayout.Tab?) {
-                val isFilterTab = tab?.position == 1
+                val isFilterTab = tab?.position == filterTabIndex
                 window?.setDimAmount(if (isFilterTab) 0f else sheetBackgroundDim)
                 activity.setMenuVisibility(!isFilterTab)
             }
@@ -25,12 +27,14 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : TabbedBottomSh
     }
 
     override fun getTabViews() = listOf(
+        readingModeSettings,
         generalSettings,
         colorFilterSettings,
     )
 
     override fun getTabTitles() = listOf(
-        R.string.action_settings,
+        R.string.pref_category_reading_mode,
+        R.string.pref_category_general,
         R.string.custom_filter,
     )
 }

+ 51 - 0
app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceExtensions.kt

@@ -0,0 +1,51 @@
+package eu.kanade.tachiyomi.util.preference
+
+import android.widget.CompoundButton
+import android.widget.Spinner
+import androidx.annotation.ArrayRes
+import com.tfcporciuncula.flow.Preference
+import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
+
+/**
+ * Binds a checkbox or switch view with a boolean preference.
+ */
+fun CompoundButton.bindToPreference(pref: Preference<Boolean>) {
+    isChecked = pref.get()
+    setOnCheckedChangeListener { _, isChecked -> pref.set(isChecked) }
+}
+
+/**
+ * Binds a spinner to an int preference with an optional offset for the value.
+ */
+fun Spinner.bindToPreference(pref: Preference<Int>, offset: Int = 0) {
+    onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
+        pref.set(position + offset)
+    }
+    setSelection(pref.get() - offset, false)
+}
+
+/**
+ * Binds a spinner to an enum preference.
+ */
+inline fun <reified T : Enum<T>> Spinner.bindToPreference(pref: Preference<T>) {
+    val enumConstants = T::class.java.enumConstants
+
+    onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
+        enumConstants?.get(position)?.let { pref.set(it) }
+    }
+
+    enumConstants?.indexOf(pref.get())?.let { setSelection(it, false) }
+}
+
+/**
+ * Binds a spinner to an int preference. The position of the spinner item must
+ * correlate with the [intValues] resource item (in arrays.xml), which is a <string-array>
+ * of int values that will be parsed here and applied to the preference.
+ */
+fun Spinner.bindToIntPreference(pref: Preference<Int>, @ArrayRes intValuesResource: Int) {
+    val intValues = resources.getStringArray(intValuesResource).map { it.toIntOrNull() }
+    onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
+        pref.set(intValues[position]!!)
+    }
+    setSelection(intValues.indexOf(pref.get()), false)
+}

+ 7 - 7
app/src/main/res/layout/reader_color_filter_settings.xml

@@ -10,13 +10,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
-        <android.widget.Space
-            android:id="@+id/spinner_end"
-            android:layout_width="16dp"
-            android:layout_height="0dp"
-            app:layout_constraintStart_toEndOf="parent"
-            tools:ignore="MissingConstraints" />
-
         <!-- Color filter -->
 
         <com.google.android.material.switchmaterial.SwitchMaterial
@@ -244,6 +237,13 @@
             android:orientation="vertical"
             app:layout_constraintGuide_percent="0.5" />
 
+        <android.widget.Space
+            android:id="@+id/spinner_end"
+            android:layout_width="16dp"
+            android:layout_height="0dp"
+            app:layout_constraintStart_toEndOf="parent"
+            tools:ignore="MissingConstraints" />
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 </androidx.core.widget.NestedScrollView>

+ 150 - 239
app/src/main/res/layout/reader_general_settings.xml

@@ -5,246 +5,157 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:clipToPadding="false"
-    android:paddingStart="24dp"
-    android:paddingTop="0dp"
-    android:paddingEnd="24dp"
-    android:paddingBottom="24dp">
+    android:padding="16dp">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <!-- General display preferences -->
+
+        <TextView
+            android:id="@+id/general_prefs"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="32dp"
+            android:text="@string/pref_category_general"
+            android:textColor="?attr/colorAccent"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/viewer" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/page_transitions"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_page_transitions"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/general_prefs" />
+
+        <!-- General reading mode preferences -->
+
+        <TextView
+            android:id="@+id/display_prefs"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="24dp"
+            android:text="@string/pref_category_display"
+            android:textColor="?attr/colorAccent"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/page_transitions" />
+
+        <TextView
+            android:id="@+id/rotation_mode_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:text="@string/pref_rotation_type"
+            app:layout_constraintBaseline_toBaselineOf="@id/rotation_mode"
+            app:layout_constraintEnd_toStartOf="@id/verticalcenter"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatSpinner
+            android:id="@+id/rotation_mode"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:entries="@array/rotation_type"
+            app:layout_constraintEnd_toEndOf="@id/spinner_end"
+            app:layout_constraintStart_toEndOf="@id/verticalcenter"
+            app:layout_constraintTop_toBottomOf="@id/display_prefs" />
+
+        <TextView
+            android:id="@+id/background_color_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_reader_theme"
+            app:layout_constraintBaseline_toBaselineOf="@id/background_color"
+            app:layout_constraintEnd_toStartOf="@id/background_color"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatSpinner
+            android:id="@+id/background_color"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:entries="@array/reader_themes"
+            app:layout_constraintEnd_toEndOf="@id/spinner_end"
+            app:layout_constraintStart_toEndOf="@id/verticalcenter"
+            app:layout_constraintTop_toBottomOf="@id/rotation_mode" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/show_page_number"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="@string/pref_show_page_number"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/background_color" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/fullscreen"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_fullscreen"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/show_page_number" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/cutout_short"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_cutout_short"
+            android:textColor="?android:attr/textColorSecondary"
+            android:visibility="gone"
+            app:layout_constraintTop_toBottomOf="@id/fullscreen"
+            tools:visibility="visible" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/keepscreen"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_keep_screen_on"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/cutout_short" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/long_tap"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_read_with_long_tap"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/keepscreen" />
 
-        <androidx.constraintlayout.widget.ConstraintLayout
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/always_show_chapter_transition"
             android:layout_width="match_parent"
-            android:layout_height="match_parent">
-
-                <ImageView
-                    android:id="@id/pull_up_bar"
-                    android:layout_width="wrap_content"
-                    android:layout_height="24dp"
-                    android:alpha="0.5"
-                    android:scaleType="fitCenter"
-                    android:src="@drawable/ic_drag_pill_24dp"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:tint="?attr/colorOnBackground"
-                    tools:ignore="ContentDescription" />
-
-                <android.widget.Space
-                    android:id="@+id/spinner_end"
-                    android:layout_width="16dp"
-                    android:layout_height="0dp"
-                    app:layout_constraintStart_toEndOf="parent"
-                    tools:ignore="MissingConstraints" />
-
-                <!-- Series-specific preferences -->
-
-                <TextView
-                    android:id="@+id/series_prefs"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_category_for_this_series"
-                    android:textColor="?attr/colorAccent"
-                    android:textStyle="bold"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/pull_up_bar" />
-
-                <TextView
-                    android:id="@+id/viewer_text"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:text="@string/viewer"
-                    app:layout_constraintBaseline_toBaselineOf="@id/viewer"
-                    app:layout_constraintEnd_toStartOf="@id/verticalcenter"
-                    app:layout_constraintStart_toStartOf="parent" />
-
-                <androidx.appcompat.widget.AppCompatSpinner
-                    android:id="@+id/viewer"
-                    android:layout_width="0dp"
-                    android:layout_height="24dp"
-                    android:layout_marginTop="20dp"
-                    android:entries="@array/viewers_selector"
-                    app:layout_constraintEnd_toEndOf="@id/spinner_end"
-                    app:layout_constraintStart_toEndOf="@id/verticalcenter"
-                    app:layout_constraintTop_toBottomOf="@id/series_prefs" />
-
-                <!-- General display preferences -->
-
-                <TextView
-                    android:id="@+id/general_prefs"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="32dp"
-                    android:text="@string/pref_category_general"
-                    android:textColor="?attr/colorAccent"
-                    android:textStyle="bold"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/viewer" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/page_transitions"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_page_transitions"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/general_prefs" />
-
-                <!-- General reading mode preferences -->
-
-                <TextView
-                    android:id="@+id/display_prefs"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="24dp"
-                    android:text="@string/pref_category_display"
-                    android:textColor="?attr/colorAccent"
-                    android:textStyle="bold"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/page_transitions" />
-
-                <TextView
-                    android:id="@+id/rotation_mode_text"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="20dp"
-                    android:text="@string/pref_rotation_type"
-                    app:layout_constraintBaseline_toBaselineOf="@id/rotation_mode"
-                    app:layout_constraintEnd_toStartOf="@id/verticalcenter"
-                    app:layout_constraintStart_toStartOf="parent" />
-
-                <androidx.appcompat.widget.AppCompatSpinner
-                    android:id="@+id/rotation_mode"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="20dp"
-                    android:entries="@array/rotation_type"
-                    app:layout_constraintEnd_toEndOf="@id/spinner_end"
-                    app:layout_constraintStart_toEndOf="@id/verticalcenter"
-                    app:layout_constraintTop_toBottomOf="@id/display_prefs" />
-
-                <TextView
-                    android:id="@+id/background_color_text"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_reader_theme"
-                    app:layout_constraintBaseline_toBaselineOf="@id/background_color"
-                    app:layout_constraintEnd_toStartOf="@id/background_color"
-                    app:layout_constraintStart_toStartOf="parent" />
-
-                <androidx.appcompat.widget.AppCompatSpinner
-                    android:id="@+id/background_color"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="20dp"
-                    android:entries="@array/reader_themes"
-                    app:layout_constraintEnd_toEndOf="@id/spinner_end"
-                    app:layout_constraintStart_toEndOf="@id/verticalcenter"
-                    app:layout_constraintTop_toBottomOf="@id/rotation_mode" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/show_page_number"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="10dp"
-                    android:text="@string/pref_show_page_number"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/background_color" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/fullscreen"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_fullscreen"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/show_page_number" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/dual_page_split"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_dual_page_split"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/fullscreen" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/dual_page_invert"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_dual_page_invert"
-                    android:textColor="?android:attr/textColorSecondary"
-                    android:visibility="gone"
-                    app:layout_constraintTop_toBottomOf="@id/dual_page_split"
-                    tools:visibility="visible" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/cutout_short"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_cutout_short"
-                    android:textColor="?android:attr/textColorSecondary"
-                    android:visibility="gone"
-                    app:layout_constraintTop_toBottomOf="@id/dual_page_invert"
-                    tools:visibility="visible" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/keepscreen"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_keep_screen_on"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/cutout_short" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/long_tap"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_read_with_long_tap"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/keepscreen" />
-
-                <com.google.android.material.switchmaterial.SwitchMaterial
-                    android:id="@+id/always_show_chapter_transition"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/pref_always_show_chapter_transition"
-                    android:textColor="?android:attr/textColorSecondary"
-                    app:layout_constraintTop_toBottomOf="@id/long_tap" />
-
-                <android.widget.Space
-                    android:id="@+id/end_general_preferences"
-                    android:layout_width="0dp"
-                    android:layout_height="0dp"
-                    app:layout_constraintBottom_toBottomOf="@id/always_show_chapter_transition" />
-
-                <!-- Pager preferences -->
-
-                <include
-                    android:id="@+id/pager_prefs_group"
-                    layout="@layout/reader_pager_settings"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:visibility="gone"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/always_show_chapter_transition"
-                    tools:visibility="visible" />
-
-                <!-- Webtoon preferences -->
-
-                <include
-                    android:id="@+id/webtoon_prefs_group"
-                    layout="@layout/reader_webtoon_settings"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:visibility="gone"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/always_show_chapter_transition" />
-
-                <androidx.constraintlayout.widget.Guideline
-                    android:id="@+id/verticalcenter"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:orientation="vertical"
-                    app:layout_constraintGuide_percent="0.5" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
+            android:layout_height="wrap_content"
+            android:text="@string/pref_always_show_chapter_transition"
+            android:textColor="?android:attr/textColorSecondary"
+            app:layout_constraintTop_toBottomOf="@id/long_tap" />
+
+        <android.widget.Space
+            android:id="@+id/end_general_preferences"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="@id/always_show_chapter_transition"
+            tools:ignore="MissingConstraints" />
+
+        <android.widget.Space
+            android:id="@+id/spinner_end"
+            android:layout_width="16dp"
+            android:layout_height="0dp"
+            app:layout_constraintStart_toEndOf="parent"
+            tools:ignore="MissingConstraints" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/verticalcenter"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.5" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 </androidx.core.widget.NestedScrollView>

+ 44 - 26
app/src/main/res/layout/reader_pager_settings.xml

@@ -35,6 +35,26 @@
         app:layout_constraintStart_toEndOf="@id/verticalcenter"
         app:layout_constraintTop_toBottomOf="@id/pager_prefs" />
 
+    <TextView
+        android:id="@+id/tapping_inverted_text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:text="@string/pref_read_with_tapping_inverted"
+        app:layout_constraintBaseline_toBaselineOf="@id/tapping_inverted"
+        app:layout_constraintEnd_toStartOf="@id/verticalcenter"
+        app:layout_constraintStart_toStartOf="parent" />
+
+    <androidx.appcompat.widget.AppCompatSpinner
+        android:id="@+id/tapping_inverted"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:entries="@array/invert_tapping_mode"
+        app:layout_constraintEnd_toEndOf="@id/spinner_end"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintStart_toEndOf="@id/verticalcenter"
+        app:layout_constraintTop_toBottomOf="@+id/pager_nav" />
+
     <TextView
         android:id="@+id/scale_type_text"
         android:layout_width="0dp"
@@ -82,44 +102,42 @@
         android:textColor="?android:attr/textColorSecondary"
         app:layout_constraintTop_toBottomOf="@id/zoom_start" />
 
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/verticalcenter"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_percent="0.5" />
-
-    <TextView
-        android:id="@+id/tapping_inverted_text"
-        android:layout_width="0dp"
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/dual_page_split"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/pref_read_with_tapping_inverted"
-        app:layout_constraintBaseline_toBaselineOf="@id/tapping_inverted"
-        app:layout_constraintEnd_toStartOf="@id/verticalcenter"
-        app:layout_constraintStart_toStartOf="parent" />
+        android:text="@string/pref_dual_page_split"
+        android:textColor="?android:attr/textColorSecondary"
+        app:layout_constraintTop_toBottomOf="@id/crop_borders" />
 
-    <androidx.appcompat.widget.AppCompatSpinner
-        android:id="@+id/tapping_inverted"
-        android:layout_width="0dp"
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/dual_page_invert"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:entries="@array/invert_tapping_mode"
-        app:layout_constraintEnd_toEndOf="@id/spinner_end"
-        app:layout_constraintHorizontal_bias="0.0"
-        app:layout_constraintStart_toEndOf="@id/verticalcenter"
-        app:layout_constraintTop_toBottomOf="@+id/pager_nav" />
+        android:text="@string/pref_dual_page_invert"
+        android:textColor="?android:attr/textColorSecondary"
+        android:visibility="gone"
+        app:layout_constraintTop_toBottomOf="@id/dual_page_split"
+        tools:visibility="visible" />
 
     <androidx.constraintlayout.widget.Group
         android:id="@+id/tapping_prefs_group"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        app:constraint_referenced_ids="pager_nav_text,pager_nav,tapping_inverted_text,tapping_inverted"
-        tools:layout_editor_absoluteX="24dp" />
+        app:constraint_referenced_ids="pager_nav_text,pager_nav,tapping_inverted_text,tapping_inverted,dual_page_split,dual_page_invert" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/verticalcenter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_percent="0.5" />
 
     <android.widget.Space
         android:id="@+id/spinner_end"
         android:layout_width="16dp"
         android:layout_height="0dp"
-        app:layout_constraintStart_toEndOf="parent" />
+        app:layout_constraintStart_toEndOf="parent"
+        tools:ignore="MissingConstraints" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 86 - 0
app/src/main/res/layout/reader_reading_mode_settings.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clipToPadding="false"
+    android:padding="16dp">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <android.widget.Space
+            android:id="@+id/spinner_end"
+            android:layout_width="16dp"
+            android:layout_height="0dp"
+            app:layout_constraintStart_toEndOf="parent"
+            tools:ignore="MissingConstraints" />
+
+        <!-- Series-specific preferences -->
+
+        <TextView
+            android:id="@+id/series_prefs"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/pref_category_for_this_series"
+            android:textColor="?attr/colorAccent"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/viewer_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/viewer"
+            app:layout_constraintBaseline_toBaselineOf="@id/viewer"
+            app:layout_constraintEnd_toStartOf="@id/verticalcenter"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatSpinner
+            android:id="@+id/viewer"
+            android:layout_width="0dp"
+            android:layout_height="24dp"
+            android:layout_marginTop="20dp"
+            android:entries="@array/viewers_selector"
+            app:layout_constraintEnd_toEndOf="@id/spinner_end"
+            app:layout_constraintStart_toEndOf="@id/verticalcenter"
+            app:layout_constraintTop_toBottomOf="@id/series_prefs" />
+
+        <!-- Pager preferences -->
+
+        <include
+            android:id="@+id/pager_prefs_group"
+            layout="@layout/reader_pager_settings"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/viewer"
+            tools:visibility="visible" />
+
+        <!-- Webtoon preferences -->
+
+        <include
+            android:id="@+id/webtoon_prefs_group"
+            layout="@layout/reader_webtoon_settings"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/viewer" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/verticalcenter"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.5" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.core.widget.NestedScrollView>

+ 54 - 36
app/src/main/res/layout/reader_webtoon_settings.xml

@@ -16,25 +16,6 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-    <TextView
-        android:id="@+id/webtoon_side_padding_text"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:text="@string/pref_webtoon_side_padding"
-        app:layout_constraintBaseline_toBaselineOf="@id/webtoon_side_padding"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toLeftOf="@id/verticalcenter" />
-
-    <androidx.appcompat.widget.AppCompatSpinner
-        android:id="@+id/webtoon_side_padding"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:entries="@array/webtoon_side_padding"
-        app:layout_constraintLeft_toRightOf="@id/verticalcenter"
-        app:layout_constraintRight_toRightOf="@id/spinner_end"
-        app:layout_constraintTop_toBottomOf="@+id/tapping_inverted" />
-
     <TextView
         android:id="@+id/webtoon_nav_text"
         android:layout_width="0dp"
@@ -55,15 +36,6 @@
         app:layout_constraintStart_toEndOf="@id/verticalcenter"
         app:layout_constraintTop_toBottomOf="@+id/webtoon_prefs" />
 
-    <com.google.android.material.switchmaterial.SwitchMaterial
-        android:id="@+id/crop_borders_webtoon"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dp"
-        android:text="@string/pref_crop_borders"
-        android:textColor="?android:attr/textColorSecondary"
-        app:layout_constraintTop_toBottomOf="@+id/webtoon_side_padding" />
-
     <TextView
         android:id="@+id/tapping_inverted_text"
         android:layout_width="0dp"
@@ -84,24 +56,70 @@
         app:layout_constraintStart_toEndOf="@id/verticalcenter"
         app:layout_constraintTop_toBottomOf="@+id/webtoon_nav" />
 
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/verticalcenter"
-        android:layout_width="wrap_content"
+    <TextView
+        android:id="@+id/webtoon_side_padding_text"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_percent="0.5" />
+        android:text="@string/pref_webtoon_side_padding"
+        app:layout_constraintBaseline_toBaselineOf="@id/webtoon_side_padding"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toLeftOf="@id/verticalcenter" />
+
+    <androidx.appcompat.widget.AppCompatSpinner
+        android:id="@+id/webtoon_side_padding"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:entries="@array/webtoon_side_padding"
+        app:layout_constraintLeft_toRightOf="@id/verticalcenter"
+        app:layout_constraintRight_toRightOf="@id/spinner_end"
+        app:layout_constraintTop_toBottomOf="@+id/tapping_inverted" />
+
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/crop_borders_webtoon"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:text="@string/pref_crop_borders"
+        android:textColor="?android:attr/textColorSecondary"
+        app:layout_constraintTop_toBottomOf="@+id/webtoon_side_padding" />
+
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/dual_page_split"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/pref_dual_page_split"
+        android:textColor="?android:attr/textColorSecondary"
+        app:layout_constraintTop_toBottomOf="@id/crop_borders_webtoon" />
+
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/dual_page_invert"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/pref_dual_page_invert"
+        android:textColor="?android:attr/textColorSecondary"
+        android:visibility="gone"
+        app:layout_constraintTop_toBottomOf="@id/dual_page_split"
+        tools:visibility="visible" />
 
     <androidx.constraintlayout.widget.Group
         android:id="@+id/tapping_prefs_group"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        app:constraint_referenced_ids="webtoon_nav_text,webtoon_nav,tapping_inverted_text,tapping_inverted"
-        tools:layout_editor_absoluteX="24dp" />
+        app:constraint_referenced_ids="webtoon_nav_text,webtoon_nav,tapping_inverted_text,tapping_inverted,dual_page_split,dual_page_invert" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/verticalcenter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_percent="0.5" />
 
     <android.widget.Space
         android:id="@+id/spinner_end"
         android:layout_width="16dp"
         android:layout_height="0dp"
-        app:layout_constraintStart_toEndOf="parent" />
+        app:layout_constraintStart_toEndOf="parent"
+        tools:ignore="MissingConstraints" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 2
app/src/main/res/layout/source_filter_sheet.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical">
@@ -15,7 +16,7 @@
         android:paddingEnd="?attr/listPreferredItemPaddingEnd">
 
         <ImageView
-            android:id="@id/pull_up_bar"
+            android:id="@+id/pull_up_bar"
             android:layout_width="wrap_content"
             android:layout_height="24dp"
             android:alpha="0.5"
@@ -24,7 +25,8 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
-            app:tint="?attr/colorOnSurface" />
+            app:tint="?attr/colorOnSurface"
+            tools:ignore="ContentDescription" />
 
         <Button
             android:id="@+id/reset_btn"

+ 1 - 3
app/src/main/res/layout/source_list_item.xml

@@ -7,9 +7,7 @@
     android:layout_gravity="center_vertical"
     android:background="@drawable/list_item_selector_background"
     android:paddingStart="8dp"
-    android:paddingEnd="8dp"
-    tools:layout_editor_absoluteX="0dp"
-    tools:layout_editor_absoluteY="25dp">
+    android:paddingEnd="8dp">
 
     <ImageView
         android:id="@+id/thumbnail"