From c115bcc163f29df5716eb6c343e3d6ad4c9752f6 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 13 Mar 2022 17:10:34 +0200 Subject: [PATCH] Improve details activity layout --- .../core/parser/site/ComickFunRepository.kt | 2 +- .../kotatsu/details/ui/ChaptersFragment.kt | 40 ++-- .../kotatsu/details/ui/DetailsActivity.kt | 36 +++- .../koitharu/kotatsu/main/ui/MainActivity.kt | 1 + .../main/res/layout-land/activity_details.xml | 49 ----- .../main/res/layout-land/dialog_list_mode.xml | 81 +++++++ .../layout-w600dp-port/fragment_details.xml | 198 ------------------ .../fragment_details.xml | 44 ++-- .../layout-w720dp-land/activity_details.xml | 55 ----- .../res/layout-w720dp/activity_details.xml | 79 +++++++ .../res/layout-w720dp/fragment_chapters.xml | 28 +++ app/src/main/res/layout/activity_details.xml | 27 +-- app/src/main/res/values-w980dp/dimens.xml | 6 - app/src/main/res/values/dimens.xml | 7 - 14 files changed, 281 insertions(+), 372 deletions(-) delete mode 100644 app/src/main/res/layout-land/activity_details.xml create mode 100644 app/src/main/res/layout-land/dialog_list_mode.xml delete mode 100644 app/src/main/res/layout-w600dp-port/fragment_details.xml rename app/src/main/res/{layout-w600dp-land => layout-w600dp}/fragment_details.xml (92%) delete mode 100644 app/src/main/res/layout-w720dp-land/activity_details.xml create mode 100644 app/src/main/res/layout-w720dp/activity_details.xml create mode 100644 app/src/main/res/layout-w720dp/fragment_chapters.xml delete mode 100644 app/src/main/res/values-w980dp/dimens.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ComickFunRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ComickFunRepository.kt index bd0b858f1..3d19907c8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ComickFunRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ComickFunRepository.kt @@ -77,7 +77,7 @@ class ComickFunRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposi altTitle = null, url = slug, publicUrl = "https://$domain/comic/$slug", - rating = jo.getDouble("rating").toFloat() / 10f, + rating = jo.optDouble("rating", -10.0).toFloat() / 10f, isNsfw = false, coverUrl = jo.getString("cover_url"), largeCoverUrl = null, 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 4e66273a4..0048e8fe5 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 @@ -4,13 +4,12 @@ import android.app.ActivityOptions import android.os.Bundle import android.view.* import android.widget.AdapterView +import android.widget.Spinner import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updatePadding -import androidx.core.view.updatePaddingRelative -import androidx.fragment.app.FragmentContainerView import androidx.recyclerview.widget.RecyclerView import com.google.android.material.divider.MaterialDividerItemDecoration import org.koin.androidx.viewmodel.ext.android.sharedViewModel @@ -26,7 +25,6 @@ import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState -import org.koitharu.kotatsu.utils.ext.getEnd class ChaptersFragment : BaseFragment(), OnListItemClickListener, @@ -59,21 +57,9 @@ class ChaptersFragment : BaseFragment(), setHasFixedSize(true) adapter = chaptersAdapter } - val branchesAdapter = BranchesAdapter() - binding.spinnerBranches.adapter = branchesAdapter - binding.spinnerBranches.onItemSelectedListener = this - + binding.spinnerBranches?.let(::initSpinner) viewModel.isLoading.observe(viewLifecycleOwner, this::onLoadingStateChanged) viewModel.chapters.observe(viewLifecycleOwner, this::onChaptersChanged) - viewModel.branches.observe(viewLifecycleOwner) { - branchesAdapter.setItems(it) - binding.spinnerBranches.isVisible = it.size > 1 - } - viewModel.selectedBranchIndex.observe(viewLifecycleOwner) { - if (it != -1 && it != binding.spinnerBranches.selectedItemPosition) { - binding.spinnerBranches.setSelection(it) - } - } viewModel.isChaptersReversed.observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } @@ -82,7 +68,7 @@ class ChaptersFragment : BaseFragment(), override fun onDestroyView() { chaptersAdapter = null selectionDecoration = null - binding.spinnerBranches.adapter = null + binding.spinnerBranches?.adapter = null super.onDestroyView() } @@ -169,7 +155,8 @@ class ChaptersFragment : BaseFragment(), } override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - viewModel.setSelectedBranch(binding.spinnerBranches.selectedItem as String?) + val spinner = binding.spinnerBranches ?: return + viewModel.setSelectedBranch(spinner.selectedItem as String?) } override fun onNothingSelected(parent: AdapterView<*>?) = Unit @@ -204,10 +191,25 @@ class ChaptersFragment : BaseFragment(), override fun onWindowInsetsChanged(insets: Insets) { binding.recyclerViewChapters.updatePadding( - bottom = insets.bottom + binding.spinnerBranches.height, + bottom = insets.bottom + (binding.spinnerBranches?.height ?: 0), ) } + private fun initSpinner(spinner: Spinner) { + val branchesAdapter = BranchesAdapter() + spinner.adapter = branchesAdapter + spinner.onItemSelectedListener = this + viewModel.branches.observe(viewLifecycleOwner) { + branchesAdapter.setItems(it) + spinner.isVisible = it.size > 1 + } + viewModel.selectedBranchIndex.observe(viewLifecycleOwner) { + if (it != -1 && it != spinner.selectedItemPosition) { + spinner.setSelection(it) + } + } + } + private fun onChaptersChanged(list: List) { chaptersAdapter?.items = list } 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 10c22b67a..24bf3130b 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 @@ -6,12 +6,16 @@ import android.net.Uri import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.Spinner import android.widget.Toast import androidx.appcompat.view.ActionMode import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.Insets import androidx.core.net.toFile +import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope @@ -32,6 +36,7 @@ import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.os.ShortcutsRepository import org.koitharu.kotatsu.databinding.ActivityDetailsBinding +import org.koitharu.kotatsu.details.ui.adapter.BranchesAdapter import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState @@ -40,7 +45,8 @@ import org.koitharu.kotatsu.utils.ShareHelper import org.koitharu.kotatsu.utils.ext.buildAlertDialog import org.koitharu.kotatsu.utils.ext.getDisplayMessage -class DetailsActivity : BaseActivity(), TabLayoutMediator.TabConfigurationStrategy { +class DetailsActivity : BaseActivity(), TabLayoutMediator.TabConfigurationStrategy, + AdapterView.OnItemSelectedListener { private val viewModel by viewModel { parametersOf(MangaIntent(intent)) @@ -49,12 +55,16 @@ class DetailsActivity : BaseActivity(), TabLayoutMediato override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityDetailsBinding.inflate(layoutInflater)) - supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.run { + setDisplayHomeAsUpEnabled(true) + setDisplayShowTitleEnabled(false) + } val pager = binding.pager if (pager != null) { pager.adapter = MangaDetailsAdapter(this) TabLayoutMediator(checkNotNull(binding.tabs), pager, this).attach() } + binding.spinnerBranches?.let(::initSpinner) viewModel.manga.observe(this, ::onMangaUpdated) viewModel.newChaptersCount.observe(this, ::onNewChaptersChanged) @@ -226,6 +236,13 @@ class DetailsActivity : BaseActivity(), TabLayoutMediato binding.pager?.isUserInputEnabled = true } + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + val spinner = binding.spinnerBranches ?: return + viewModel.setSelectedBranch(spinner.selectedItem as String?) + } + + override fun onNothingSelected(parent: AdapterView<*>?) = Unit + fun showChapterMissingDialog(chapterId: Long) { val remoteManga = viewModel.getRemoteManga() if (remoteManga == null) { @@ -252,6 +269,21 @@ class DetailsActivity : BaseActivity(), TabLayoutMediato }.show() } + private fun initSpinner(spinner: Spinner) { + val branchesAdapter = BranchesAdapter() + spinner.adapter = branchesAdapter + spinner.onItemSelectedListener = this + viewModel.branches.observe(this) { + branchesAdapter.setItems(it) + spinner.isVisible = it.size > 1 + } + viewModel.selectedBranchIndex.observe(this) { + if (it != -1 && it != spinner.selectedItemPosition) { + spinner.setSelection(it) + } + } + } + companion object { fun newIntent(context: Context, manga: Manga): Intent { 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 be471f458..b8d8cb999 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 @@ -209,6 +209,7 @@ class MainActivity : BaseActivity(), } } drawer?.closeDrawers() + appBar.setExpanded(true) return true } diff --git a/app/src/main/res/layout-land/activity_details.xml b/app/src/main/res/layout-land/activity_details.xml deleted file mode 100644 index 6bf664eea..000000000 --- a/app/src/main/res/layout-land/activity_details.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/dialog_list_mode.xml b/app/src/main/res/layout-land/dialog_list_mode.xml new file mode 100644 index 000000000..f103a0ac3 --- /dev/null +++ b/app/src/main/res/layout-land/dialog_list_mode.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp-port/fragment_details.xml b/app/src/main/res/layout-w600dp-port/fragment_details.xml deleted file mode 100644 index c42301de6..000000000 --- a/app/src/main/res/layout-w600dp-port/fragment_details.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp-land/fragment_details.xml b/app/src/main/res/layout-w600dp/fragment_details.xml similarity index 92% rename from app/src/main/res/layout-w600dp-land/fragment_details.xml rename to app/src/main/res/layout-w600dp/fragment_details.xml index 55df1bb95..d751d0c6c 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_details.xml +++ b/app/src/main/res/layout-w600dp/fragment_details.xml @@ -17,8 +17,8 @@ android:id="@+id/imageView_cover" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="16dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" android:foreground="?selectableItemBackground" android:scaleType="centerCrop" android:transitionName="cover" @@ -35,9 +35,9 @@ android:id="@+id/textView_title" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="16dp" - android:layout_marginEnd="16dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="3" android:textAppearance="?attr/textAppearanceHeadlineSmall" @@ -50,9 +50,9 @@ android:id="@+id/textView_subtitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="6dp" - android:layout_marginEnd="16dp" + android:layout_marginStart="8dp" + android:layout_marginTop="4dp" + android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="3" android:textAppearance="?attr/textAppearanceBodyMedium" @@ -65,11 +65,11 @@ android:id="@+id/textView_author" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="12dp" + android:layout_marginStart="6dp" android:layout_marginTop="2dp" - android:layout_marginEnd="12dp" + android:layout_marginEnd="6dp" android:background="@drawable/list_selector" - android:padding="4dp" + android:padding="2dp" android:singleLine="true" android:textColor="?attr/colorTertiary" android:textStyle="bold" @@ -84,9 +84,9 @@ android:id="@+id/textView_state" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" + android:layout_marginStart="8dp" android:layout_marginTop="4dp" - android:layout_marginEnd="16dp" + android:layout_marginEnd="8dp" android:drawablePadding="4dp" android:singleLine="true" android:textAppearance="?attr/textAppearanceBodySmall" @@ -96,12 +96,19 @@ tools:drawableStart="@drawable/ic_state_finished" tools:text="Finished" /> + + @@ -128,7 +135,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:enabled="false" android:text="@string/read" @@ -140,14 +146,6 @@ app:layout_constraintTop_toBottomOf="@id/info_layout" tools:text="@string/_continue" /> - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-w720dp/activity_details.xml b/app/src/main/res/layout-w720dp/activity_details.xml new file mode 100644 index 000000000..337b9ec77 --- /dev/null +++ b/app/src/main/res/layout-w720dp/activity_details.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w720dp/fragment_chapters.xml b/app/src/main/res/layout-w720dp/fragment_chapters.xml new file mode 100644 index 000000000..386ce6fb0 --- /dev/null +++ b/app/src/main/res/layout-w720dp/fragment_chapters.xml @@ -0,0 +1,28 @@ + + + + + + + + \ 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 5a723948f..8190e9c82 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -3,7 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".details.ui.DetailsActivity"> @@ -12,24 +11,28 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:liftOnScroll="false" - app:elevation="0dp"> + app:elevation="0dp" + app:liftOnScroll="false"> + app:layout_scrollFlags="scroll|enterAlways" + tools:ignore="PrivateResource"> - + + + diff --git a/app/src/main/res/values-w980dp/dimens.xml b/app/src/main/res/values-w980dp/dimens.xml deleted file mode 100644 index 32b68f0c3..000000000 --- a/app/src/main/res/values-w980dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 760 - - \ 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 e2c130bde..5003ad1fc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -18,11 +18,4 @@ 36dp 48dp 16dp - - - - - - 600 - \ No newline at end of file