diff --git a/app/build.gradle b/app/build.gradle index 7ac2527be..0bcefe9d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -85,7 +85,7 @@ dependencies { implementation 'androidx.asynclayoutinflater:asynclayoutinflater:1.0.0' implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.work:work-runtime-ktx:2.7.1' - implementation 'com.google.android.material:material:1.6.0-alpha03' + implementation 'com.google.android.material:material:1.6.0-beta01' //noinspection LifecycleAnnotationProcessorWithJava8 kapt 'androidx.lifecycle:lifecycle-compiler:2.4.1' 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 index e7567ca89..7004192ad 100644 --- 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 @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.base.ui.widgets +import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.content.res.TypedArray @@ -14,10 +15,12 @@ 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.ripple.RippleUtils import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel import org.koitharu.kotatsu.R +@SuppressLint("RestrictedApi") class ListItemTextView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -33,9 +36,12 @@ class ListItemTextView @JvmOverloads constructor( init { context.withStyledAttributes(attrs, R.styleable.ListItemTextView, defStyleAttr) { + val itemRippleColor = getColorStateList(R.styleable.ListItemTextView_rippleColor) + ?: getRippleColorFallback(context) + val shape = createShapeDrawable(this) background = RippleDrawable( - getColorStateList(R.styleable.ListItemTextView_rippleColor) ?: getRippleColorFallback(context), - createShapeDrawable(this), + RippleUtils.sanitizeRippleDrawableColor(itemRippleColor), + shape, ShapeDrawable(RectShape()), ) checkedDrawableStart = getDrawable(R.styleable.ListItemTextView_checkedDrawableStart) 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 d2716a9d3..3c8a5c982 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 @@ -286,7 +286,7 @@ class ReaderActivity : BaseFullscreenActivity(), private fun onPageSaved(uri: Uri?) { if (uri != null) { - Snackbar.make(binding.container, R.string.page_saved, Snackbar.LENGTH_INDEFINITE) + Snackbar.make(binding.container, R.string.page_saved, Snackbar.LENGTH_LONG) .setAnchorView(binding.appbarBottom) .setAction(R.string.share) { ShareHelper(this).shareImage(uri) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt index d538d7f45..30b696297 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt @@ -6,6 +6,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.databinding.LayoutPageInfoBinding import org.koitharu.kotatsu.reader.domain.PageLoader abstract class BasePageHolder( @@ -16,6 +17,7 @@ abstract class BasePageHolder( ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver) + protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root) val context: Context get() = itemView.context diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt index 1b672ec4d..58aba0ee6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt @@ -15,8 +15,7 @@ import org.koitharu.kotatsu.databinding.ItemPageBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.pager.BasePageHolder import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.ifZero +import org.koitharu.kotatsu.utils.ext.* open class PageHolder( binding: ItemPageBinding, @@ -29,7 +28,7 @@ open class PageHolder( init { binding.ssiv.setOnImageEventListener(delegate) @Suppress("LeakingThis") - binding.buttonRetry.setOnClickListener(this) + bindingInfo.buttonRetry.setOnClickListener(this) binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled } @@ -45,17 +44,17 @@ open class PageHolder( } override fun onLoadingStarted() { - binding.layoutError.isVisible = false - binding.progressBar.isVisible = true + bindingInfo.layoutError.isVisible = false + bindingInfo.progressBar.showCompat() binding.ssiv.recycle() } override fun onProgressChanged(progress: Int) { if (progress in 0..100) { - binding.progressBar.isIndeterminate = false - binding.progressBar.setProgressCompat(progress, true) + bindingInfo.progressBar.isIndeterminate = false + bindingInfo.progressBar.setProgressCompat(progress, true) } else { - binding.progressBar.isIndeterminate = true + bindingInfo.progressBar.isIndeterminate = true } } @@ -100,7 +99,7 @@ open class PageHolder( } override fun onImageShown() { - binding.progressBar.isVisible = false + bindingInfo.progressBar.hideCompat() } override fun onClick(v: View) { @@ -110,11 +109,11 @@ open class PageHolder( } override fun onError(e: Throwable) { - binding.textViewError.text = e.getDisplayMessage(context.resources) - binding.buttonRetry.setText( + bindingInfo.textViewError.text = e.getDisplayMessage(context.resources) + bindingInfo.buttonRetry.setText( ExceptionResolver.getResolveStringId(e).ifZero { R.string.try_again } ) - binding.layoutError.isVisible = true - binding.progressBar.isVisible = false + bindingInfo.layoutError.isVisible = true + bindingInfo.progressBar.hideCompat() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt index be9e06181..cc4370748 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt @@ -13,8 +13,7 @@ import org.koitharu.kotatsu.databinding.ItemPageWebtoonBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.pager.BasePageHolder import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.ifZero +import org.koitharu.kotatsu.utils.ext.* class WebtoonHolder( @@ -29,7 +28,7 @@ class WebtoonHolder( init { binding.ssiv.setOnImageEventListener(delegate) - binding.buttonRetry.setOnClickListener(this) + bindingInfo.buttonRetry.setOnClickListener(this) } override fun onBind(data: ReaderPage) { @@ -42,17 +41,17 @@ class WebtoonHolder( } override fun onLoadingStarted() { - binding.layoutError.isVisible = false - binding.progressBar.isVisible = true + bindingInfo.layoutError.isVisible = false + bindingInfo.progressBar.showCompat() binding.ssiv.recycle() } override fun onProgressChanged(progress: Int) { if (progress in 0..100) { - binding.progressBar.isIndeterminate = false - binding.progressBar.setProgressCompat(progress, true) + bindingInfo.progressBar.isIndeterminate = false + bindingInfo.progressBar.setProgressCompat(progress, true) } else { - binding.progressBar.isIndeterminate = true + bindingInfo.progressBar.isIndeterminate = true } } @@ -77,7 +76,7 @@ class WebtoonHolder( } override fun onImageShown() { - binding.progressBar.isVisible = false + bindingInfo.progressBar.hideCompat() } override fun onClick(v: View) { @@ -87,12 +86,12 @@ class WebtoonHolder( } override fun onError(e: Throwable) { - binding.textViewError.text = e.getDisplayMessage(context.resources) - binding.buttonRetry.setText( + bindingInfo.textViewError.text = e.getDisplayMessage(context.resources) + bindingInfo.buttonRetry.setText( ExceptionResolver.getResolveStringId(e).ifZero { R.string.try_again } ) - binding.layoutError.isVisible = true - binding.progressBar.isVisible = false + bindingInfo.layoutError.isVisible = true + bindingInfo.progressBar.hideCompat() } fun getScrollY() = binding.ssiv.getScroll() 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 7821c92d7..04afdd246 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -42,7 +42,7 @@ class SettingsActivity : override fun onTitleChanged(title: CharSequence?, color: Int) { super.onTitleChanged(title, color) - binding.collapsingToolbarLayout.title = title + binding.collapsingToolbarLayout?.title = title } override fun onStart() { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ProgressBarExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ProgressBarExt.kt new file mode 100644 index 000000000..db73cb967 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ProgressBarExt.kt @@ -0,0 +1,25 @@ +package org.koitharu.kotatsu.utils.ext + +import android.os.Build +import android.widget.ProgressBar +import androidx.core.view.isVisible +import androidx.core.widget.ContentLoadingProgressBar +import com.google.android.material.progressindicator.BaseProgressIndicator + +fun ProgressBar.setProgressCompat(progress: Int, animate: Boolean) = when { + this is BaseProgressIndicator<*> -> setProgressCompat(progress, animate) + Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> setProgress(progress, animate) + else -> setProgress(progress) +} + +fun ProgressBar.showCompat() = when (this) { + is BaseProgressIndicator<*> -> show() + is ContentLoadingProgressBar -> show() + else -> isVisible = true +} + +fun ProgressBar.hideCompat() = when (this) { + is BaseProgressIndicator<*> -> hide() + is ContentLoadingProgressBar -> hide() + else -> isVisible = false +} \ No newline at end of file diff --git a/app/src/main/res/color-v23/list_item_background_color.xml b/app/src/main/res/color-v23/list_item_background_color.xml new file mode 100644 index 000000000..cfbdae9db --- /dev/null +++ b/app/src/main/res/color-v23/list_item_background_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color-v23/selector_overlay.xml b/app/src/main/res/color-v23/selector_overlay.xml new file mode 100644 index 000000000..e58e11d7c --- /dev/null +++ b/app/src/main/res/color-v23/selector_overlay.xml @@ -0,0 +1,4 @@ + + + + \ 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 index d590c17eb..ac9526c88 100644 --- a/app/src/main/res/color/list_item_background_color.xml +++ b/app/src/main/res/color/list_item_background_color.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_overlay.xml b/app/src/main/res/color/selector_overlay.xml index 26cdc3acd..5a4a4ecb0 100644 --- a/app/src/main/res/color/selector_overlay.xml +++ b/app/src/main/res/color/selector_overlay.xml @@ -1,4 +1,5 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/layout-v23/item_loading_footer.xml b/app/src/main/res/layout-v23/item_loading_footer.xml new file mode 100644 index 000000000..0af71b68f --- /dev/null +++ b/app/src/main/res/layout-v23/item_loading_footer.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v23/item_loading_state.xml b/app/src/main/res/layout-v23/item_loading_state.xml new file mode 100644 index 000000000..4d5d60aee --- /dev/null +++ b/app/src/main/res/layout-v23/item_loading_state.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v23/layout_page_info.xml b/app/src/main/res/layout-v23/layout_page_info.xml new file mode 100644 index 000000000..d1c0e2c1e --- /dev/null +++ b/app/src/main/res/layout-v23/layout_page_info.xml @@ -0,0 +1,50 @@ + + + + + + + + + +