From 0b07e83e3cbf56c9da5c899bf0be18ec4f3cd360 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 11 Mar 2022 19:22:31 +0200 Subject: [PATCH] Enhance tablet ui --- .../kotatsu/details/ui/ChaptersFragment.kt | 21 +++- .../kotatsu/details/ui/DetailsActivity.kt | 34 +++---- .../kotatsu/details/ui/DetailsFragment.kt | 20 +++- .../koitharu/kotatsu/main/ui/MainActivity.kt | 72 +++++++------- .../koitharu/kotatsu/utils/ext/InsetsExt.kt | 20 ++++ .../activity_details.xml | 0 .../layout-w720dp-land/activity_details.xml | 55 +++++++++++ .../res/layout-w720dp-land/activity_main.xml | 96 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/values-w980dp/dimens.xml | 6 ++ app/src/main/res/values/dimens.xml | 4 + 11 files changed, 267 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt rename app/src/main/res/{layout-w600dp => layout-land}/activity_details.xml (100%) create mode 100644 app/src/main/res/layout-w720dp-land/activity_details.xml create mode 100644 app/src/main/res/layout-w720dp-land/activity_main.xml create mode 100644 app/src/main/res/values-w980dp/dimens.xml 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 6ea44a8ac..4f4d1e1a5 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 @@ -9,6 +9,8 @@ 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 @@ -24,6 +26,7 @@ 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, @@ -200,11 +203,19 @@ class ChaptersFragment : BaseFragment(), } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerViewChapters.updatePadding( - left = insets.left, - right = insets.right, - bottom = insets.bottom + binding.spinnerBranches.height - ) + val root = binding.root + if (root.parent is FragmentContainerView) { + binding.recyclerViewChapters.updatePaddingRelative( + end = insets.getEnd(root), + bottom = insets.bottom + binding.spinnerBranches.height, + ) + } else { + binding.recyclerViewChapters.updatePadding( + left = insets.left, + right = insets.right, + bottom = insets.bottom + binding.spinnerBranches.height, + ) + } } private fun onChaptersChanged(list: 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 d8cb87ecf..7bea427f3 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 @@ -17,14 +17,12 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import kotlinx.coroutines.launch import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.ui.BaseActivity @@ -43,8 +41,7 @@ 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 { private val viewModel by viewModel { parametersOf(MangaIntent(intent)) @@ -54,8 +51,11 @@ class DetailsActivity : BaseActivity(), super.onCreate(savedInstanceState) setContentView(ActivityDetailsBinding.inflate(layoutInflater)) supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.pager.adapter = MangaDetailsAdapter(this) - TabLayoutMediator(binding.tabs, binding.pager, this).attach() + val pager = binding.pager + if (pager != null) { + pager.adapter = MangaDetailsAdapter(this) + TabLayoutMediator(checkNotNull(binding.tabs), pager, this).attach() + } viewModel.manga.observe(this, ::onMangaUpdated) viewModel.newChaptersCount.observe(this, ::onNewChaptersChanged) @@ -105,8 +105,9 @@ class DetailsActivity : BaseActivity(), topMargin = insets.top } } - if (binding.tabs.parent !is Toolbar) { - binding.tabs.updatePadding( + val tabs = binding.tabs + if (tabs != null && tabs.parent !is Toolbar) { + tabs.updatePadding( left = insets.left, right = insets.right ) @@ -114,7 +115,7 @@ class DetailsActivity : BaseActivity(), } private fun onNewChaptersChanged(newChapters: Int) { - val tab = binding.tabs.getTabAt(1) ?: return + val tab = binding.tabs?.getTabAt(1) ?: return if (newChapters == 0) { tab.removeBadge() } else { @@ -208,11 +209,7 @@ class DetailsActivity : BaseActivity(), viewModel.manga.value?.let { lifecycleScope.launch { if (!get().requestPinShortcut(it)) { - Snackbar.make( - binding.pager, - R.string.operation_not_supported, - Snackbar.LENGTH_SHORT - ).show() + binding.snackbar.show(getString(R.string.operation_not_supported)) } } } @@ -231,19 +228,18 @@ class DetailsActivity : BaseActivity(), override fun onSupportActionModeStarted(mode: ActionMode) { super.onSupportActionModeStarted(mode) - binding.pager.isUserInputEnabled = false + binding.pager?.isUserInputEnabled = false } override fun onSupportActionModeFinished(mode: ActionMode) { super.onSupportActionModeFinished(mode) - binding.pager.isUserInputEnabled = true + binding.pager?.isUserInputEnabled = true } fun showChapterMissingDialog(chapterId: Long) { val remoteManga = viewModel.getRemoteManga() if (remoteManga == null) { - Snackbar.make(binding.pager, R.string.chapter_is_missing, Snackbar.LENGTH_LONG) - .show() + binding.snackbar.show(getString( R.string.chapter_is_missing)) return } buildAlertDialog(this) { @@ -268,8 +264,6 @@ class DetailsActivity : BaseActivity(), companion object { - const val ACTION_MANGA_VIEW = "${BuildConfig.APPLICATION_ID}.action.VIEW_MANGA" - fun newIntent(context: Context, manga: Manga): Intent { return Intent(context, DetailsActivity::class.java) .putExtra(MangaIntent.KEY_MANGA, manga) 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 3cd328ce2..47993dd60 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,6 +13,8 @@ import androidx.core.net.toUri import androidx.core.text.parseAsHtml import androidx.core.view.isVisible import androidx.core.view.updatePadding +import androidx.core.view.updatePaddingRelative +import androidx.fragment.app.FragmentContainerView import coil.ImageLoader import coil.request.ImageRequest import coil.util.CoilUtils @@ -232,11 +234,19 @@ class DetailsFragment : BaseFragment(), View.OnClickList } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( - left = insets.left, - right = insets.right, - bottom = insets.bottom - ) + val root = binding.root + if (root.parent is FragmentContainerView) { + root.updatePaddingRelative( + start = insets.getStart(root), + bottom = insets.bottom, + ) + } else { + root.updatePadding( + left = insets.left, + right = insets.right, + bottom = insets.bottom, + ) + } } private fun bindTags(manga: Manga) { 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 3a3cea458..474ea72ba 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 @@ -53,10 +53,7 @@ import org.koitharu.kotatsu.suggestions.ui.SuggestionsFragment import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker import org.koitharu.kotatsu.tracker.ui.FeedFragment import org.koitharu.kotatsu.tracker.work.TrackWorker -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.hideKeyboard -import org.koitharu.kotatsu.utils.ext.measureHeight -import org.koitharu.kotatsu.utils.ext.resolveDp +import org.koitharu.kotatsu.utils.ext.* private const val TAG_PRIMARY = "primary" private const val TAG_SEARCH = "search" @@ -69,7 +66,8 @@ class MainActivity : BaseActivity(), private val searchSuggestionViewModel by viewModel() private lateinit var navHeaderBinding: NavigationHeaderBinding - private lateinit var drawerToggle: ActionBarDrawerToggle + private var drawerToggle: ActionBarDrawerToggle? = null + private var drawer: DrawerLayout? = null override val appBar: AppBarLayout get() = binding.appbar @@ -78,24 +76,31 @@ class MainActivity : BaseActivity(), super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater)) navHeaderBinding = NavigationHeaderBinding.inflate(layoutInflater) - drawerToggle = ActionBarDrawerToggle( - this, - binding.drawer, - binding.toolbar, - R.string.open_menu, - R.string.close_menu - ) - drawerToggle.setHomeAsUpIndicator(ContextCompat.getDrawable(this, R.drawable.ic_arrow_back)) - drawerToggle.setToolbarNavigationClickListener { - binding.searchView.hideKeyboard() - onBackPressed() + drawer = binding.root as? DrawerLayout + drawerToggle = drawer?.let { + ActionBarDrawerToggle( + this, + it, + binding.toolbar, + R.string.open_menu, + R.string.close_menu + ).apply { + setHomeAsUpIndicator(ContextCompat.getDrawable(this@MainActivity, R.drawable.ic_arrow_back)) + setToolbarNavigationClickListener { + binding.searchView.hideKeyboard() + onBackPressed() + } + it.addDrawerListener(this) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + } } - binding.drawer.addDrawerListener(drawerToggle) - supportActionBar?.setDisplayHomeAsUpEnabled(true) with(binding.searchView) { onFocusChangeListener = this@MainActivity searchSuggestionListener = this@MainActivity + if (drawer == null) { + drawableStart = ContextCompat.getDrawable(context, R.drawable.ic_search) + } } with(binding.navigationView) { @@ -132,26 +137,27 @@ class MainActivity : BaseActivity(), override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) - drawerToggle.isDrawerIndicatorEnabled = - binding.drawer.getDrawerLockMode(GravityCompat.START) == DrawerLayout.LOCK_MODE_UNLOCKED + drawerToggle?.isDrawerIndicatorEnabled = + drawer?.getDrawerLockMode(GravityCompat.START) == DrawerLayout.LOCK_MODE_UNLOCKED } override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) - drawerToggle.syncState() + drawerToggle?.syncState() } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - drawerToggle.onConfigurationChanged(newConfig) + drawerToggle?.onConfigurationChanged(newConfig) } override fun onBackPressed() { val fragment = supportFragmentManager.findFragmentByTag(TAG_SEARCH) binding.searchView.clearFocus() when { - binding.drawer.isDrawerOpen(binding.navigationView) -> binding.drawer.closeDrawer( - binding.navigationView) + drawer?.isDrawerOpen(binding.navigationView) == true -> { + drawer?.closeDrawer(binding.navigationView) + } fragment != null -> supportFragmentManager.commit { remove(fragment) setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) @@ -162,7 +168,7 @@ class MainActivity : BaseActivity(), } override fun onOptionsItemSelected(item: MenuItem): Boolean { - return drawerToggle.onOptionsItemSelected(item) || when (item.itemId) { + return drawerToggle?.onOptionsItemSelected(item) == true || when (item.itemId) { else -> super.onOptionsItemSelected(item) } } @@ -208,7 +214,7 @@ class MainActivity : BaseActivity(), else -> return false } } - binding.drawer.closeDrawers() + drawer?.closeDrawers() return true } @@ -221,8 +227,10 @@ class MainActivity : BaseActivity(), leftMargin = insets.left + topMargin rightMargin = insets.right + topMargin } - binding.container.updateLayoutParams { - topMargin = -(binding.appbar.measureHeight()) + if (drawer != null) { + binding.container.updateLayoutParams { + topMargin = -(binding.appbar.measureHeight()) + } } } @@ -354,13 +362,13 @@ class MainActivity : BaseActivity(), } private fun onSearchOpened() { - binding.drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) - drawerToggle.isDrawerIndicatorEnabled = false + drawer?.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) + drawerToggle?.isDrawerIndicatorEnabled = false } private fun onSearchClosed() { - binding.drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) - drawerToggle.isDrawerIndicatorEnabled = true + drawer?.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) + drawerToggle?.isDrawerIndicatorEnabled = true } private fun onFirstStart() { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt new file mode 100644 index 000000000..7276dab57 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt @@ -0,0 +1,20 @@ +package org.koitharu.kotatsu.utils.ext + +import android.view.View +import androidx.core.graphics.Insets + +fun Insets.getStart(view: View): Int { + return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + right + } else { + left + } +} + +fun Insets.getEnd(view: View): Int { + return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + left + } else { + right + } +} \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp/activity_details.xml b/app/src/main/res/layout-land/activity_details.xml similarity index 100% rename from app/src/main/res/layout-w600dp/activity_details.xml rename to app/src/main/res/layout-land/activity_details.xml diff --git a/app/src/main/res/layout-w720dp-land/activity_details.xml b/app/src/main/res/layout-w720dp-land/activity_details.xml new file mode 100644 index 000000000..bcf33f71a --- /dev/null +++ b/app/src/main/res/layout-w720dp-land/activity_details.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w720dp-land/activity_main.xml b/app/src/main/res/layout-w720dp-land/activity_main.xml new file mode 100644 index 000000000..63b80ee61 --- /dev/null +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 446d1ae2f..85c1bc8c4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.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/drawer" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".main.ui.MainActivity"> @@ -16,6 +15,7 @@ android:id="@id/container" android:layout_width="match_parent" android:layout_height="match_parent" + tools:layout="@layout/fragment_list" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> + + + 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 734613783..e2c130bde 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -21,4 +21,8 @@ + + + 600 + \ No newline at end of file