diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 549089efd..83ad4fc1b 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -10,6 +10,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt
index 8e31d256a..d52d1bde1 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt
@@ -502,6 +502,10 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
)
}
+ var isReaderAutoscrollFabVisible: Boolean
+ get() = prefs.getBoolean(KEY_READER_AUTOSCROLL_FAB, true)
+ set(value) = prefs.edit { putBoolean(KEY_READER_AUTOSCROLL_FAB, value) }
+
val isPagesPreloadEnabled: Boolean
get() {
if (isBackgroundNetworkRestricted()) {
@@ -751,6 +755,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
const val KEY_TIPS_CLOSED = "tips_closed"
const val KEY_SSL_BYPASS = "ssl_bypass"
const val KEY_READER_AUTOSCROLL_SPEED = "as_speed"
+ const val KEY_READER_AUTOSCROLL_FAB = "as_fab"
const val KEY_MIRROR_SWITCHING = "mirror_switching"
const val KEY_PROXY = "proxy"
const val KEY_PROXY_TYPE = "proxy_type_2"
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt
index f0add4a24..4d39b7918 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt
@@ -7,6 +7,7 @@ import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.annotation.IdRes
import androidx.core.view.isEmpty
+import androidx.core.view.isVisible
import androidx.core.view.iterator
import androidx.core.view.size
import androidx.fragment.app.Fragment
@@ -89,25 +90,7 @@ class MainNavigationDelegate(
when (v.id) {
R.id.button_expand -> {
if (navBar is NavigationRailView) {
- if (navBar.isExpanded) {
- navBar.collapse()
- navRailHeader?.run {
- railFab.shrink()
- buttonExpand.setImageResource(R.drawable.ic_drawer_menu)
- buttonExpand.setContentDescriptionAndTooltip(R.string.expand)
- val horizontalPadding = navBar.itemActiveIndicatorMarginHorizontal
- root.setPadding(horizontalPadding, 0, horizontalPadding, 0)
- }
- } else {
- navBar.expand()
- navRailHeader?.run {
- railFab.extend()
- buttonExpand.setImageResource(R.drawable.ic_drawer_menu_open)
- buttonExpand.setContentDescriptionAndTooltip(R.string.collapse)
- val horizontalPadding = navBar.itemActiveIndicatorExpandedMarginHorizontal
- root.setPadding(horizontalPadding, 0, horizontalPadding, 0)
- }
- }
+ setNavbarIsExpanded(!navBar.isExpanded)
}
}
}
@@ -289,6 +272,10 @@ class MainNavigationDelegate(
},
)
}
+ navRailHeader?.buttonExpand?.isVisible = value
+ if (!value) {
+ setNavbarIsExpanded(false)
+ }
navBar.labelVisibilityMode = if (value) {
NavigationBarView.LABEL_VISIBILITY_LABELED
} else {
@@ -296,6 +283,31 @@ class MainNavigationDelegate(
}
}
+ private fun setNavbarIsExpanded(value: Boolean) {
+ if (navBar !is NavigationRailView) {
+ return
+ }
+ if (value) {
+ navBar.expand()
+ navRailHeader?.run {
+ railFab.extend()
+ buttonExpand.setImageResource(R.drawable.ic_drawer_menu_open)
+ buttonExpand.setContentDescriptionAndTooltip(R.string.collapse)
+ val horizontalPadding = navBar.itemActiveIndicatorExpandedMarginHorizontal
+ root.setPadding(horizontalPadding, 0, horizontalPadding, 0)
+ }
+ } else {
+ navBar.collapse()
+ navRailHeader?.run {
+ railFab.shrink()
+ buttonExpand.setImageResource(R.drawable.ic_drawer_menu)
+ buttonExpand.setContentDescriptionAndTooltip(R.string.expand)
+ val horizontalPadding = navBar.itemActiveIndicatorMarginHorizontal
+ root.setPadding(horizontalPadding, 0, horizontalPadding, 0)
+ }
+ }
+ }
+
fun interface OnFragmentChangedListener {
fun onFragmentChanged(fragment: Fragment, fromUser: Boolean)
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
index 9debc305d..237836472 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
@@ -72,7 +72,9 @@ class ReaderActivity :
ReaderControlDelegate.OnInteractionListener,
ReaderNavigationCallback,
IdlingDetector.Callback,
- ZoomControl.ZoomControlListener, View.OnClickListener, ScrollTimerControlView.OnVisibilityChangeListener {
+ ZoomControl.ZoomControlListener,
+ View.OnClickListener,
+ ScrollTimerControlView.OnVisibilityChangeListener {
@Inject
lateinit var settings: AppSettings
@@ -480,6 +482,7 @@ class ReaderActivity :
private fun updateScrollTimerButton() {
val button = viewBinding.buttonTimer ?: return
val isButtonVisible = scrollTimer.isActive.value
+ && settings.isReaderAutoscrollFabVisible
&& !viewBinding.appbarTop.isVisible
&& !viewBinding.timerControl.isVisible
if (button.isVisible != isButtonVisible) {
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ScrollTimerControlView.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ScrollTimerControlView.kt
index eefee8574..557dd958f 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ScrollTimerControlView.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ScrollTimerControlView.kt
@@ -6,6 +6,7 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.CompoundButton
import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
@@ -49,8 +50,10 @@ class ScrollTimerControlView @JvmOverloads constructor(
init {
binding.switchScrollTimer.setOnCheckedChangeListener(this)
binding.sliderTimer.addOnChangeListener(this)
+ binding.buttonFab.setOnClickListener(this)
binding.sliderTimer.setLabelFormatter(this)
binding.buttonClose.setOnClickListener(this)
+ binding.buttonFab.isGone = resources.getBoolean(R.bool.is_tablet)
setPadding(0, 0, 0, context.resources.getDimensionPixelOffset(R.dimen.margin_normal))
}
@@ -73,6 +76,13 @@ class ScrollTimerControlView @JvmOverloads constructor(
)
}
}
+ settings.observeAsStateFlow(
+ scope = lifecycleOwner.lifecycleScope + Dispatchers.Default,
+ key = AppSettings.KEY_READER_AUTOSCROLL_FAB,
+ valueProducer = { isReaderAutoscrollFabVisible },
+ ).observe(lifecycleOwner) {
+ binding.buttonFab.isChecked = it
+ }
updateDescription()
}
@@ -84,6 +94,7 @@ class ScrollTimerControlView @JvmOverloads constructor(
override fun onClick(v: View) {
when (v.id) {
R.id.button_close -> hide()
+ R.id.button_fab -> settings.isReaderAutoscrollFabVisible = !settings.isReaderAutoscrollFabVisible
}
}
diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml
index 96d72e9c5..a7483324d 100644
--- a/app/src/main/res/layout/activity_reader.xml
+++ b/app/src/main/res/layout/activity_reader.xml
@@ -19,8 +19,6 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
- android:contentDescription="@string/page_switch_timer"
- android:tooltipText="@string/page_switch_timer"
app:backgroundTint="@color/bg_floating_button"
app:icon="@drawable/ic_timelapse"
app:layout_insetEdge="bottom" />
diff --git a/app/src/main/res/layout/view_scroll_timer.xml b/app/src/main/res/layout/view_scroll_timer.xml
index 15786de47..78d220431 100644
--- a/app/src/main/res/layout/view_scroll_timer.xml
+++ b/app/src/main/res/layout/view_scroll_timer.xml
@@ -84,4 +84,22 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/slider_timer"
tools:text="@string/page_switch_timer" />
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b3fc92f14..e172e77c8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -873,4 +873,5 @@
Read on %s
Do not use RPC for adult content
Invalid token: %s
+ Show floating control button
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 76d64c64c..a0bdb353c 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -30,7 +30,7 @@ ksp = "2.1.21-2.0.1"
leakcanary = "3.0-alpha-8"
lifecycle = "2.9.1"
markwon = "4.6.2"
-material = "1.14.0-alpha02"
+material = "1.14.0-alpha03"
moshi = "1.15.2"
okhttp = "4.12.0"
okio = "3.12.0"