diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt index 154303a91..2d91e71c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt @@ -1,18 +1,39 @@ package org.koitharu.kotatsu.base.ui.list.decor +import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas +import android.graphics.Paint import android.graphics.Rect import android.view.View +import androidx.core.content.res.getColorOrThrow import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView -import org.koitharu.kotatsu.utils.ext.getThemeDrawable -import kotlin.math.roundToInt +import com.google.android.material.R as materialR +@SuppressLint("PrivateResource") abstract class AbstractDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { private val bounds = Rect() - private val divider = context.getThemeDrawable(android.R.attr.listDivider) + private val thickness: Int + private val paint = Paint(Paint.ANTI_ALIAS_FLAG) + + init { + paint.style = Paint.Style.FILL + val ta = context.obtainStyledAttributes( + null, + materialR.styleable.MaterialDivider, + materialR.attr.materialDividerStyle, + materialR.style.Widget_Material3_MaterialDivider, + ) + paint.color = ta.getColorOrThrow(materialR.styleable.MaterialDivider_dividerColor) + thickness = ta.getDimensionPixelSize( + materialR.styleable.MaterialDivider_dividerThickness, + context.resources.getDimensionPixelSize(materialR.dimen.material_divider_thickness), + ) + ta.recycle() + } + override fun getItemOffsets( outRect: Rect, @@ -20,27 +41,29 @@ abstract class AbstractDividerItemDecoration(context: Context) : RecyclerView.It parent: RecyclerView, state: RecyclerView.State, ) { - outRect.set(0, divider?.intrinsicHeight ?: 0, 0, 0) + outRect.set(0, thickness, 0, 0) } // TODO implement for horizontal lists on demand override fun onDraw(canvas: Canvas, parent: RecyclerView, s: RecyclerView.State) { - if (parent.layoutManager == null || divider == null) { + if (parent.layoutManager == null || thickness == 0) { return } canvas.save() - val left: Int - val right: Int + val left: Float + val right: Float if (parent.clipToPadding) { - left = parent.paddingLeft - right = parent.width - parent.paddingRight + left = parent.paddingLeft.toFloat() + right = (parent.width - parent.paddingRight).toFloat() canvas.clipRect( - left, parent.paddingTop, right, - parent.height - parent.paddingBottom + left, + parent.paddingTop.toFloat(), + right, + (parent.height - parent.paddingBottom).toFloat() ) } else { - left = 0 - right = parent.width + left = 0f + right = parent.width.toFloat() } var previous: RecyclerView.ViewHolder? = null @@ -48,10 +71,9 @@ abstract class AbstractDividerItemDecoration(context: Context) : RecyclerView.It val holder = parent.getChildViewHolder(child) if (previous != null && shouldDrawDivider(previous, holder)) { parent.getDecoratedBoundsWithMargins(child, bounds) - val top: Int = bounds.top + child.translationY.roundToInt() - val bottom: Int = top + divider.intrinsicHeight - divider.setBounds(left, top, right, bottom) - divider.draw(canvas) + val top: Float = bounds.top + child.translationY + val bottom: Float = top + thickness + canvas.drawRect(left, top, right, bottom, paint) } previous = holder } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/ItemTypeDividerDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/ItemTypeDividerDecoration.kt deleted file mode 100644 index a887d8311..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/ItemTypeDividerDecoration.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.koitharu.kotatsu.base.ui.list.decor - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Rect -import android.view.View -import androidx.core.view.children -import androidx.recyclerview.widget.RecyclerView -import org.koitharu.kotatsu.utils.ext.getThemeDrawable -import kotlin.math.roundToInt - -class ItemTypeDividerDecoration(context: Context) : RecyclerView.ItemDecoration() { - - private val divider = context.getThemeDrawable(android.R.attr.listDivider) - private val bounds = Rect() - - override fun getItemOffsets( - outRect: Rect, view: View, - parent: RecyclerView, state: RecyclerView.State - ) { - outRect.set(0, divider?.intrinsicHeight ?: 0, 0, 0) - } - - override fun onDraw(canvas: Canvas, parent: RecyclerView, s: RecyclerView.State) { - if (parent.layoutManager == null || divider == null) { - return - } - val adapter = parent.adapter ?: return - canvas.save() - val left: Int - val right: Int - if (parent.clipToPadding) { - left = parent.paddingLeft - right = parent.width - parent.paddingRight - canvas.clipRect( - left, parent.paddingTop, right, - parent.height - parent.paddingBottom - ) - } else { - left = 0 - right = parent.width - } - - var lastItemType = -1 - for (child in parent.children) { - val itemType = adapter.getItemViewType(parent.getChildAdapterPosition(child)) - if (lastItemType != -1 && itemType != lastItemType) { - parent.getDecoratedBoundsWithMargins(child, bounds) - val top: Int = bounds.top + child.translationY.roundToInt() - val bottom: Int = top + divider.intrinsicHeight - divider.setBounds(left, top, right, bottom) - divider.draw(canvas) - } - lastItemType = itemType - } - canvas.restore() - } -} \ 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 44275715b..8fac79601 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 @@ -2,11 +2,13 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import android.content.SharedPreferences +import android.os.Build import android.provider.Settings import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arraySetOf import androidx.core.content.edit import androidx.preference.PreferenceManager +import com.google.android.material.color.DynamicColors import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.callbackFlow @@ -210,5 +212,12 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : const val KEY_FEEDBACK_4PDA = "about_feedback_4pda" const val KEY_FEEDBACK_GITHUB = "about_feedback_github" const val KEY_SUPPORT_DEVELOPER = "about_support_developer" + + val isDynamicColorAvailable: Boolean + get() = DynamicColors.isDynamicColorAvailable() || + (isSamsung && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + + private val isSamsung + get() = Build.MANUFACTURER.equals("samsung", ignoreCase = true) } } \ No newline at end of file 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 9d6afe202..f08a83032 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 @@ -2,8 +2,6 @@ package org.koitharu.kotatsu.favourites.ui.categories import android.content.Context import android.content.Intent -import android.content.res.ColorStateList -import android.graphics.Color import android.os.Bundle import android.view.Menu import android.view.View @@ -12,9 +10,9 @@ import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding -import androidx.recyclerview.widget.DividerItemDecoration 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 @@ -43,7 +41,7 @@ class CategoriesActivity : BaseActivity(), supportActionBar?.setDisplayHomeAsUpEnabled(true) adapter = CategoriesAdapter(this) editDelegate = CategoriesEditDelegate(this, this) - binding.recyclerView.addItemDecoration(DividerItemDecoration(this, RecyclerView.VERTICAL)) + binding.recyclerView.addItemDecoration(MaterialDividerItemDecoration(this, RecyclerView.VERTICAL)) binding.recyclerView.setHasFixedSize(true) binding.recyclerView.adapter = adapter binding.fabAdd.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt index cd7a51372..4575e12fa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt @@ -5,10 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.FragmentManager -import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.divider.MaterialDividerItemDecoration import org.koin.android.ext.android.get import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment @@ -37,7 +37,7 @@ class ChaptersDialog : AlertDialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.recyclerViewChapters.addItemDecoration( - DividerItemDecoration(requireContext(), RecyclerView.VERTICAL) + MaterialDividerItemDecoration(view.context, RecyclerView.VERTICAL) ) val chapters = arguments?.getParcelableArrayList(ARG_CHAPTERS) if (chapters == null) { 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 2df6558b6..94d58fb6a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -13,7 +13,6 @@ import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity -import org.koitharu.kotatsu.utils.DeviceUtil import org.koitharu.kotatsu.utils.ext.getStorageName import org.koitharu.kotatsu.utils.ext.names import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat @@ -39,7 +38,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), setDefaultValueCompat(ListMode.GRID.name) } findPreference(AppSettings.KEY_DYNAMIC_THEME)?.isVisible = - DeviceUtil.isDynamicColorAvailable + AppSettings.isDynamicColorAvailable findPreference(AppSettings.KEY_DATE_FORMAT)?.run { entryValues = arrayOf("", "MM/dd/yy", "dd/MM/yy", "yyyy-MM-dd", "dd MMM yyyy", "MMM dd, yyyy") val now = Date().time diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/DeviceUtil.kt b/app/src/main/java/org/koitharu/kotatsu/utils/DeviceUtil.kt deleted file mode 100644 index da628dba7..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/DeviceUtil.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.koitharu.kotatsu.utils - -import android.os.Build -import com.google.android.material.color.DynamicColors - -object DeviceUtil { - - private val isSamsung by lazy { - Build.MANUFACTURER.equals("samsung", ignoreCase = true) - } - - val isDynamicColorAvailable by lazy { - DynamicColors.isDynamicColorAvailable() || (isSamsung && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt index 215e2d185..6eef68d17 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt @@ -4,6 +4,7 @@ import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkRequest +import android.os.Build import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.suspendCancellableCoroutine diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt index b646b3896..00a22cc85 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt @@ -3,19 +3,16 @@ package org.koitharu.kotatsu.widget.shelf import android.app.Activity import android.appwidget.AppWidgetManager import android.content.Intent -import android.content.res.ColorStateList -import android.graphics.Color import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.core.graphics.Insets -import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding -import androidx.recyclerview.widget.DividerItemDecoration 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 @@ -40,7 +37,9 @@ class ShelfConfigActivity : BaseActivity(), setContentView(ActivityCategoriesBinding.inflate(layoutInflater)) supportActionBar?.setDisplayHomeAsUpEnabled(true) adapter = CategorySelectAdapter(this) - binding.recyclerView.addItemDecoration(DividerItemDecoration(this, RecyclerView.VERTICAL)) + binding.recyclerView.addItemDecoration( + MaterialDividerItemDecoration(this, RecyclerView.VERTICAL) + ) binding.recyclerView.adapter = adapter binding.fabAdd.hide() val appWidgetId = intent?.getIntExtra( diff --git a/app/src/main/res/layout/dialog_favorite_categories.xml b/app/src/main/res/layout/dialog_favorite_categories.xml index 8fe0c75e3..c9ba0ebe0 100644 --- a/app/src/main/res/layout/dialog_favorite_categories.xml +++ b/app/src/main/res/layout/dialog_favorite_categories.xml @@ -14,10 +14,9 @@ android:padding="16dp" android:text="@string/add_to_favourites" /> - + android:layout_height="wrap_content" /> - + android:layout_height="wrap_content" /> + android:layout_marginHorizontal="28dp" /> \ No newline at end of file