From 6f7efa9e26e744fbfc51991a88996cf9651e7949 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 28 Jul 2021 08:03:16 +0300 Subject: [PATCH] Optimize layout --- .../kotatsu/base/ui/widgets/ChipsView.kt | 8 +- .../kotatsu/details/ui/DetailsFragment.kt | 14 +-- .../koitharu/kotatsu/main/ui/MainActivity.kt | 26 ++-- app/src/main/res/layout/item_empty_state.xml | 1 + app/src/main/res/layout/item_error_footer.xml | 2 +- .../main/res/layout/item_loading_footer.xml | 9 +- app/src/main/res/layout/item_manga_grid.xml | 63 ++++------ .../res/layout/item_manga_list_details.xml | 116 +++++++++--------- app/src/main/res/layout/navigation_header.xml | 53 ++++---- app/src/main/res/values/dimens.xml | 3 +- 10 files changed, 142 insertions(+), 153 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt index e766dbf08..f8a839efc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt @@ -37,15 +37,15 @@ class ChipsView @JvmOverloads constructor( } } - fun setChips(items: List) { + fun setChips(items: Collection) { suppressLayoutCompat(true) try { for ((i, model) in items.withIndex()) { val chip = getChildAt(i) as Chip? ?: addChip() bindChip(chip, model) } - for (i in items.size until childCount) { - removeViewAt(i) + if (childCount > items.size) { + removeViews(items.size, childCount - items.size) } } finally { suppressLayoutCompat(false) @@ -60,6 +60,7 @@ class ChipsView @JvmOverloads constructor( chip.isCheckedIconVisible = true chip.setChipIconResource(model.icon) } + chip.isClickable = onChipClickListener != null chip.tag = model.data } @@ -71,7 +72,6 @@ class ChipsView @JvmOverloads constructor( chip.isCloseIconVisible = false chip.setEnsureMinTouchTargetSize(false) chip.setOnClickListener(chipOnClickListener) - chip.isClickable = onChipClickListener != null addView(chip) return chip } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 05ed0a9c4..a427f2b3e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -13,7 +13,6 @@ import androidx.core.view.updatePadding import coil.ImageLoader import coil.util.CoilUtils import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koin.android.ext.android.inject @@ -30,13 +29,13 @@ import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.utils.FileSizeUtils import org.koitharu.kotatsu.utils.ext.* +import kotlin.random.Random class DetailsFragment : BaseFragment(), View.OnClickListener, View.OnLongClickListener { private val viewModel by sharedViewModel() private val coil by inject(mode = LazyThreadSafetyMode.NONE) - private var tagsJob: Job? = null override fun onInflateView( inflater: LayoutInflater, @@ -196,16 +195,13 @@ class DetailsFragment : BaseFragment(), View.OnClickList } private fun bindTags(manga: Manga) { - tagsJob?.cancel() - tagsJob = viewLifecycleScope.launch { - val tags = ArrayList(manga.tags.size + 2) - for (tag in manga.tags) { - tags += ChipsView.ChipModel( + binding.chipsTags.setChips( + manga.tags.map { tag -> + ChipsView.ChipModel( title = tag.title, icon = 0 ) } - binding.chipsTags.setChips(tags) - } + ) } } \ No newline at end of file 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 25f55e51b..2788a6ee0 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 @@ -13,10 +13,7 @@ import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.graphics.Insets -import androidx.core.view.GravityCompat -import androidx.core.view.isVisible -import androidx.core.view.updateLayoutParams -import androidx.core.view.updatePadding +import androidx.core.view.* import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction @@ -88,17 +85,18 @@ class MainActivity : BaseActivity(), binding.drawer.addDrawerListener(drawerToggle) supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.searchView.apply { + with(binding.searchView) { onFocusChangeListener = this@MainActivity searchSuggestionListener = this@MainActivity } - binding.navigationView.apply { + with(binding.navigationView) { val menuView = findViewById(com.google.android.material.R.id.design_navigation_view) - navHeaderBinding.root.setOnApplyWindowInsetsListener { v, insets -> - v.updatePadding(top = insets.systemWindowInsetTop) + ViewCompat.setOnApplyWindowInsetsListener(navHeaderBinding.root) { v, insets -> + val systemWindowInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(top = systemWindowInsets.top) // NavigationView doesn't dispatch insets to the menu view, so pad the bottom here. - menuView.updatePadding(bottom = insets.systemWindowInsetBottom) + menuView.updatePadding(bottom = systemWindowInsets.bottom) insets } addHeaderView(navHeaderBinding.root) @@ -117,9 +115,7 @@ class MainActivity : BaseActivity(), openDefaultSection() } if (savedInstanceState == null) { - TrackWorker.setup(applicationContext) - AppUpdateChecker(this).launchIfNeeded() - OnboardDialogFragment.showWelcome(get(), supportFragmentManager) + onFirstStart() } viewModel.onOpenReader.observe(this, this::onOpenReader) @@ -347,6 +343,12 @@ class MainActivity : BaseActivity(), binding.toolbarCard.cardElevation = searchViewElevation } + private fun onFirstStart() { + TrackWorker.setup(applicationContext) + AppUpdateChecker(this@MainActivity).launchIfNeeded() + OnboardDialogFragment.showWelcome(get(), supportFragmentManager) + } + private companion object { const val TAG_PRIMARY = "primary" diff --git a/app/src/main/res/layout/item_empty_state.xml b/app/src/main/res/layout/item_empty_state.xml index 83385bb3f..0d7f40c65 100644 --- a/app/src/main/res/layout/item_empty_state.xml +++ b/app/src/main/res/layout/item_empty_state.xml @@ -13,6 +13,7 @@ android:layout_width="98dp" android:layout_height="98dp" android:layout_marginBottom="16dp" + tools:ignore="ContentDescription" tools:src="@drawable/ic_alert_outline" /> + android:layout_height="@dimen/list_footer_height_outer"> + android:indeterminate="true" + app:indicatorSize="@dimen/list_footer_height_inner" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_manga_grid.xml b/app/src/main/res/layout/item_manga_grid.xml index 6a168ea68..439dd081e 100644 --- a/app/src/main/res/layout/item_manga_grid.xml +++ b/app/src/main/res/layout/item_manga_grid.xml @@ -1,50 +1,41 @@ - + android:background="@drawable/list_selector" + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_margin="4dp" + app:cardCornerRadius="4dp" + app:cardElevation="4dp"> - + android:scaleType="centerCrop" + android:orientation="horizontal" + tools:ignore="ContentDescription" /> - + - + - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_manga_list_details.xml b/app/src/main/res/layout/item_manga_list_details.xml index 11ebedae3..2c8e07b0e 100644 --- a/app/src/main/res/layout/item_manga_list_details.xml +++ b/app/src/main/res/layout/item_manga_list_details.xml @@ -8,86 +8,80 @@ android:background="@drawable/list_selector" android:orientation="horizontal"> + + + + + + + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:layout_marginBottom="8dp" + android:orientation="vertical"> - + + - - - - + android:layout_marginBottom="4dp" + android:ellipsize="none" + android:gravity="center_vertical" + android:requiresFadingEdge="horizontal" + android:singleLine="true" + android:textSize="16sp" + tools:text="@tools:sample/lorem/random" /> + android:orientation="horizontal"> - - - - - - - - - + android:layout_gravity="bottom" + android:drawablePadding="4dp" + android:paddingStart="6dp" + app:drawableEndCompat="@drawable/ic_star" + tools:ignore="RtlSymmetry" + tools:text="9.6" /> diff --git a/app/src/main/res/layout/navigation_header.xml b/app/src/main/res/layout/navigation_header.xml index f4acadd0d..4b3527d16 100644 --- a/app/src/main/res/layout/navigation_header.xml +++ b/app/src/main/res/layout/navigation_header.xml @@ -1,40 +1,43 @@ - + android:fitsSystemWindows="true"> - + + - - - - - - + android:layout_alignTop="@id/imageView_logo" + android:layout_alignBottom="@id/imageView_logo" + android:layout_marginStart="@dimen/nav_item_horizontal_padding" + android:layout_toEndOf="@id/imageView_logo" + android:gravity="center_vertical" + android:singleLine="true" + android:text="@string/app_name" + android:textAppearance="@style/TextAppearance.AppCompat.Title" /> - \ No newline at end of file + \ 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 6b0ba74bd..a08cbf9eb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -22,7 +22,8 @@ 120dp 34dp 16dp - 48dp + 36dp + 48dp 16dp