Updates to rotation options

Taken from upstream:
Forced orientation are now locked
Free-ish modes is now Portrait/Landscape instead of lock
Rotation button in bottom sheet toolbar (default off)
Popup menu helper method

Also because it's getting crowded, updated layouts of the buttons in the sheet to compress themselves a bit if people go crazy (though display options will always be full width)

Co-Authored-By: arkon <4098258+arkon@users.noreply.github.com>
This commit is contained in:
Jays2Kings 2021-04-26 00:38:12 -04:00
parent fdc976d4f9
commit 820d240997
13 changed files with 236 additions and 85 deletions

View File

@ -111,6 +111,10 @@ object Migrations {
}
}
}
if (oldVersion < 73) {
// Reset rotation to Free after replacing Lock
preferences.rotation().set(1)
}
return true
}
return false

View File

@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.content.ClipData
import android.content.Context
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.ColorStateList
import android.content.res.Configuration
import android.graphics.Bitmap
@ -56,6 +55,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderPresenter.SetAsCoverResult.Success
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
import eu.kanade.tachiyomi.ui.reader.settings.OrientationType
import eu.kanade.tachiyomi.ui.reader.settings.ReadingModeType
import eu.kanade.tachiyomi.ui.reader.settings.TabbedReaderSettingsSheet
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
@ -93,6 +93,7 @@ import eu.kanade.tachiyomi.util.view.hide
import eu.kanade.tachiyomi.util.view.invisible
import eu.kanade.tachiyomi.util.view.isCollapsed
import eu.kanade.tachiyomi.util.view.isExpanded
import eu.kanade.tachiyomi.util.view.popupMenu
import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.util.view.updateLayoutParams
import eu.kanade.tachiyomi.util.view.updatePaddingRelative
@ -225,6 +226,7 @@ class ReaderActivity :
ViewChapters("vc", R.string.view_chapters),
WebView("wb", R.string.open_in_webview),
ReadingMode("rm", R.string.reading_mode),
Rotation("rot", R.string.rotation),
CropBordersPaged("cbp", R.string.crop_borders_paged),
CropBordersWebtoon("cbw", R.string.crop_borders_webtoon),
PageLayout("pl", R.string.page_layout),
@ -405,6 +407,11 @@ class ReaderActivity :
)
}
private fun updateRotationShortcut(preference: Int) {
val orientation = OrientationType.fromPreference(preference)
binding.chaptersSheet.rotationSheetButton.setImageResource(orientation.iconRes)
}
private fun updateCropBordersShortcut() {
val isPagerType = viewer is PagerViewer || (viewer as? WebtoonViewer)?.hasMargins == true
val enabled = if (isPagerType) {
@ -434,22 +441,25 @@ class ReaderActivity :
}
private fun updateBottomShortcuts() {
val enabledButtons = preferences.readerBottomButtons().get()
with(binding.chaptersSheet) {
readingMode.isVisible =
presenter?.manga?.isLongStrip() != true &&
BottomButton.ReadingMode.value in preferences.readerBottomButtons().get()
BottomButton.ReadingMode.value in enabledButtons
rotationSheetButton.isVisible =
BottomButton.Rotation.value in enabledButtons
doublePage.isVisible = viewer is PagerViewer &&
BottomButton.PageLayout.value in preferences.readerBottomButtons().get()
BottomButton.PageLayout.value in enabledButtons
cropBordersSheetButton.isVisible =
if (viewer is PagerViewer) {
BottomButton.CropBordersPaged.value in preferences.readerBottomButtons().get()
BottomButton.CropBordersPaged.value in enabledButtons
} else {
BottomButton.CropBordersWebtoon.value in preferences.readerBottomButtons().get()
BottomButton.CropBordersWebtoon.value in enabledButtons
}
webviewButton.isVisible =
BottomButton.WebView.value in preferences.readerBottomButtons().get()
BottomButton.WebView.value in enabledButtons
chaptersButton.isVisible =
BottomButton.ViewChapters.value in preferences.readerBottomButtons().get()
BottomButton.ViewChapters.value in enabledButtons
shiftPageButton.isVisible =
((viewer as? PagerViewer)?.config?.doublePages ?: false) && canShowSplitAtBottom()
binding.toolbar.menu.findItem(R.id.action_shift_double_page)?.isVisible =
@ -613,6 +623,22 @@ class ReaderActivity :
pref.toggle()
}
with(rotationSheetButton) {
compatToolTipText = getString(R.string.rotation)
setOnClickListener {
popupMenu(
items = OrientationType.values().map { it.prefValue to it.stringRes },
selectedItemId = preferences.rotation().get(),
) {
val newOrientation = OrientationType.fromPreference(itemId)
preferences.rotation().set(newOrientation.prefValue)
setOrientation(newOrientation.flag)
}
}
}
webviewButton.setOnClickListener {
openMangaInBrowser()
}
@ -667,6 +693,7 @@ class ReaderActivity :
.onEach { updateCropBordersShortcut() }
.launchIn(scope)
}
preferences.rotation().asImmediateFlowIn(scope) { updateRotationShortcut(it) }
binding.chaptersSheet.shiftPageButton.setOnClickListener {
shiftDoublePages()
@ -1412,6 +1439,16 @@ class ReaderActivity :
startActivity(intent)
}
/**
* Forces the user preferred [orientation] on the activity.
*/
private fun setOrientation(orientation: Int) {
val newOrientation = OrientationType.fromPreference(orientation)
if (newOrientation.flag != requestedOrientation) {
requestedOrientation = newOrientation.flag
}
}
/**
* Class that handles the user preferences of the reader.
*/
@ -1461,33 +1498,6 @@ class ReaderActivity :
}
}
/**
* Forces the user preferred [orientation] on the activity.
*/
private fun setOrientation(orientation: Int) {
val newOrientation = when (orientation) {
// Lock in current orientation
2 -> {
val currentOrientation = resources.configuration.orientation
if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
} else {
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
}
}
// Lock in portrait
3 -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
// Lock in landscape
4 -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
// Rotation free
else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
if (newOrientation != requestedOrientation) {
requestedOrientation = newOrientation
}
}
/**
* Sets the visibility of the bottom page indicator according to [visible].
*/

View File

@ -0,0 +1,20 @@
package eu.kanade.tachiyomi.ui.reader.settings
import android.content.pm.ActivityInfo
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import eu.kanade.tachiyomi.R
enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) {
FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.free, R.drawable.ic_screen_rotation_24dp),
PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.portrait, R.drawable.ic_stay_current_portrait_24dp),
LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.landscape, R.drawable.ic_stay_current_landscape_24dp),
LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.locked_portrait, R.drawable.ic_screen_lock_portrait_24dp),
LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.locked_landscape, R.drawable.ic_screen_lock_landscape_24dp),
;
companion object {
fun fromPreference(preference: Int): OrientationType =
values().find { it.prefValue == preference } ?: FREE
}
}

View File

@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.reader.settings.OrientationType
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PageLayout
import eu.kanade.tachiyomi.util.lang.addBetaTag
@ -93,13 +94,9 @@ class SettingsReaderController : SettingsController() {
intListPreference(activity) {
key = Keys.rotation
titleRes = R.string.rotation
entriesRes = arrayOf(
R.string.free,
R.string.lock,
R.string.force_portrait,
R.string.force_landscape
)
entryRange = 1..4
val enumConstants = OrientationType::class.java.enumConstants
entriesRes = enumConstants?.map { it.stringRes }.orEmpty().toTypedArray()
entryRange = 1..(enumConstants?.size ?: 5)
defaultValue = 1
}
intListPreference(activity) {

View File

@ -8,6 +8,8 @@ import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.Point
import android.os.Build
import android.view.Gravity
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
@ -19,8 +21,11 @@ import androidx.annotation.ColorRes
import androidx.annotation.IdRes
import androidx.annotation.Px
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils
import androidx.core.view.ViewCompat
import androidx.core.view.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
@ -33,6 +38,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.button.MaterialButton
import com.google.android.material.snackbar.Snackbar
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.lang.tintText
import eu.kanade.tachiyomi.util.system.ThemeUtil
import eu.kanade.tachiyomi.util.system.contextCompatColor
import eu.kanade.tachiyomi.util.system.getPrefTheme
@ -363,3 +369,44 @@ var View.compatToolTipText: CharSequence?
set(value) {
ViewCompat.setTooltipText(this, value)
}
@SuppressLint("RestrictedApi")
inline fun View.popupMenu(
items: List<Pair<Int, Int>>,
selectedItemId: Int? = null,
noinline onMenuItemClick: MenuItem.() -> Unit
): PopupMenu {
val popup = PopupMenu(context, this, Gravity.NO_GRAVITY)
items.forEach { (id, stringRes) ->
popup.menu.add(0, id, 0, stringRes)
}
if (selectedItemId != null) {
val blendedAccent = ColorUtils.blendARGB(
context.getResourceColor(android.R.attr.colorAccent),
context.getResourceColor(android.R.attr.textColorPrimary),
0.5f
)
(popup.menu as? MenuBuilder)?.setOptionalIconsVisible(true)
val emptyIcon = ContextCompat.getDrawable(context, R.drawable.ic_blank_24dp)
popup.menu.forEach { item ->
item.icon = when (item.itemId) {
selectedItemId -> ContextCompat.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
setTint(blendedAccent)
}
else -> emptyIcon
}
if (item.itemId == selectedItemId) {
item.title = item.title?.tintText(blendedAccent)
}
}
}
popup.setOnMenuItemClickListener {
it.onMenuItemClick()
true
}
popup.show()
return popup
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/black"
android:pathData="M21,5L3,5c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,7c0,-1.1 -0.9,-2 -2,-2zM19,17L5,17L5,7h14v10zM10,16h4c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1v-1c0,-1.11 -0.9,-2 -2,-2 -1.11,0 -2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1zM10.8,10c0,-0.66 0.54,-1.2 1.2,-1.2 0.66,0 1.2,0.54 1.2,1.2v1h-2.4v-1z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/black"
android:pathData="M10,16h4c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1v-1c0,-1.11 -0.9,-2 -2,-2 -1.11,0 -2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1zM10.8,10c0,-0.66 0.54,-1.2 1.2,-1.2 0.66,0 1.2,0.54 1.2,1.2v1h-2.4v-1zM17,1L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/black"
android:pathData="M16.48,2.52c3.27,1.55 5.61,4.72 5.97,8.48h1.5C23.44,4.84 18.29,0 12,0l-0.66,0.03 3.81,3.81 1.33,-1.32zM10.23,1.75c-0.59,-0.59 -1.54,-0.59 -2.12,0L1.75,8.11c-0.59,0.59 -0.59,1.54 0,2.12l12.02,12.02c0.59,0.59 1.54,0.59 2.12,0l6.36,-6.36c0.59,-0.59 0.59,-1.54 0,-2.12L10.23,1.75zM14.83,21.19L2.81,9.17l6.36,-6.36 12.02,12.02 -6.36,6.36zM7.52,21.48C4.25,19.94 1.91,16.76 1.55,13L0.05,13C0.56,19.16 5.71,24 12,24l0.66,-0.03 -3.81,-3.81 -1.33,1.32z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/black"
android:pathData="M1.01,7L1,17c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V7c0,-1.1 -0.9,-2 -2,-2H3c-1.1,0 -1.99,0.9 -1.99,2zM19,7v10H5V7h14z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/black"
android:pathData="M17,1.01L7,1c-1.1,0 -1.99,0.9 -1.99,2v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z" />
</vector>

View File

@ -25,109 +25,134 @@
android:alpha="0.25"
android:contentDescription="@string/drag_handle"
android:src="@drawable/draggable_pill"
app:tint="?actionBarTintColor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:tint="?actionBarTintColor" />
<ImageButton
android:id="@+id/chapters_button"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintWidth_max="wrap"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/next_title"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
android:tooltipText="@string/view_chapters"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/webview_button"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_format_list_numbered_24dp" />
app:srcCompat="@drawable/ic_format_list_numbered_24dp"
app:tint="?actionBarTintColor" />
<ImageButton
android:id="@+id/webview_button"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/open_in_webview"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
android:tooltipText="@string/open_in_webview"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/chapters_button"
app:layout_constraintEnd_toStartOf="@id/reading_mode"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/chapters_button"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_open_in_webview_24dp" />
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/ic_open_in_webview_24dp"
app:tint="?actionBarTintColor" />
<ImageButton
android:id="@+id/reading_mode"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/reading_mode"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
android:tooltipText="@string/reading_mode"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/rotation_sheet_button"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/webview_button"
app:layout_constraintEnd_toStartOf="@id/crop_borders_sheet_button"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_reader_default_24dp" />
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/ic_reader_default_24dp"
app:tint="?actionBarTintColor" />
<ImageButton
android:id="@+id/crop_borders_sheet_button"
android:layout_width="wrap_content"
android:id="@+id/rotation_sheet_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/open_in_webview"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
android:tooltipText="@string/crop_borders"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintBottom_toBottomOf="parent"
android:tooltipText="@string/rotation"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/crop_borders_sheet_button"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/reading_mode"
app:layout_constraintEnd_toStartOf="@id/double_page"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible"
app:srcCompat="@drawable/anim_crop_to_free" />
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/ic_screen_rotation_24dp"
app:tint="?actionBarTintColor"
tools:visibility="visible" />
<ImageButton
android:id="@+id/crop_borders_sheet_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/crop_borders"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
android:tooltipText="@string/crop_borders"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/double_page"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/rotation_sheet_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/anim_crop_to_free"
app:tint="?actionBarTintColor"
tools:visibility="visible" />
<ImageButton
android:id="@+id/double_page"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/next_title"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
app:layout_constraintHorizontal_chainStyle="spread"
android:tooltipText="@string/double_pages"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/shift_page_button"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/crop_borders_sheet_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/shift_page_button"
app:srcCompat="@drawable/ic_book_open_variant_24dp" />
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/ic_book_open_variant_24dp"
app:tint="?actionBarTintColor" />
<ImageButton
android:id="@+id/shift_page_button"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/next_title"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
android:visibility="gone"
app:layout_constraintHorizontal_chainStyle="spread"
android:tooltipText="@string/shift_one_page_over"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/display_options"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/double_page"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/display_options"
app:layout_constraintWidth_max="wrap"
app:srcCompat="@drawable/ic_page_next_outline_24dp"
app:tint="?actionBarTintColor"
tools:visibility="visible" />
<ImageButton
@ -137,14 +162,14 @@
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/next_title"
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
app:tint="?actionBarTintColor"
app:layout_constraintHorizontal_chainStyle="spread"
android:tooltipText="@string/display_options"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toEndOf="@id/shift_page_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_tune_24dp" />
app:srcCompat="@drawable/ic_tune_24dp"
app:tint="?actionBarTintColor" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView

View File

@ -79,9 +79,10 @@
<string-array name="rotation_type">
<item>@string/free</item>
<item>@string/lock</item>
<item>@string/force_portrait</item>
<item>@string/force_landscape</item>
<item>@string/portrait</item>
<item>@string/landscape</item>
<item>@string/locked_portrait</item>
<item>@string/locked_landscape</item>
</string-array>
<string-array name="color_filter_modes">

View File

@ -393,8 +393,10 @@
<string name="single_page">Single page</string>
<string name="switch_to_double">Switch to double pages</string>
<string name="switch_to_single">Switch to single page</string>
<string name="force_portrait">Force portrait</string>
<string name="force_landscape">Force landscape</string>
<string name="portrait">Portrait</string>
<string name="landscape">Landscape</string>
<string name="locked_portrait">Locked portrait</string>
<string name="locked_landscape">Locked landscape</string>
<string name="red_initial">R</string>
<string name="green_initial">G</string>
<string name="blue_initial">B</string>