From 15ee102db4505d123984653fc48b20c902b4ac01 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 19 Mar 2022 08:23:40 +0200 Subject: [PATCH 1/4] Adjust ui to m3 style --- .../koitharu/kotatsu/base/ui/BaseActivity.kt | 41 ++---- .../koitharu/kotatsu/base/ui/BaseFragment.kt | 33 +---- .../kotatsu/base/ui/BasePreferenceFragment.kt | 39 ++++-- .../kotatsu/base/ui/util/RecyclerViewOwner.kt | 8 ++ .../base/ui/util/WindowInsetsDelegate.kt | 69 ++++++++++ .../base/ui/widgets/ListItemTextView.kt | 120 ++++++++++++++++++ .../kotatsu/core/prefs/AppSettings.kt | 4 - .../kotatsu/details/ui/ChaptersFragment.kt | 1 - .../ui/categories/CategoriesActivity.kt | 11 -- .../list/ui/filter/FilterAdapterDelegates.kt | 11 +- .../kotatsu/reader/ui/ReaderActivity.kt | 12 +- .../kotatsu/settings/MainSettingsFragment.kt | 3 - .../kotatsu/settings/SettingsActivity.kt | 28 ++-- .../settings/SourceSettingsFragment.kt | 4 +- .../sources/SourcesSettingsFragment.kt | 12 +- .../sources/SourcesSettingsViewModel.kt | 10 +- .../adapter/SourceConfigAdapterDelegates.kt | 3 +- .../sources/model/SourceConfigItem.kt | 3 + .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 11 +- .../res/color/list_item_background_color.xml | 5 + .../main/res/color/list_item_text_color.xml | 6 + app/src/main/res/drawable/ic_check.xml | 11 ++ app/src/main/res/drawable/ic_expand_less.xml | 12 +- app/src/main/res/drawable/ic_expand_more.xml | 16 +-- .../res/layout-w600dp/activity_settings.xml | 18 ++- .../res/layout-w720dp-land/activity_main.xml | 6 +- .../res/layout-w720dp/activity_details.xml | 14 +- .../main/res/layout/activity_categories.xml | 18 ++- .../main/res/layout/activity_downloads.xml | 20 ++- app/src/main/res/layout/activity_main.xml | 10 +- app/src/main/res/layout/activity_search.xml | 1 + .../res/layout/activity_search_global.xml | 2 +- app/src/main/res/layout/activity_settings.xml | 23 +++- .../res/layout/activity_settings_simple.xml | 16 ++- app/src/main/res/layout/item_chapter.xml | 13 +- .../main/res/layout/item_checkable_new.xml | 13 ++ app/src/main/res/layout/item_expandable.xml | 2 +- .../main/res/layout/item_filter_header.xml | 17 +-- .../layout/item_source_config_draggable.xml | 36 ++++-- app/src/main/res/layout/sheet_filter.xml | 3 +- app/src/main/res/values/attrs.xml | 14 ++ app/src/main/res/values/dimens.xml | 3 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 17 +++ app/src/main/res/values/themes.xml | 1 + app/src/main/res/xml/pref_main.xml | 6 - 46 files changed, 517 insertions(+), 210 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt create mode 100644 app/src/main/res/color/list_item_background_color.xml create mode 100644 app/src/main/res/color/list_item_text_color.xml create mode 100644 app/src/main/res/drawable/ic_check.xml create mode 100644 app/src/main/res/layout/item_checkable_new.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index a6fc2c466..88c6ca809 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -12,18 +12,20 @@ import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.ActionBarContextView import androidx.appcompat.widget.Toolbar import androidx.core.app.ActivityCompat -import androidx.core.graphics.Insets -import androidx.core.view.* +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams import androidx.viewbinding.ViewBinding -import com.google.android.material.appbar.AppBarLayout -import com.google.android.material.appbar.AppBarLayout.LayoutParams.* import org.koin.android.ext.android.get import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.prefs.AppSettings -abstract class BaseActivity : AppCompatActivity(), OnApplyWindowInsetsListener { +abstract class BaseActivity : AppCompatActivity(), + WindowInsetsDelegate.WindowInsetsListener { protected lateinit var binding: B private set @@ -31,7 +33,8 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo @Suppress("LeakingThis") protected val exceptionResolver = ExceptionResolver(this) - private var lastInsets: Insets? = null + @Suppress("LeakingThis") + protected val insetsDelegate = WindowInsetsDelegate(this) override fun onCreate(savedInstanceState: Bundle?) { val settings = get() @@ -41,6 +44,7 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo } super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) + insetsDelegate.handleImeInsets = true } @Deprecated("Use ViewBinding", level = DeprecationLevel.ERROR) @@ -60,28 +64,7 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo super.setContentView(binding.root) val toolbar = (binding.root.findViewById(R.id.toolbar) as? Toolbar) toolbar?.let(this::setSupportActionBar) - ViewCompat.setOnApplyWindowInsetsListener(binding.root, this) - - val toolbarParams = (binding.root.findViewById(R.id.toolbar_card) ?: toolbar) - ?.layoutParams as? AppBarLayout.LayoutParams - if (toolbarParams != null) { - if (get().isToolbarHideWhenScrolling) { - toolbarParams.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_SNAP - } else { - toolbarParams.scrollFlags = SCROLL_FLAG_NO_SCROLL - } - } - } - - override fun onApplyWindowInsets(v: View, insets: WindowInsetsCompat): WindowInsetsCompat { - val baseInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) - val newInsets = Insets.max(baseInsets, imeInsets) - if (newInsets != lastInsets) { - onWindowInsetsChanged(newInsets) - lastInsets = newInsets - } - return insets + insetsDelegate.onViewCreated(binding.root) } override fun onOptionsItemSelected(item: MenuItem) = if (item.itemId == android.R.id.home) { @@ -97,8 +80,6 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo return super.onKeyDown(keyCode, event) } - protected abstract fun onWindowInsetsChanged(insets: Insets) - private fun setupToolbar() { (findViewById(R.id.toolbar) as? Toolbar)?.let(this::setSupportActionBar) } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt index 68b1ffe42..50eeb61ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt @@ -4,16 +4,13 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.graphics.Insets -import androidx.core.view.OnApplyWindowInsetsListener -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.doOnNextLayout import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding +import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver -abstract class BaseFragment : Fragment(), OnApplyWindowInsetsListener { +abstract class BaseFragment : Fragment(), + WindowInsetsDelegate.WindowInsetsListener { private var viewBinding: B? = null @@ -23,7 +20,8 @@ abstract class BaseFragment : Fragment(), OnApplyWindowInsetsLi @Suppress("LeakingThis") protected val exceptionResolver = ExceptionResolver(this) - private var lastInsets: Insets? = null + @Suppress("LeakingThis") + protected val insetsDelegate = WindowInsetsDelegate(this) override fun onCreateView( inflater: LayoutInflater, @@ -37,33 +35,16 @@ abstract class BaseFragment : Fragment(), OnApplyWindowInsetsLi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - ViewCompat.setOnApplyWindowInsetsListener(view, this) - view.doOnNextLayout { - // Listener may not be called - if (lastInsets == null) { - onWindowInsetsChanged(Insets.NONE) - } - } + insetsDelegate.onViewCreated(view) } override fun onDestroyView() { viewBinding = null - lastInsets = null + insetsDelegate.onDestroyView() super.onDestroyView() } - override fun onApplyWindowInsets(v: View?, insets: WindowInsetsCompat): WindowInsetsCompat { - val newInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - if (newInsets != lastInsets) { - onWindowInsetsChanged(newInsets) - lastInsets = newInsets - } - return insets - } - protected fun bindingOrNull() = viewBinding protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B - - protected abstract fun onWindowInsetsChanged(insets: Insets) } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt index 4d6a307cb..9abebf0fb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt @@ -2,38 +2,53 @@ package org.koitharu.kotatsu.base.ui import android.os.Bundle import android.view.View +import androidx.annotation.CallSuper import androidx.annotation.StringRes -import androidx.core.view.OnApplyWindowInsetsListener -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat +import androidx.core.graphics.Insets import androidx.core.view.updatePadding import androidx.preference.PreferenceFragmentCompat +import androidx.recyclerview.widget.RecyclerView import org.koin.android.ext.android.inject +import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.prefs.AppSettings abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : PreferenceFragmentCompat(), - OnApplyWindowInsetsListener { + WindowInsetsDelegate.WindowInsetsListener, + RecyclerViewOwner { protected val settings by inject(mode = LazyThreadSafetyMode.NONE) + @Suppress("LeakingThis") + protected val insetsDelegate = WindowInsetsDelegate(this) + + override val recyclerView: RecyclerView + get() = listView + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) listView.clipToPadding = false - ViewCompat.setOnApplyWindowInsetsListener(view, this) + insetsDelegate.onViewCreated(view) + } + + override fun onDestroyView() { + insetsDelegate.onDestroyView() + super.onDestroyView() } override fun onResume() { super.onResume() - activity?.setTitle(titleId) + if (titleId != 0) { + activity?.setTitle(titleId) + } } - override fun onApplyWindowInsets(v: View?, insets: WindowInsetsCompat): WindowInsetsCompat { - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + @CallSuper + override fun onWindowInsetsChanged(insets: Insets) { listView.updatePadding( - left = systemBars.left, - right = systemBars.right, - bottom = systemBars.bottom + left = insets.left, + right = insets.right, + bottom = insets.bottom ) - return insets } } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt new file mode 100644 index 000000000..9b0976d51 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt @@ -0,0 +1,8 @@ +package org.koitharu.kotatsu.base.ui.util + +import androidx.recyclerview.widget.RecyclerView + +interface RecyclerViewOwner { + + val recyclerView: RecyclerView +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt new file mode 100644 index 000000000..5f1f0cd5e --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt @@ -0,0 +1,69 @@ +package org.koitharu.kotatsu.base.ui.util + +import android.view.View +import androidx.core.graphics.Insets +import androidx.core.view.OnApplyWindowInsetsListener +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat + +class WindowInsetsDelegate( + private val listener: WindowInsetsListener, +) : OnApplyWindowInsetsListener, View.OnLayoutChangeListener { + + var handleImeInsets: Boolean = false + + var interceptingWindowInsetsListener: OnApplyWindowInsetsListener? = null + + private var lastInsets: Insets? = null + + override fun onApplyWindowInsets(v: View?, insets: WindowInsetsCompat?): WindowInsetsCompat? { + if (insets == null) { + return null + } + val handledInsets = interceptingWindowInsetsListener?.onApplyWindowInsets(v, insets) ?: insets + val newInsets = if (handleImeInsets) { + Insets.max( + handledInsets.getInsets(WindowInsetsCompat.Type.systemBars()), + handledInsets.getInsets(WindowInsetsCompat.Type.ime()), + ) + } else { + handledInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + } + if (newInsets != lastInsets) { + listener.onWindowInsetsChanged(newInsets) + lastInsets = newInsets + } + return handledInsets + } + + override fun onLayoutChange( + view: View, + left: Int, + top: Int, + right: Int, + bottom: Int, + oldLeft: Int, + oldTop: Int, + oldRight: Int, + oldBottom: Int, + ) { + view.removeOnLayoutChangeListener(this) + if (lastInsets == null) { // Listener may not be called + onApplyWindowInsets(view, ViewCompat.getRootWindowInsets(view)) + } + } + + fun onViewCreated(view: View) { + ViewCompat.setOnApplyWindowInsetsListener(view, this) + view.addOnLayoutChangeListener(this) + } + + fun onDestroyView() { + lastInsets = null + } + + interface WindowInsetsListener { + + fun onWindowInsetsChanged(insets: Insets) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt new file mode 100644 index 000000000..e7567ca89 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt @@ -0,0 +1,120 @@ +package org.koitharu.kotatsu.base.ui.widgets + +import android.content.Context +import android.content.res.ColorStateList +import android.content.res.TypedArray +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.graphics.drawable.InsetDrawable +import android.graphics.drawable.RippleDrawable +import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.RectShape +import android.util.AttributeSet +import androidx.annotation.AttrRes +import androidx.appcompat.widget.AppCompatCheckedTextView +import androidx.core.content.res.use +import androidx.core.content.withStyledAttributes +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel +import org.koitharu.kotatsu.R + +class ListItemTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + @AttrRes defStyleAttr: Int = R.attr.listItemTextViewStyle, +) : AppCompatCheckedTextView(context, attrs, defStyleAttr) { + + private var checkedDrawableStart: Drawable? = null + private var checkedDrawableEnd: Drawable? = null + private var isInitialized = false + private var isCheckDrawablesVisible: Boolean = false + private var defaultPaddingStart: Int = 0 + private var defaultPaddingEnd: Int = 0 + + init { + context.withStyledAttributes(attrs, R.styleable.ListItemTextView, defStyleAttr) { + background = RippleDrawable( + getColorStateList(R.styleable.ListItemTextView_rippleColor) ?: getRippleColorFallback(context), + createShapeDrawable(this), + ShapeDrawable(RectShape()), + ) + checkedDrawableStart = getDrawable(R.styleable.ListItemTextView_checkedDrawableStart) + checkedDrawableEnd = getDrawable(R.styleable.ListItemTextView_checkedDrawableEnd) + } + checkedDrawableStart?.setTintList(textColors) + checkedDrawableEnd?.setTintList(textColors) + defaultPaddingStart = paddingStart + defaultPaddingEnd = paddingEnd + isInitialized = true + adjustCheckDrawables() + } + + override fun refreshDrawableState() { + super.refreshDrawableState() + adjustCheckDrawables() + } + + override fun setTextColor(colors: ColorStateList?) { + checkedDrawableStart?.setTintList(colors) + checkedDrawableEnd?.setTintList(colors) + super.setTextColor(colors) + } + + override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) { + defaultPaddingStart = start + defaultPaddingEnd = end + super.setPaddingRelative(start, top, end, bottom) + } + + override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) { + val isRtl = layoutDirection == LAYOUT_DIRECTION_RTL + defaultPaddingStart = if (isRtl) right else left + defaultPaddingEnd = if (isRtl) left else right + super.setPadding(left, top, right, bottom) + } + + private fun adjustCheckDrawables() { + if (isInitialized && isCheckDrawablesVisible != isChecked) { + setCompoundDrawablesRelativeWithIntrinsicBounds( + if (isChecked) checkedDrawableStart else null, + null, + if (isChecked) checkedDrawableEnd else null, + null, + ) + super.setPaddingRelative( + if (isChecked && checkedDrawableStart != null) { + defaultPaddingStart + compoundDrawablePadding + } else defaultPaddingStart, + paddingTop, + if (isChecked && checkedDrawableEnd != null) { + defaultPaddingEnd + compoundDrawablePadding + } else defaultPaddingEnd, + paddingBottom, + ) + isCheckDrawablesVisible = isChecked + } + } + + private fun createShapeDrawable(ta: TypedArray): InsetDrawable { + val shapeAppearance = ShapeAppearanceModel.builder( + context, + ta.getResourceId(R.styleable.ListItemTextView_shapeAppearance, 0), + ta.getResourceId(R.styleable.ListItemTextView_shapeAppearanceOverlay, 0), + ).build() + val shapeDrawable = MaterialShapeDrawable(shapeAppearance) + shapeDrawable.fillColor = ta.getColorStateList(R.styleable.ListItemTextView_backgroundTint) + return InsetDrawable( + shapeDrawable, + ta.getDimensionPixelOffset(R.styleable.ListItemTextView_android_insetLeft, 0), + ta.getDimensionPixelOffset(R.styleable.ListItemTextView_android_insetTop, 0), + ta.getDimensionPixelOffset(R.styleable.ListItemTextView_android_insetRight, 0), + ta.getDimensionPixelOffset(R.styleable.ListItemTextView_android_insetBottom, 0), + ) + } + + private fun getRippleColorFallback(context: Context): ColorStateList { + return context.obtainStyledAttributes(intArrayOf(android.R.attr.colorControlHighlight)).use { + it.getColorStateList(0) + } ?: ColorStateList.valueOf(Color.TRANSPARENT) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 427392484..bbffd9b7e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -45,9 +45,6 @@ class AppSettings(context: Context) { val isAmoledTheme: Boolean get() = prefs.getBoolean(KEY_THEME_AMOLED, false) - val isToolbarHideWhenScrolling: Boolean - get() = prefs.getBoolean(KEY_HIDE_TOOLBAR, true) - var gridSize: Int get() = prefs.getInt(KEY_GRID_SIZE, 100) set(value) = prefs.edit { putInt(KEY_GRID_SIZE, value) } @@ -215,7 +212,6 @@ class AppSettings(context: Context) { const val KEY_DYNAMIC_THEME = "dynamic_theme" const val KEY_THEME_AMOLED = "amoled_theme" const val KEY_DATE_FORMAT = "date_format" - const val KEY_HIDE_TOOLBAR = "hide_toolbar" const val KEY_SOURCES_ORDER = "sources_order" const val KEY_SOURCES_HIDDEN = "sources_hidden" const val KEY_TRAFFIC_WARNING = "traffic_warning" diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 9a05baf54..8f73594e6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -53,7 +53,6 @@ class ChaptersFragment : BaseFragment(), chaptersAdapter = ChaptersAdapter(this) selectionDecoration = ChaptersSelectionDecoration(view.context) with(binding.recyclerViewChapters) { - addItemDecoration(MaterialDividerItemDecoration(view.context, RecyclerView.VERTICAL)) addItemDecoration(selectionDecoration!!) setHasFixedSize(true) adapter = chaptersAdapter diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt index 15c579bf0..c147351b0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt @@ -12,7 +12,6 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.divider.MaterialDividerItemDecoration import com.google.android.material.snackbar.Snackbar import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R @@ -42,7 +41,6 @@ class CategoriesActivity : BaseActivity(), supportActionBar?.setDisplayHomeAsUpEnabled(true) adapter = CategoriesAdapter(this) editDelegate = CategoriesEditDelegate(this, this) - binding.recyclerView.addItemDecoration(MaterialDividerItemDecoration(this, RecyclerView.VERTICAL)) binding.recyclerView.setHasFixedSize(true) binding.recyclerView.adapter = adapter binding.fabAdd.setOnClickListener(this) @@ -94,15 +92,6 @@ class CategoriesActivity : BaseActivity(), right = insets.right, bottom = 2 * insets.bottom + binding.fabAdd.measureHeight() ) - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right - ) - updateLayoutParams { - topMargin = insets.top - } - } } private fun onCategoriesChanged(categories: List) { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt index 29216ac59..e34b5ad94 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt @@ -6,14 +6,13 @@ import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.titleRes -import org.koitharu.kotatsu.databinding.ItemCheckableMultipleBinding -import org.koitharu.kotatsu.databinding.ItemCheckableSingleBinding +import org.koitharu.kotatsu.databinding.ItemCheckableNewBinding import org.koitharu.kotatsu.databinding.ItemFilterHeaderBinding fun filterSortDelegate( listener: OnFilterChangedListener, -) = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemCheckableSingleBinding.inflate(layoutInflater, parent, false) } +) = adapterDelegateViewBinding( + { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) } ) { itemView.setOnClickListener { @@ -28,8 +27,8 @@ fun filterSortDelegate( fun filterTagDelegate( listener: OnFilterChangedListener, -) = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemCheckableMultipleBinding.inflate(layoutInflater, parent, false) } +) = adapterDelegateViewBinding( + { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) } ) { itemView.setOnClickListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 1ae9ef264..d2716a9d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -13,10 +13,7 @@ import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.graphics.Insets -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.isVisible -import androidx.core.view.postDelayed -import androidx.core.view.updatePadding +import androidx.core.view.* import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.transition.Slide @@ -60,7 +57,7 @@ import org.koitharu.kotatsu.utils.ext.observeWithPrevious class ReaderActivity : BaseFullscreenActivity(), ChaptersBottomSheet.OnChapterChangeListener, GridTouchHelper.OnGridTouchListener, OnPageSelectListener, ReaderConfigDialog.Callback, - ActivityResultCallback, ReaderControlDelegate.OnInteractionListener { + ActivityResultCallback, ReaderControlDelegate.OnInteractionListener, OnApplyWindowInsetsListener { private val viewModel by viewModel { parametersOf(MangaIntent(intent), intent?.getParcelableExtra(EXTRA_STATE)) @@ -87,6 +84,7 @@ class ReaderActivity : BaseFullscreenActivity(), controlDelegate = ReaderControlDelegate(lifecycleScope, get(), this) binding.toolbarBottom.inflateMenu(R.menu.opt_reader_bottom) binding.toolbarBottom.setOnMenuItemClickListener(::onOptionsItemSelected) + insetsDelegate.interceptingWindowInsetsListener = this orientationHelper.observeAutoOrientation() .onEach { @@ -286,8 +284,6 @@ class ReaderActivity : BaseFullscreenActivity(), viewModel.switchMode(mode) } - override fun onWindowInsetsChanged(insets: Insets) = Unit - private fun onPageSaved(uri: Uri?) { if (uri != null) { Snackbar.make(binding.container, R.string.page_saved, Snackbar.LENGTH_INDEFINITE) @@ -353,6 +349,8 @@ class ReaderActivity : BaseFullscreenActivity(), .build() } + override fun onWindowInsetsChanged(insets: Insets) = Unit + override fun switchPageBy(delta: Int) { reader?.switchPageBy(delta) } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt index 825c5857d..5d6a15530 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -119,9 +119,6 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), AppSettings.KEY_THEME_AMOLED -> { findPreference(key)?.setSummary(R.string.restart_required) } - AppSettings.KEY_HIDE_TOOLBAR -> { - findPreference(key)?.setSummary(R.string.restart_required) - } AppSettings.KEY_LOCAL_STORAGE -> { findPreference(key)?.bindStorageName() } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index d70bf45a8..0dfeb6022 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -3,10 +3,7 @@ package org.koitharu.kotatsu.settings import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.ViewGroup import androidx.core.graphics.Insets -import androidx.core.view.updateLayoutParams -import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction @@ -15,8 +12,10 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.utils.ext.isScrolledToTop class SettingsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartFragmentCallback, @@ -34,6 +33,11 @@ class SettingsActivity : BaseActivity(), } } + override fun onTitleChanged(title: CharSequence?, color: Int) { + super.onTitleChanged(title, color) + binding.collapsingToolbarLayout.title = title + } + override fun onStart() { super.onStart() supportFragmentManager.addOnBackStackChangedListener(this) @@ -45,7 +49,11 @@ class SettingsActivity : BaseActivity(), } override fun onBackStackChanged() { - binding.appbar.setExpanded(true, true) + val fragment = supportFragmentManager.findFragmentById(R.id.container) as? RecyclerViewOwner ?: return + val recyclerView = fragment.recyclerView + recyclerView.post { + binding.appbar.setExpanded(recyclerView.isScrolledToTop, false) + } } override fun onPreferenceStartFragment( @@ -77,17 +85,7 @@ class SettingsActivity : BaseActivity(), } } - override fun onWindowInsetsChanged(insets: Insets) { - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right - ) - updateLayoutParams { - topMargin = insets.top - } - } - } + override fun onWindowInsetsChanged(insets: Insets) = Unit companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt index 7666965e8..fc670874a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt @@ -3,12 +3,12 @@ package org.koitharu.kotatsu.settings import android.os.Bundle import android.view.View import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.parsers.exception.AuthRequiredException @@ -18,7 +18,7 @@ import org.koitharu.kotatsu.utils.ext.serializableArgument import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import org.koitharu.kotatsu.utils.ext.withArgs -class SourceSettingsFragment : PreferenceFragmentCompat() { +class SourceSettingsFragment : BasePreferenceFragment(0) { private val source by serializableArgument(EXTRA_SOURCE) private var repository: RemoteMangaRepository? = null diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsFragment.kt index dd9c4235a..a0a571fd1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsFragment.kt @@ -11,19 +11,25 @@ import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseFragment +import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.databinding.FragmentSettingsSourcesBinding import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigAdapter -import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigItemDecoration import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigListener import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem class SourcesSettingsFragment : BaseFragment(), - SourceConfigListener, SearchView.OnQueryTextListener, MenuItem.OnActionExpandListener { + SourceConfigListener, + SearchView.OnQueryTextListener, + MenuItem.OnActionExpandListener, + RecyclerViewOwner { private var reorderHelper: ItemTouchHelper? = null private val viewModel by viewModel() + override val recyclerView: RecyclerView + get() = binding.recyclerView + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) @@ -44,7 +50,7 @@ class SourcesSettingsFragment : BaseFragment(), val sourcesAdapter = SourceConfigAdapter(this, get(), viewLifecycleOwner) with(binding.recyclerView) { setHasFixedSize(true) - addItemDecoration(SourceConfigItemDecoration(view.context)) + // addItemDecoration(SourceConfigItemDecoration(view.context)) adapter = sourcesAdapter reorderHelper = ItemTouchHelper(SourcesReorderCallback()).also { it.attachToRecyclerView(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt index 1d9b1c045..19388cbcc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt @@ -79,6 +79,7 @@ class SourcesSettingsViewModel( } SourceConfigItem.SourceItem( source = it, + summary = null, isEnabled = it.name !in hiddenSources, isDraggable = false, ) @@ -101,6 +102,7 @@ class SourcesSettingsViewModel( enabledSources.mapTo(result) { SourceConfigItem.SourceItem( source = it, + summary = getLocaleTitle(it.locale), isEnabled = true, isDraggable = true, ) @@ -116,13 +118,14 @@ class SourcesSettingsViewModel( val isExpanded = key in expandedGroups result += SourceConfigItem.LocaleGroup( localeId = key, - title = locale?.getDisplayLanguage(locale)?.toTitleCase(locale), + title = getLocaleTitle(key), isExpanded = isExpanded, ) if (isExpanded) { list.mapTo(result) { SourceConfigItem.SourceItem( source = it, + summary = null, isEnabled = false, isDraggable = false, ) @@ -133,6 +136,11 @@ class SourcesSettingsViewModel( items.value = result } + private fun getLocaleTitle(localeKey: String?): String? { + val locale = Locale(localeKey ?: return null) + return locale.getDisplayLanguage(locale).toTitleCase(locale) + } + private class LocaleKeyComparator : Comparator { private val deviceLocales = LocaleListCompat.getAdjustedDefault() diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt index fd8c8e4bc..48f0e74c5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt @@ -38,7 +38,7 @@ fun sourceConfigGroupDelegate( } bind { - binding.root.text = item.title ?: getString(R.string.other) + binding.root.text = item.title ?: getString(R.string.various_languages) binding.root.isChecked = item.isExpanded } } @@ -107,6 +107,7 @@ fun sourceConfigDraggableItemDelegate( bind { binding.textViewTitle.text = item.source.title + binding.textViewDescription.text = item.summary ?: getString(R.string.various_languages) binding.switchToggle.isChecked = item.isEnabled } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/model/SourceConfigItem.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/model/SourceConfigItem.kt index b91e89122..1aafbecd2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/model/SourceConfigItem.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/model/SourceConfigItem.kt @@ -50,6 +50,7 @@ sealed interface SourceConfigItem { class SourceItem( val source: MangaSource, val isEnabled: Boolean, + val summary: String?, val isDraggable: Boolean, ) : SourceConfigItem { @@ -63,6 +64,7 @@ sealed interface SourceConfigItem { other as SourceItem if (source != other.source) return false + if (summary != other.summary) return false if (isEnabled != other.isEnabled) return false if (isDraggable != other.isDraggable) return false @@ -71,6 +73,7 @@ sealed interface SourceConfigItem { override fun hashCode(): Int { var result = source.hashCode() + result = 31 * result + summary.hashCode() result = 31 * result + isEnabled.hashCode() result = 31 * result + isDraggable.hashCode() return result diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index 69a4a3bcc..725013fad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -154,4 +154,13 @@ fun BaseProgressIndicator<*>.setIndeterminateCompat(indeterminate: Boolean) { fun Slider.setValueRounded(newValue: Float) { val step = stepSize value = (newValue / step).roundToInt() * step -} \ No newline at end of file +} + +val RecyclerView.isScrolledToTop: Boolean + get() { + if (childCount == 0) { + return true + } + val holder = findViewHolderForAdapterPosition(0) + return holder != null && holder.itemView.top >= 0 + } \ No newline at end of file diff --git a/app/src/main/res/color/list_item_background_color.xml b/app/src/main/res/color/list_item_background_color.xml new file mode 100644 index 000000000..d590c17eb --- /dev/null +++ b/app/src/main/res/color/list_item_background_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/list_item_text_color.xml b/app/src/main/res/color/list_item_text_color.xml new file mode 100644 index 000000000..15a3f8790 --- /dev/null +++ b/app/src/main/res/color/list_item_text_color.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 000000000..100952949 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_expand_less.xml b/app/src/main/res/drawable/ic_expand_less.xml index 8b5d44e5f..466a91a2e 100644 --- a/app/src/main/res/drawable/ic_expand_less.xml +++ b/app/src/main/res/drawable/ic_expand_less.xml @@ -1,5 +1,7 @@ - - - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_expand_more.xml b/app/src/main/res/drawable/ic_expand_more.xml index bc6e8295b..f7cae8b82 100644 --- a/app/src/main/res/drawable/ic_expand_more.xml +++ b/app/src/main/res/drawable/ic_expand_more.xml @@ -1,11 +1,7 @@ - - - + android:drawable="@drawable/abc_ic_arrow_drop_right_black_24dp" + android:fromDegrees="90" + android:pivotX="50%" + android:pivotY="50%" + android:toDegrees="90" /> \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp/activity_settings.xml b/app/src/main/res/layout-w600dp/activity_settings.xml index b257facd3..f2554f054 100644 --- a/app/src/main/res/layout-w600dp/activity_settings.xml +++ b/app/src/main/res/layout-w600dp/activity_settings.xml @@ -14,11 +14,21 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="@dimen/toolbar_height_expanded" + app:toolbarId="@id/toolbar" + app:layout_scrollFlags="scroll|exitUntilCollapsed"> + + + + + diff --git a/app/src/main/res/layout-w720dp-land/activity_main.xml b/app/src/main/res/layout-w720dp-land/activity_main.xml index c2b7c9e5c..19eed7953 100644 --- a/app/src/main/res/layout-w720dp-land/activity_main.xml +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -31,9 +31,9 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:elevation="0dp" android:paddingLeft="16dp" android:paddingRight="16dp" + app:elevation="0dp" app:liftOnScroll="false"> + android:background="@drawable/toolbar_background" + android:theme="@style/ThemeOverlay.Kotatsu.MainToolbar" + app:layout_scrollFlags="scroll|enterAlways"> - + android:layout_width="1dp" + android:layout_height="0dp" + android:background="?colorOutline" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.6" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/appbar" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_categories.xml b/app/src/main/res/layout/activity_categories.xml index d553d862d..022e3a397 100644 --- a/app/src/main/res/layout/activity_categories.xml +++ b/app/src/main/res/layout/activity_categories.xml @@ -8,14 +8,24 @@ - + android:layout_height="@dimen/toolbar_height_expanded" + app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:toolbarId="@id/toolbar"> + + + + diff --git a/app/src/main/res/layout/activity_downloads.xml b/app/src/main/res/layout/activity_downloads.xml index 927805f6c..7d4120729 100644 --- a/app/src/main/res/layout/activity_downloads.xml +++ b/app/src/main/res/layout/activity_downloads.xml @@ -10,14 +10,22 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fitsSystemWindows="true" - app:elevation="0dp"> + android:fitsSystemWindows="true"> - + android:layout_height="@dimen/toolbar_height_expanded" + app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:toolbarId="@id/toolbar"> + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e4ed68397..aa669fba1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -15,16 +15,16 @@ android:id="@id/container" android:layout_width="match_parent" android:layout_height="match_parent" - tools:layout="@layout/fragment_list" - app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> + app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" + tools:layout="@layout/fragment_list" /> + android:background="@drawable/toolbar_background" + android:theme="@style/ThemeOverlay.Kotatsu.MainToolbar" + app:layout_scrollFlags="scroll|enterAlways"> diff --git a/app/src/main/res/layout/activity_search_global.xml b/app/src/main/res/layout/activity_search_global.xml index 580db1d15..2712c4c3c 100644 --- a/app/src/main/res/layout/activity_search_global.xml +++ b/app/src/main/res/layout/activity_search_global.xml @@ -14,7 +14,7 @@ android:id="@id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:theme="?attr/actionBarTheme" /> + app:layout_scrollFlags="scroll|enterAlways" /> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 84cc2ce36..dedfbb835 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -8,14 +8,23 @@ + android:layout_height="wrap_content" + android:fitsSystemWindows="true"> - + android:layout_height="@dimen/toolbar_height_expanded" + app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:toolbarId="@id/toolbar"> + + + + @@ -23,6 +32,6 @@ android:id="@id/container" android:layout_width="match_parent" android:layout_height="match_parent" - app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"/> + app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings_simple.xml b/app/src/main/res/layout/activity_settings_simple.xml index faa5b7506..fa9c5d762 100644 --- a/app/src/main/res/layout/activity_settings_simple.xml +++ b/app/src/main/res/layout/activity_settings_simple.xml @@ -10,11 +10,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:layout_height="@dimen/toolbar_height_expanded" + app:toolbarId="@id/toolbar" + app:layout_scrollFlags="scroll|exitUntilCollapsed"> + + + + diff --git a/app/src/main/res/layout/item_chapter.xml b/app/src/main/res/layout/item_chapter.xml index 30f631e10..3998c9fd0 100644 --- a/app/src/main/res/layout/item_chapter.xml +++ b/app/src/main/res/layout/item_chapter.xml @@ -14,7 +14,7 @@ android:id="@+id/textView_number" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="12dp" + android:layout_marginStart="?android:listPreferredItemPaddingStart" android:background="@drawable/bg_badge_default" android:gravity="center" android:minWidth="26dp" @@ -26,8 +26,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="8dp" - android:layout_marginStart="16dp" - android:layout_marginEnd="12dp" + android:layout_marginStart="?android:listPreferredItemPaddingStart" + android:layout_marginEnd="?android:listPreferredItemPaddingEnd" android:layout_weight="1" android:orientation="vertical"> @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" - android:textAppearance="?attr/textAppearanceBodyMedium" + android:textAppearance="?attr/textAppearanceBodyLarge" tools:text="@tools:sample/lorem[15]" /> @@ -54,7 +55,7 @@ android:id="@+id/imageView_new" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="12dp" + android:layout_marginEnd="?android:listPreferredItemPaddingEnd" android:src="@drawable/ic_new" app:tint="?colorError" /> @@ -62,7 +63,7 @@ android:id="@+id/imageView_downloaded" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="12dp" + android:layout_marginEnd="?android:listPreferredItemPaddingEnd" android:src="@drawable/ic_save_ok" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_checkable_new.xml b/app/src/main/res/layout/item_checkable_new.xml new file mode 100644 index 000000000..9ec3eacf1 --- /dev/null +++ b/app/src/main/res/layout/item_checkable_new.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_expandable.xml b/app/src/main/res/layout/item_expandable.xml index 3eb1155fd..ce84cbfb9 100644 --- a/app/src/main/res/layout/item_expandable.xml +++ b/app/src/main/res/layout/item_expandable.xml @@ -12,5 +12,5 @@ android:paddingEnd="?android:listPreferredItemPaddingEnd" android:textAppearance="?attr/textAppearanceBodyMedium" app:drawableEndCompat="@drawable/ic_expand_collapse" - app:drawableTint="?android:textColorPrimary" + app:drawableTint="?android:colorControlNormal" tools:text="@tools:sample/full_names" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_filter_header.xml b/app/src/main/res/layout/item_filter_header.xml index d1f878bf4..f18539485 100644 --- a/app/src/main/res/layout/item_filter_header.xml +++ b/app/src/main/res/layout/item_filter_header.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_source_config_draggable.xml b/app/src/main/res/layout/item_source_config_draggable.xml index ffa9a68e5..dfdf1e04c 100644 --- a/app/src/main/res/layout/item_source_config_draggable.xml +++ b/app/src/main/res/layout/item_source_config_draggable.xml @@ -3,9 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="?android:listPreferredItemHeightSmall" + android:layout_height="wrap_content" android:background="?android:windowBackground" android:gravity="center_vertical" + android:minHeight="58dp" android:orientation="horizontal"> - + android:orientation="vertical"> + + + + + + tools:listitem="@layout/item_checkable_new" /> \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 9b721e46c..42d3174b2 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -2,6 +2,7 @@ + @@ -20,4 +21,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f4b747b4a..6dd32371b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,12 +7,13 @@ 36dp + 172dp 8dp 8dp 2dp 86dp 120dp - 56dp + 62dp 120dp 48dp 36dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c8b6dd49e..0eff2aeeb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -268,4 +268,5 @@ Preload pages Logged in as %s 18+ + Various languages \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 08ab43dec..99825b464 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -72,6 +72,18 @@ outsideOverlay + + @@ -98,6 +110,11 @@ ?android:attr/textColorSecondary + + diff --git a/app/src/main/res/xml/pref_about.xml b/app/src/main/res/xml/pref_about.xml index 985e8bbf5..7be3e5c8a 100644 --- a/app/src/main/res/xml/pref_about.xml +++ b/app/src/main/res/xml/pref_about.xml @@ -15,7 +15,7 @@ app:persistent="false" app:summary="@string/check_for_updates" /> - - - - Date: Sat, 19 Mar 2022 13:55:32 +0300 Subject: [PATCH 3/4] Minor UI fixes --- .../kotatsu/download/ui/DownloadsActivity.kt | 13 ++++--------- .../main/res/layout-w720dp-land/activity_main.xml | 1 - app/src/main/res/layout/activity_main.xml | 1 - .../res/layout/item_source_config_draggable.xml | 3 ++- app/src/main/res/layout/item_tracklog.xml | 3 ++- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt index d590a724d..e249e4dc5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt @@ -47,15 +47,10 @@ class DownloadsActivity : BaseActivity() { right = insets.right, bottom = insets.bottom ) - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right - ) - updateLayoutParams { - topMargin = insets.top - } - } + binding.toolbar.updatePadding( + left = insets.left, + right = insets.right + ) } companion object { diff --git a/app/src/main/res/layout-w720dp-land/activity_main.xml b/app/src/main/res/layout-w720dp-land/activity_main.xml index 19eed7953..44a61bafd 100644 --- a/app/src/main/res/layout-w720dp-land/activity_main.xml +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -80,7 +80,6 @@ android:contentDescription="@string/_continue" android:src="@drawable/ic_read_fill" android:visibility="gone" - app:backgroundTint="?attr/colorContainer" app:fabSize="normal" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index aa669fba1..40137c696 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,7 +74,6 @@ android:contentDescription="@string/_continue" android:src="@drawable/ic_read_fill" android:visibility="gone" - app:backgroundTint="?attr/colorContainer" app:fabSize="normal" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end" diff --git a/app/src/main/res/layout/item_source_config_draggable.xml b/app/src/main/res/layout/item_source_config_draggable.xml index dfdf1e04c..3af85fe59 100644 --- a/app/src/main/res/layout/item_source_config_draggable.xml +++ b/app/src/main/res/layout/item_source_config_draggable.xml @@ -43,7 +43,8 @@ android:ellipsize="end" android:singleLine="true" android:textAppearance="?attr/textAppearanceBodySmall" - tools:text="05.10.2021 • Scanlator" /> + tools:text="English" /> + Date: Sun, 20 Mar 2022 11:53:54 +0300 Subject: [PATCH 4/4] Return `backgroundTint` to FAB --- app/src/main/res/layout-w720dp-land/activity_main.xml | 1 + app/src/main/res/layout/activity_main.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/res/layout-w720dp-land/activity_main.xml b/app/src/main/res/layout-w720dp-land/activity_main.xml index 44a61bafd..19eed7953 100644 --- a/app/src/main/res/layout-w720dp-land/activity_main.xml +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -80,6 +80,7 @@ android:contentDescription="@string/_continue" android:src="@drawable/ic_read_fill" android:visibility="gone" + app:backgroundTint="?attr/colorContainer" app:fabSize="normal" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40137c696..aa669fba1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,6 +74,7 @@ android:contentDescription="@string/_continue" android:src="@drawable/ic_read_fill" android:visibility="gone" + app:backgroundTint="?attr/colorContainer" app:fabSize="normal" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end"