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"