Navigation rail on landscape

pull/163/head
Koitharu 4 years ago
parent ebdc2dfb0e
commit eda72128da
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -2,9 +2,11 @@ package org.koitharu.kotatsu.main.ui
import android.app.ActivityOptions import android.app.ActivityOptions
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultCallback
import androidx.annotation.IdRes
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.app.ActivityOptionsCompat import androidx.core.app.ActivityOptionsCompat
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
@ -17,6 +19,7 @@ import androidx.transition.TransitionManager
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.AppBarLayout.LayoutParams.* import com.google.android.material.appbar.AppBarLayout.LayoutParams.*
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.navigation.NavigationBarView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -28,7 +31,6 @@ import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.databinding.ActivityMainBinding
import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.details.ui.DetailsActivity
import org.koitharu.kotatsu.favourites.ui.FavouritesContainerFragment import org.koitharu.kotatsu.favourites.ui.FavouritesContainerFragment
import org.koitharu.kotatsu.history.ui.HistoryListFragment
import org.koitharu.kotatsu.library.ui.LibraryFragment import org.koitharu.kotatsu.library.ui.LibraryFragment
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.MangaTag
@ -57,11 +59,12 @@ class MainActivity :
AppBarOwner, AppBarOwner,
View.OnClickListener, View.OnClickListener,
View.OnFocusChangeListener, View.OnFocusChangeListener,
SearchSuggestionListener { SearchSuggestionListener, NavigationBarView.OnItemSelectedListener {
private val viewModel by viewModel<MainViewModel>() private val viewModel by viewModel<MainViewModel>()
private val searchSuggestionViewModel by viewModel<SearchSuggestionViewModel>() private val searchSuggestionViewModel by viewModel<SearchSuggestionViewModel>()
private val voiceInputLauncher = registerForActivityResult(VoiceInputContract(), VoiceInputCallback()) private val voiceInputLauncher = registerForActivityResult(VoiceInputContract(), VoiceInputCallback())
private lateinit var navBar: NavigationBarView
override val appBar: AppBarLayout override val appBar: AppBarLayout
get() = binding.appbar get() = binding.appbar
@ -70,42 +73,30 @@ class MainActivity :
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(ActivityMainBinding.inflate(layoutInflater)) setContentView(ActivityMainBinding.inflate(layoutInflater))
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> navBar = checkNotNull(binding.bottomNav ?: binding.navRail)
if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) { if (binding.bottomNav != null) {
val elevation = binding.bottomNav.elevation ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
window.setNavigationBarTransparentCompat(this@MainActivity, elevation) if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) {
val elevation = binding.bottomNav?.elevation ?: 0f
window.setNavigationBarTransparentCompat(this@MainActivity, elevation)
}
insets
} }
insets ViewCompat.requestApplyInsets(binding.root)
} }
ViewCompat.requestApplyInsets(binding.root)
with(binding.searchView) { with(binding.searchView) {
onFocusChangeListener = this@MainActivity onFocusChangeListener = this@MainActivity
searchSuggestionListener = this@MainActivity searchSuggestionListener = this@MainActivity
} }
binding.bottomNav.setOnItemSelectedListener { item -> navBar.setOnItemSelectedListener(this)
when (item.itemId) { binding.fab.setOnClickListener(this)
R.id.nav_library -> {
setPrimaryFragment(LibraryFragment.newInstance())
}
R.id.nav_explore -> {
setPrimaryFragment(FavouritesContainerFragment.newInstance())
}
R.id.nav_feed -> {
setPrimaryFragment(FeedFragment.newInstance())
}
}
appBar.setExpanded(true)
true
}
binding.fab.setOnClickListener(this@MainActivity)
binding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null binding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null
supportFragmentManager.findFragmentByTag(TAG_PRIMARY)?.let { supportFragmentManager.findFragmentByTag(TAG_PRIMARY)?.let {
if (it is HistoryListFragment) binding.fab.show() else binding.fab.hide() if (it is LibraryFragment) binding.fab.show() else binding.fab.hide()
} } ?: onNavigationItemSelected(navBar.selectedItemId)
if (savedInstanceState == null) { if (savedInstanceState == null) {
onFirstStart() onFirstStart()
} }
@ -129,6 +120,10 @@ class MainActivity :
} }
} }
override fun onNavigationItemSelected(item: MenuItem): Boolean {
return onNavigationItemSelected(item.itemId)
}
override fun onClick(v: View) { override fun onClick(v: View) {
when (v.id) { when (v.id) {
R.id.fab -> viewModel.openLastReader() R.id.fab -> viewModel.openLastReader()
@ -220,6 +215,23 @@ class MainActivity :
showBottomNav(true) showBottomNav(true)
} }
private fun onNavigationItemSelected(@IdRes itemId: Int): Boolean {
when (itemId) {
R.id.nav_library -> {
setPrimaryFragment(LibraryFragment.newInstance())
}
R.id.nav_explore -> {
setPrimaryFragment(FavouritesContainerFragment.newInstance())
}
R.id.nav_feed -> {
setPrimaryFragment(FeedFragment.newInstance())
}
else -> return false
}
appBar.setExpanded(true)
return true
}
private fun onOpenReader(manga: Manga) { private fun onOpenReader(manga: Manga) {
val options = ActivityOptions.makeScaleUpAnimation(binding.fab, 0, 0, binding.fab.width, binding.fab.height) val options = ActivityOptions.makeScaleUpAnimation(binding.fab, 0, 0, binding.fab.width, binding.fab.height)
startActivity(ReaderActivity.newIntent(this, manga), options?.toBundle()) startActivity(ReaderActivity.newIntent(this, manga), options?.toBundle())
@ -240,6 +252,7 @@ class MainActivity :
private fun setPrimaryFragment(fragment: Fragment) { private fun setPrimaryFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.replace(R.id.container, fragment, TAG_PRIMARY) .replace(R.id.container, fragment, TAG_PRIMARY)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit() .commit()
adjustFabVisibility(topFragment = fragment) adjustFabVisibility(topFragment = fragment)
} }
@ -268,11 +281,14 @@ class MainActivity :
} }
private fun showBottomNav(visible: Boolean) { private fun showBottomNav(visible: Boolean) {
if (visible) { binding.bottomNav?.run {
binding.bottomNav.slideUp() if (visible) {
} else { slideUp()
binding.bottomNav.slideDown() } else {
slideDown()
}
} }
binding.navRail?.isVisible = visible
} }
private fun onFirstStart() { private fun onFirstStart() {

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".main.ui.MainActivity">
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navRail"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:labelVisibilityMode="labeled"
app:menu="@menu/nav_bottom" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:layout="@layout/fragment_list" />
<com.google.android.material.appbar.KotatsuAppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:stateListAnimator="@null">
<FrameLayout
android:id="@+id/toolbar_card"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginVertical="8dp"
android:background="@drawable/toolbar_background"
android:theme="@style/ThemeOverlay.Kotatsu.MainToolbar"
app:layout_scrollFlags="scroll|enterAlways|snap">
<com.google.android.material.appbar.MaterialToolbar
android:id="@id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="6dp"
android:focusable="true"
android:focusableInTouchMode="true"
app:contentInsetStartWithNavigation="0dp"
app:navigationIcon="?attr/actionModeWebSearchDrawable">
<org.koitharu.kotatsu.search.ui.widget.SearchEditText
android:id="@+id/searchView"
style="@style/Widget.Kotatsu.SearchView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginEnd="8dp"
android:background="@null"
android:gravity="center_vertical"
android:hint="@string/search_manga"
android:imeOptions="actionSearch"
android:importantForAutofill="no"
android:singleLine="true"
tools:drawableEnd="@drawable/abc_ic_clear_material" />
</com.google.android.material.appbar.MaterialToolbar>
</FrameLayout>
</com.google.android.material.appbar.KotatsuAppBarLayout>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/_continue"
android:visibility="gone"
app:backgroundTint="?attr/colorContainer"
app:icon="@drawable/ic_read"
app:layout_anchor="@id/container"
app:layout_anchorGravity="bottom|end"
app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior"
app:layout_dodgeInsetEdges="bottom"
tools:visibility="visible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>
Loading…
Cancel
Save