From 09105152e46201f2a723bb0336efd943c141056d Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Mon, 4 Jul 2022 22:51:37 +0300 Subject: [PATCH] Replace CoordinatorLayout in some places :trollface: --- .../ui/widgets/KotatsuCoordinatorLayout.kt | 120 ++++++++++++++++++ .../kotatsu/details/ui/DetailsActivity.kt | 3 - .../kotatsu/history/ui/HistoryActivity.kt | 13 +- .../kotatsu/library/ui/LibraryFragment.kt | 1 - .../koitharu/kotatsu/main/ui/MainActivity.kt | 1 + .../search/ui/multi/MultiSearchActivity.kt | 13 +- .../koitharu/kotatsu/utils/ext/AndroidExt.kt | 5 + .../res/color/tab_indicator_foreground.xml | 5 + .../res/drawable/tab_rounded_rectangle.xml | 10 ++ .../res/drawable/tab_selector_drawable.xml | 9 ++ .../main/res/layout/activity_container.xml | 14 +- app/src/main/res/layout/activity_details.xml | 15 ++- app/src/main/res/layout/activity_main.xml | 6 +- .../main/res/layout/activity_search_multi.xml | 12 +- app/src/main/res/values/styles.xml | 16 ++- 15 files changed, 198 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/KotatsuCoordinatorLayout.kt create mode 100644 app/src/main/res/color/tab_indicator_foreground.xml create mode 100644 app/src/main/res/drawable/tab_rounded_rectangle.xml create mode 100644 app/src/main/res/drawable/tab_selector_drawable.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/KotatsuCoordinatorLayout.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/KotatsuCoordinatorLayout.kt new file mode 100644 index 000000000..c6b90405b --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/KotatsuCoordinatorLayout.kt @@ -0,0 +1,120 @@ +package org.koitharu.kotatsu.base.ui.widgets + +import android.content.Context +import android.os.Parcel +import android.os.Parcelable +import android.util.AttributeSet +import android.view.View +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.doOnLayout +import androidx.core.view.isVisible +import androidx.customview.view.AbsSavedState +import androidx.fragment.app.FragmentContainerView +import androidx.viewpager.widget.ViewPager +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.tabs.TabLayout +import org.koitharu.kotatsu.utils.ext.findChild +import org.koitharu.kotatsu.utils.ext.findDescendant + +class KotatsuCoordinatorLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = androidx.coordinatorlayout.R.attr.coordinatorLayoutStyle +) : CoordinatorLayout(context, attrs, defStyleAttr) { + + private var appBarLayout: AppBarLayout? = null + private var tabLayout: TabLayout? = null + + /** + * If true, [AppBarLayout] child will be lifted on nested scroll. + */ + var isLiftAppBarOnScroll = true + + /** + * Internal check + */ + private val canLiftAppBarOnScroll + get() = isLiftAppBarOnScroll + + override fun onNestedScroll( + target: View, + dxConsumed: Int, + dyConsumed: Int, + dxUnconsumed: Int, + dyUnconsumed: Int, + type: Int, + consumed: IntArray + ) { + super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed) + // Disable elevation overlay when tabs are visible + if (canLiftAppBarOnScroll) { + appBarLayout?.isLifted = dyConsumed != 0 || dyUnconsumed > 0 && tabLayout?.isVisible == false + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + appBarLayout = findChild() + tabLayout = appBarLayout?.findChild() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + appBarLayout = null + tabLayout = null + } + + override fun onSaveInstanceState(): Parcelable? { + val superState = super.onSaveInstanceState() + return if (superState != null) { + SavedState(superState).also { + it.appBarLifted = appBarLayout?.isLifted ?: false + } + } else { + superState + } + } + + override fun onRestoreInstanceState(state: Parcelable?) { + if (state is SavedState) { + super.onRestoreInstanceState(state.superState) + doOnLayout { + appBarLayout?.isLifted = state.appBarLifted + } + } else { + super.onRestoreInstanceState(state) + } + } + + internal class SavedState : AbsSavedState { + var appBarLifted = false + + constructor(superState: Parcelable) : super(superState) + + constructor(source: Parcel, loader: ClassLoader?) : super(source, loader) { + appBarLifted = source.readByte().toInt() == 1 + } + + override fun writeToParcel(out: Parcel, flags: Int) { + super.writeToParcel(out, flags) + out.writeByte((if (appBarLifted) 1 else 0).toByte()) + } + + companion object { + @JvmField + val CREATOR: Parcelable.ClassLoaderCreator = object : Parcelable.ClassLoaderCreator { + override fun createFromParcel(source: Parcel, loader: ClassLoader): SavedState { + return SavedState(source, loader) + } + + override fun createFromParcel(source: Parcel): SavedState { + return SavedState(source, null) + } + + override fun newArray(size: Int): Array { + return newArray(size) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 84155b516..8cc58f47b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -143,9 +143,6 @@ class DetailsActivity : binding.snackbar.updatePadding( bottom = insets.bottom ) - binding.toolbar.updateLayoutParams { - topMargin = insets.top - } binding.root.updatePadding( left = insets.left, right = insets.right diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt index 64b629a65..e8a9b71c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt @@ -28,15 +28,10 @@ class HistoryActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right - ) - updateLayoutParams { - topMargin = insets.top - } - } + binding.toolbar.updatePadding( + left = insets.left, + right = insets.right, + ) binding.container.updatePadding( bottom = insets.bottom ) diff --git a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt index bdb6e1569..51c240a44 100644 --- a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt @@ -96,7 +96,6 @@ class LibraryFragment : BaseFragment(), LibraryListEvent binding.recyclerView.updatePadding( left = insets.left, right = insets.right, - top = insets.top, bottom = insets.bottom, ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index e2c3da7a8..f8e13a4d2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -256,6 +256,7 @@ class MainActivity : else -> return false } appBar.setExpanded(true) + appBar.isLifted = false return true } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt index e4d13c1d1..b5f40b007 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt @@ -80,15 +80,10 @@ class MultiSearchActivity : BaseActivity(), MangaLis } override fun onWindowInsetsChanged(insets: Insets) { - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right, - ) - updateLayoutParams { - topMargin = insets.top - } - } + binding.toolbar.updatePadding( + left = insets.left, + right = insets.right, + ) binding.recyclerView.updatePadding( bottom = insets.bottom, left = insets.left, 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 c33c6cb6f..23b6ec51d 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 @@ -18,6 +18,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.constraintlayout.motion.widget.MotionScene import androidx.core.app.ActivityOptionsCompat import androidx.core.view.children +import androidx.core.view.descendants import androidx.lifecycle.Lifecycle import androidx.lifecycle.coroutineScope import androidx.work.CoroutineWorker @@ -127,4 +128,8 @@ fun ViewPropertyAnimator.applySystemAnimatorScale(context: Context): ViewPropert inline fun ViewGroup.findChild(): T? { return children.find { it is T } as? T +} + +inline fun ViewGroup.findDescendant(): T? { + return descendants.find { it is T } as? T } \ No newline at end of file diff --git a/app/src/main/res/color/tab_indicator_foreground.xml b/app/src/main/res/color/tab_indicator_foreground.xml new file mode 100644 index 000000000..abce1d05b --- /dev/null +++ b/app/src/main/res/color/tab_indicator_foreground.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_rounded_rectangle.xml b/app/src/main/res/drawable/tab_rounded_rectangle.xml new file mode 100644 index 000000000..724a112c6 --- /dev/null +++ b/app/src/main/res/drawable/tab_rounded_rectangle.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_selector_drawable.xml b/app/src/main/res/drawable/tab_selector_drawable.xml new file mode 100644 index 000000000..3ef15feb1 --- /dev/null +++ b/app/src/main/res/drawable/tab_selector_drawable.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_container.xml b/app/src/main/res/layout/activity_container.xml index 2712c4c3c..a5e87e0e5 100644 --- a/app/src/main/res/layout/activity_container.xml +++ b/app/src/main/res/layout/activity_container.xml @@ -1,22 +1,24 @@ - - + android:layout_height="wrap_content" + android:fitsSystemWindows="true" + app:elevation="0dp"> + app:layout_scrollFlags="scroll|enterAlways|snap" /> - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 8190e9c82..742cdf3f8 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -1,5 +1,5 @@ - - + android:fitsSystemWindows="true" + app:elevation="0dp"> - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index bfe002239..33921d8c5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.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/activity_search_multi.xml b/app/src/main/res/layout/activity_search_multi.xml index 23b613556..f41cbeef6 100644 --- a/app/src/main/res/layout/activity_search_multi.xml +++ b/app/src/main/res/layout/activity_search_multi.xml @@ -1,14 +1,16 @@ - - + android:layout_height="wrap_content" + android:fitsSystemWindows="true" + app:elevation="0dp"> - + - \ No newline at end of file + \ 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 69c5fdc76..de5c7db40 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -60,6 +60,20 @@ @color/ripple_toolbar + +