Browse Source

Move catalogue filters to bottom sheet

arkon 5 years ago
parent
commit
8cfd80ba84

+ 0 - 11
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/SecondaryDrawerController.kt

@@ -1,11 +0,0 @@
-package eu.kanade.tachiyomi.ui.base.controller
-
-import android.view.ViewGroup
-import androidx.drawerlayout.widget.DrawerLayout
-
-interface SecondaryDrawerController {
-
-    fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup?
-
-    fun cleanupSecondaryDrawer(drawer: DrawerLayout)
-}

+ 24 - 38
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt

@@ -9,8 +9,6 @@ import android.view.MenuItem
 import android.view.View
 import android.view.ViewGroup
 import androidx.appcompat.widget.SearchView
-import androidx.core.view.GravityCompat
-import androidx.drawerlayout.widget.DrawerLayout
 import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -30,7 +28,6 @@ import eu.kanade.tachiyomi.source.CatalogueSource
 import eu.kanade.tachiyomi.source.model.FilterList
 import eu.kanade.tachiyomi.source.online.HttpSource
 import eu.kanade.tachiyomi.ui.base.controller.NucleusController
-import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController
 import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
 import eu.kanade.tachiyomi.ui.manga.MangaController
@@ -44,7 +41,6 @@ import eu.kanade.tachiyomi.util.view.visible
 import eu.kanade.tachiyomi.widget.AutofitRecyclerView
 import eu.kanade.tachiyomi.widget.EmptyView
 import java.util.concurrent.TimeUnit
-import kotlinx.android.synthetic.main.main_activity.drawer
 import rx.Observable
 import rx.Subscription
 import rx.android.schedulers.AndroidSchedulers
@@ -56,7 +52,6 @@ import uy.kohesive.injekt.injectLazy
  */
 open class BrowseCatalogueController(bundle: Bundle) :
         NucleusController<BrowseCataloguePresenter>(bundle),
-        SecondaryDrawerController,
         FlexibleAdapter.OnItemClickListener,
         FlexibleAdapter.OnItemLongClickListener,
         FlexibleAdapter.EndlessScrollListener,
@@ -79,9 +74,9 @@ open class BrowseCatalogueController(bundle: Bundle) :
     private var snack: Snackbar? = null
 
     /**
-     * Navigation view containing filter items.
+     * Sheet containing filter items.
      */
-    private var navView: CatalogueNavigationView? = null
+    private var filterSheet: CatalogueFilterSheet? = null
 
     /**
      * Recycler view with the list of results.
@@ -129,11 +124,31 @@ open class BrowseCatalogueController(bundle: Bundle) :
         adapter = FlexibleAdapter(null, this)
         setupRecycler(view)
 
-        navView?.setFilters(presenter.filterItems)
+        // Prepare filter sheet
+        initFilterSheet()
 
         binding.progress.visible()
     }
 
+    private fun initFilterSheet() {
+        filterSheet = CatalogueFilterSheet(
+            activity!!,
+            onSearchClicked = {
+                val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
+                showProgressBar()
+                adapter?.clear()
+                presenter.setSourceFilter(if (allDefault) FilterList() else presenter.sourceFilters)
+            },
+            onResetClicked = {
+                presenter.appliedFilters = FilterList()
+                val newFilters = presenter.source.getFilterList()
+                presenter.sourceFilters = newFilters
+                filterSheet?.setFilters(presenter.filterItems)
+            }
+        )
+        filterSheet?.setFilters(presenter.filterItems)
+    }
+
     override fun onDestroyView(view: View) {
         numColumnsSubscription?.unsubscribe()
         numColumnsSubscription = null
@@ -145,35 +160,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
         super.onDestroyView(view)
     }
 
-    override fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup? {
-        // Inflate and prepare drawer
-        val navView = drawer.inflate(R.layout.catalogue_drawer) as CatalogueNavigationView
-        this.navView = navView
-        navView.setFilters(presenter.filterItems)
-
-        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
-
-        navView.onSearchClicked = {
-            val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
-            showProgressBar()
-            adapter?.clear()
-            drawer.closeDrawer(GravityCompat.END)
-            presenter.setSourceFilter(if (allDefault) FilterList() else presenter.sourceFilters)
-        }
-
-        navView.onResetClicked = {
-            presenter.appliedFilters = FilterList()
-            val newFilters = presenter.source.getFilterList()
-            presenter.sourceFilters = newFilters
-            navView.setFilters(presenter.filterItems)
-        }
-        return navView
-    }
-
-    override fun cleanupSecondaryDrawer(drawer: DrawerLayout) {
-        navView = null
-    }
-
     private fun setupRecycler(view: View) {
         numColumnsSubscription?.unsubscribe()
 
@@ -292,7 +278,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
         when (item.itemId) {
             R.id.action_search -> expandActionViewFromInteraction = true
             R.id.action_display_mode -> swapDisplayMode()
-            R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) }
+            R.id.action_set_filter -> filterSheet?.show()
             R.id.action_open_in_web_view -> openInWebView()
         }
         return super.onOptionsItemSelected(item)

+ 59 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueFilterSheet.kt

@@ -0,0 +1,59 @@
+package eu.kanade.tachiyomi.ui.catalogue.browse
+
+import android.app.Activity
+import android.content.Context
+import android.util.AttributeSet
+import android.view.ViewGroup
+import com.google.android.material.bottomsheet.BottomSheetDialog
+import eu.davidea.flexibleadapter.FlexibleAdapter
+import eu.davidea.flexibleadapter.items.IFlexible
+import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.util.view.inflate
+import eu.kanade.tachiyomi.widget.SimpleNavigationView
+import kotlinx.android.synthetic.main.catalogue_drawer_content.view.reset_btn
+import kotlinx.android.synthetic.main.catalogue_drawer_content.view.search_btn
+
+class CatalogueFilterSheet(
+    activity: Activity,
+    onSearchClicked: () -> Unit,
+    onResetClicked: () -> Unit
+) : BottomSheetDialog(activity) {
+
+    private var filterNavView: FilterNavigationView
+
+    init {
+        filterNavView = FilterNavigationView(activity)
+        filterNavView.onSearchClicked = {
+            onSearchClicked()
+            this.dismiss()
+        }
+        filterNavView.onResetClicked = onResetClicked
+
+        setContentView(filterNavView)
+    }
+
+    fun setFilters(items: List<IFlexible<*>>) {
+        filterNavView.adapter.updateDataSet(items)
+    }
+
+    class FilterNavigationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
+        SimpleNavigationView(context, attrs) {
+
+        var onSearchClicked = {}
+        var onResetClicked = {}
+
+        val adapter: FlexibleAdapter<IFlexible<*>> = FlexibleAdapter<IFlexible<*>>(null)
+            .setDisplayHeadersAtStartUp(true)
+            .setStickyHeaders(true)
+
+        init {
+            recycler.adapter = adapter
+            recycler.setHasFixedSize(true)
+            val view = inflate(R.layout.catalogue_drawer_content)
+            ((view as ViewGroup).getChildAt(1) as ViewGroup).addView(recycler)
+            addView(view)
+            search_btn.setOnClickListener { onSearchClicked() }
+            reset_btn.setOnClickListener { onResetClicked() }
+        }
+    }
+}

+ 0 - 38
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueNavigationView.kt

@@ -1,38 +0,0 @@
-package eu.kanade.tachiyomi.ui.catalogue.browse
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.ViewGroup
-import eu.davidea.flexibleadapter.FlexibleAdapter
-import eu.davidea.flexibleadapter.items.IFlexible
-import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.util.view.inflate
-import eu.kanade.tachiyomi.widget.SimpleNavigationView
-import kotlinx.android.synthetic.main.catalogue_drawer_content.view.reset_btn
-import kotlinx.android.synthetic.main.catalogue_drawer_content.view.search_btn
-
-class CatalogueNavigationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
-    SimpleNavigationView(context, attrs) {
-
-    val adapter: FlexibleAdapter<IFlexible<*>> = FlexibleAdapter<IFlexible<*>>(null)
-            .setDisplayHeadersAtStartUp(true)
-            .setStickyHeaders(true)
-
-    var onSearchClicked = {}
-
-    var onResetClicked = {}
-
-    init {
-        recycler.adapter = adapter
-        recycler.setHasFixedSize(true)
-        val view = inflate(R.layout.catalogue_drawer_content)
-        ((view as ViewGroup).getChildAt(1) as ViewGroup).addView(recycler)
-        addView(view)
-        search_btn.setOnClickListener { onSearchClicked() }
-        reset_btn.setOnClickListener { onResetClicked() }
-    }
-
-    fun setFilters(items: List<IFlexible<*>>) {
-        adapter.updateDataSet(items)
-    }
-}

+ 0 - 9
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/latest/LatestUpdatesController.kt

@@ -2,8 +2,6 @@ package eu.kanade.tachiyomi.ui.catalogue.latest
 
 import android.os.Bundle
 import android.view.Menu
-import android.view.ViewGroup
-import androidx.drawerlayout.widget.DrawerLayout
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.source.CatalogueSource
 import eu.kanade.tachiyomi.ui.catalogue.browse.BrowseCatalogueController
@@ -27,11 +25,4 @@ class LatestUpdatesController(bundle: Bundle) : BrowseCatalogueController(bundle
         menu.findItem(R.id.action_search).isVisible = false
         menu.findItem(R.id.action_set_filter).isVisible = false
     }
-
-    override fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup? {
-        return null
-    }
-
-    override fun cleanupSecondaryDrawer(drawer: DrawerLayout) {
-    }
 }

+ 32 - 50
app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt

@@ -4,7 +4,6 @@ import android.app.SearchManager
 import android.content.Intent
 import android.os.Bundle
 import android.view.ViewGroup
-import androidx.core.view.GravityCompat
 import com.bluelinelabs.conductor.Conductor
 import com.bluelinelabs.conductor.Controller
 import com.bluelinelabs.conductor.ControllerChangeHandler
@@ -14,12 +13,12 @@ import eu.kanade.tachiyomi.Migrations
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 import eu.kanade.tachiyomi.data.preference.getOrDefault
+import eu.kanade.tachiyomi.databinding.MainActivityBinding
 import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi
 import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
 import eu.kanade.tachiyomi.ui.base.controller.DialogController
 import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController
 import eu.kanade.tachiyomi.ui.base.controller.RootController
-import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController
 import eu.kanade.tachiyomi.ui.base.controller.TabbedController
 import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 import eu.kanade.tachiyomi.ui.catalogue.CatalogueController
@@ -33,7 +32,6 @@ import eu.kanade.tachiyomi.ui.recent.history.HistoryController
 import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
 import java.util.Date
 import java.util.concurrent.TimeUnit
-import kotlinx.android.synthetic.main.main_activity.*
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
@@ -43,8 +41,6 @@ class MainActivity : BaseActivity() {
 
     private lateinit var router: Router
 
-    private var secondaryDrawer: ViewGroup? = null
-
     private val startScreenId by lazy {
         when (preferences.startScreen()) {
             2 -> R.id.nav_history
@@ -58,6 +54,8 @@ class MainActivity : BaseActivity() {
 
     private var isHandlingShortcut: Boolean = false
 
+    private lateinit var binding: MainActivityBinding
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -67,15 +65,16 @@ class MainActivity : BaseActivity() {
             return
         }
 
-        setContentView(R.layout.main_activity)
+        binding = MainActivityBinding.inflate(layoutInflater)
+        setContentView(binding.root)
 
-        setSupportActionBar(toolbar)
+        setSupportActionBar(binding.toolbar)
 
-        tabAnimator = ViewHeightAnimator(tabs)
-        bottomNavAnimator = ViewHeightAnimator(bottom_nav)
+        tabAnimator = ViewHeightAnimator(binding.tabs)
+        bottomNavAnimator = ViewHeightAnimator(binding.bottomNav)
 
         // Set behavior of bottom nav
-        bottom_nav.setOnNavigationItemSelectedListener { item ->
+        binding.bottomNav.setOnNavigationItemSelectedListener { item ->
             val id = item.itemId
 
             val currentRoot = router.backstack.firstOrNull()
@@ -104,16 +103,12 @@ class MainActivity : BaseActivity() {
         if (!router.hasRootController()) {
             // Set start screen
             if (!handleIntentAction(intent)) {
-                setSelectedDrawerItem(startScreenId)
+                setSelectedNavItem(startScreenId)
             }
         }
 
-        toolbar.setNavigationOnClickListener {
-            if (router.backstackSize == 1) {
-                drawer.openDrawer(GravityCompat.START)
-            } else {
-                onBackPressed()
-            }
+        binding.toolbar.setNavigationOnClickListener {
+            onBackPressed()
         }
 
         router.addChangeListener(object : ControllerChangeHandler.ControllerChangeListener {
@@ -165,9 +160,9 @@ class MainActivity : BaseActivity() {
     private fun setExtensionsBadge() {
         val updates = preferences.extensionUpdatesCount().getOrDefault()
         if (updates > 0) {
-            bottom_nav.getOrCreateBadge(R.id.nav_more).number = updates
+            binding.bottomNav.getOrCreateBadge(R.id.nav_more).number = updates
         } else {
-            bottom_nav.removeBadge(R.id.nav_more)
+            binding.bottomNav.removeBadge(R.id.nav_more)
         }
     }
 
@@ -197,15 +192,15 @@ class MainActivity : BaseActivity() {
         isHandlingShortcut = true
 
         when (intent.action) {
-            SHORTCUT_LIBRARY -> setSelectedDrawerItem(R.id.nav_library)
-            SHORTCUT_RECENTLY_UPDATED -> setSelectedDrawerItem(R.id.nav_updates)
-            SHORTCUT_RECENTLY_READ -> setSelectedDrawerItem(R.id.nav_history)
-            SHORTCUT_CATALOGUES -> setSelectedDrawerItem(R.id.nav_sources)
+            SHORTCUT_LIBRARY -> setSelectedNavItem(R.id.nav_library)
+            SHORTCUT_RECENTLY_UPDATED -> setSelectedNavItem(R.id.nav_updates)
+            SHORTCUT_RECENTLY_READ -> setSelectedNavItem(R.id.nav_history)
+            SHORTCUT_CATALOGUES -> setSelectedNavItem(R.id.nav_sources)
             SHORTCUT_EXTENSIONS -> {
                 if (router.backstackSize > 1) {
                     router.popToRoot()
                 }
-                setSelectedDrawerItem(R.id.nav_more)
+                setSelectedNavItem(R.id.nav_more)
                 router.pushController(ExtensionController().withFadeTransaction())
             }
             SHORTCUT_MANGA -> {
@@ -213,14 +208,14 @@ class MainActivity : BaseActivity() {
                 if (router.backstackSize > 1) {
                     router.popToRoot()
                 }
-                setSelectedDrawerItem(R.id.nav_library)
+                setSelectedNavItem(R.id.nav_library)
                 router.pushController(RouterTransaction.with(MangaController(extras)))
             }
             SHORTCUT_DOWNLOADS -> {
                 if (router.backstackSize > 1) {
                     router.popToRoot()
                 }
-                setSelectedDrawerItem(R.id.nav_more)
+                setSelectedNavItem(R.id.nav_more)
                 router.pushController(RouterTransaction.with(DownloadController()))
             }
             Intent.ACTION_SEARCH, "com.google.android.gms.actions.SEARCH_ACTION" -> {
@@ -258,24 +253,22 @@ class MainActivity : BaseActivity() {
 
     override fun onDestroy() {
         super.onDestroy()
-        bottom_nav?.setOnNavigationItemSelectedListener(null)
-        toolbar?.setNavigationOnClickListener(null)
+        binding.bottomNav.setOnNavigationItemSelectedListener(null)
+        binding.toolbar.setNavigationOnClickListener(null)
     }
 
     override fun onBackPressed() {
         val backstackSize = router.backstackSize
-        if (drawer.isDrawerOpen(GravityCompat.START) || drawer.isDrawerOpen(GravityCompat.END)) {
-            drawer.closeDrawers()
-        } else if (backstackSize == 1 && router.getControllerWithTag("$startScreenId") == null) {
-            setSelectedDrawerItem(startScreenId)
+        if (backstackSize == 1 && router.getControllerWithTag("$startScreenId") == null) {
+            setSelectedNavItem(startScreenId)
         } else if (backstackSize == 1 || !router.handleBack()) {
             super.onBackPressed()
         }
     }
 
-    private fun setSelectedDrawerItem(itemId: Int) {
+    private fun setSelectedNavItem(itemId: Int) {
         if (!isFinishing) {
-            bottom_nav.selectedItemId = itemId
+            binding.bottomNav.selectedItemId = itemId
         }
     }
 
@@ -298,31 +291,20 @@ class MainActivity : BaseActivity() {
         }
 
         if (from is TabbedController) {
-            from.cleanupTabs(tabs)
+            from.cleanupTabs(binding.tabs)
         }
         if (to is TabbedController) {
             tabAnimator.expand()
-            to.configureTabs(tabs)
+            to.configureTabs(binding.tabs)
         } else {
             tabAnimator.collapse()
-            tabs.setupWithViewPager(null)
-        }
-
-        if (from is SecondaryDrawerController) {
-            if (secondaryDrawer != null) {
-                from.cleanupSecondaryDrawer(drawer)
-                drawer.removeView(secondaryDrawer)
-                secondaryDrawer = null
-            }
-        }
-        if (to is SecondaryDrawerController) {
-            secondaryDrawer = to.createSecondaryDrawer(drawer)?.also { drawer.addView(it) }
+            binding.tabs.setupWithViewPager(null)
         }
 
         if (to is NoToolbarElevationController) {
-            appbar.disableElevation()
+            binding.appbar.disableElevation()
         } else {
-            appbar.enableElevation()
+            binding.appbar.enableElevation()
         }
     }
 

+ 0 - 23
app/src/main/java/eu/kanade/tachiyomi/widget/DrawerSwipeCloseListener.kt

@@ -1,23 +0,0 @@
-package eu.kanade.tachiyomi.widget
-
-import android.view.View
-import android.view.ViewGroup
-import androidx.drawerlayout.widget.DrawerLayout
-
-class DrawerSwipeCloseListener(
-    private val drawer: DrawerLayout,
-    private val navigationView: ViewGroup
-) : DrawerLayout.SimpleDrawerListener() {
-
-    override fun onDrawerOpened(drawerView: View) {
-        if (drawerView == navigationView) {
-            drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, drawerView)
-        }
-    }
-
-    override fun onDrawerClosed(drawerView: View) {
-        if (drawerView == navigationView) {
-            drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, drawerView)
-        }
-    }
-}

+ 0 - 8
app/src/main/res/layout/catalogue_drawer.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<eu.kanade.tachiyomi.ui.catalogue.browse.CatalogueNavigationView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/nav_view2"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:layout_gravity="end"
-    android:fitsSystemWindows="false" />
-

+ 2 - 3
app/src/main/res/layout/main_activity.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/drawer"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
@@ -55,4 +54,4 @@
 
     </LinearLayout>
 
-</androidx.drawerlayout.widget.DrawerLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>