Toolbar Menu Items Fix

This commit is contained in:
MCAxiaz 2020-01-14 22:13:01 -08:00 committed by Jay
parent 7008752639
commit 3e04619404
6 changed files with 76 additions and 31 deletions

View File

@ -85,10 +85,11 @@ abstract class BaseController(bundle: Bundle? = null) : RestoreViewOnCreateContr
} }
/** /**
* Workaround for disappearing menu items when collapsing an expandable item like a SearchView. * Workaround for buggy menu item layout after expanding/collapsing an expandable item like a SearchView.
* This method should be removed when fixed upstream. * This method should be removed when fixed upstream.
* Issue link: https://issuetracker.google.com/issues/37657375 * Issue link: https://issuetracker.google.com/issues/37657375
*/ */
var expandActionViewFromInteraction = false
fun MenuItem.fixExpand(onExpand: ((MenuItem) -> Boolean)? = null, onCollapse: ((MenuItem) -> Boolean)? = null) { fun MenuItem.fixExpand(onExpand: ((MenuItem) -> Boolean)? = null, onCollapse: ((MenuItem) -> Boolean)? = null) {
setOnActionExpandListener(object : MenuItem.OnActionExpandListener { setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean { override fun onMenuItemActionExpand(item: MenuItem): Boolean {
@ -101,6 +102,25 @@ abstract class BaseController(bundle: Bundle? = null) : RestoreViewOnCreateContr
return onCollapse?.invoke(item) ?: true return onCollapse?.invoke(item) ?: true
} }
}) })
if (expandActionViewFromInteraction) {
expandActionViewFromInteraction = false
expandActionView()
}
}
/**
* Workaround for menu items not disappearing when expanding an expandable item like a SearchView.
* [expandActionViewFromInteraction] should be set to true in [onOptionsItemSelected] when the expandable item is selected
* This method should be called as part of [MenuItem.OnActionExpandListener.onMenuItemActionExpand]
*/
fun invalidateMenuOnExpand(): Boolean {
return if (expandActionViewFromInteraction) {
activity?.invalidateOptionsMenu()
false
} else {
true
}
} }
} }

View File

@ -261,36 +261,38 @@ open class BrowseCatalogueController(bundle: Bundle) :
inflater.inflate(R.menu.catalogue_list, menu) inflater.inflate(R.menu.catalogue_list, menu)
// Initialize search menu // Initialize search menu
menu.findItem(R.id.action_search).apply { val searchItem = menu.findItem(R.id.action_search)
val searchView = actionView as SearchView val searchView = searchItem.actionView as SearchView
val query = presenter.query val query = presenter.query
if (!query.isBlank()) { if (!query.isBlank()) {
expandActionView() searchItem.expandActionView()
searchView.setQuery(query, true) searchView.setQuery(query, true)
searchView.clearFocus() searchView.clearFocus()
} }
val searchEventsObservable = searchView.queryTextChangeEvents() val searchEventsObservable = searchView.queryTextChangeEvents()
.skip(1) .skip(1)
.filter { router.backstack.lastOrNull()?.controller() == this@BrowseCatalogueController } .filter { router.backstack.lastOrNull()?.controller() == this@BrowseCatalogueController }
.share() .share()
val writingObservable = searchEventsObservable val writingObservable = searchEventsObservable
.filter { !it.isSubmitted } .filter { !it.isSubmitted }
.debounce(1250, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) .debounce(1250, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
val submitObservable = searchEventsObservable val submitObservable = searchEventsObservable
.filter { it.isSubmitted } .filter { it.isSubmitted }
searchViewSubscription?.unsubscribe() searchViewSubscription?.unsubscribe()
searchViewSubscription = Observable.merge(writingObservable, submitObservable) searchViewSubscription = Observable.merge(writingObservable, submitObservable)
.map { it.queryText().toString() } .map { it.queryText().toString() }
.subscribeUntilDestroy { searchWithQuery(it) } .subscribeUntilDestroy { searchWithQuery(it) }
fixExpand(onCollapse = { searchItem.fixExpand(
onExpand = { invalidateMenuOnExpand() },
onCollapse = {
searchWithQuery("") searchWithQuery("")
true true
}) }
} )
// Setup filters button // Setup filters button
menu.findItem(R.id.action_set_filter).apply { menu.findItem(R.id.action_set_filter).apply {
@ -324,6 +326,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_search -> expandActionViewFromInteraction = true
R.id.action_display_mode -> swapDisplayMode() R.id.action_display_mode -> swapDisplayMode()
R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) } R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) }
R.id.action_open_in_browser -> openInBrowser() R.id.action_open_in_browser -> openInBrowser()

View File

@ -85,6 +85,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(),
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_search -> expandActionViewFromInteraction = true
R.id.action_filter -> { R.id.action_filter -> {
router.pushController((RouterTransaction.with(SettingsExtensionsController())) router.pushController((RouterTransaction.with(SettingsExtensionsController()))
.popChangeHandler(SettingsExtensionsFadeChangeHandler()) .popChangeHandler(SettingsExtensionsFadeChangeHandler())
@ -152,7 +153,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(),
} }
// Fixes problem with the overflow icon showing up in lieu of search // Fixes problem with the overflow icon showing up in lieu of search
searchItem.fixExpand() searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
val autoItem = menu.findItem(R.id.action_auto_check) val autoItem = menu.findItem(R.id.action_auto_check)
val preferences:PreferencesHelper = Injekt.get() val preferences:PreferencesHelper = Injekt.get()

View File

@ -449,7 +449,7 @@ class LibraryController(
searchRelay.call(query) searchRelay.call(query)
} }
searchItem.fixExpand() searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
} }
fun search(query:String) { fun search(query:String) {
@ -468,6 +468,7 @@ class LibraryController(
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_search -> expandActionViewFromInteraction = true
R.id.action_filter -> { R.id.action_filter -> {
navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) } navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) }
} }

View File

@ -185,16 +185,36 @@ class SettingsSourcesController : SettingsController(),
} }
// Fixes problem with the overflow icon showing up in lieu of search // Fixes problem with the overflow icon showing up in lieu of search
searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
}
var expandActionViewFromInteraction = false
private fun MenuItem.fixExpand(onExpand: ((MenuItem) -> Boolean)? = null, onCollapse: ((MenuItem) -> Boolean)? = null) {
setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean { override fun onMenuItemActionExpand(item: MenuItem): Boolean {
return true return onExpand?.invoke(item) ?: true
} }
override fun onMenuItemActionCollapse(item: MenuItem): Boolean { override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
return true
return onCollapse?.invoke(item) ?: true
} }
}) })
if (expandActionViewFromInteraction) {
expandActionViewFromInteraction = false
expandActionView()
}
}
private fun invalidateMenuOnExpand(): Boolean {
return if (expandActionViewFromInteraction) {
activity?.invalidateOptionsMenu()
false
} else {
true
}
} }
private fun drawSources() { private fun drawSources() {

View File

@ -12,7 +12,7 @@
android:id="@+id/action_filter" android:id="@+id/action_filter"
android:title="@string/action_filter" android:title="@string/action_filter"
android:icon="@drawable/ic_filter_list_white_24dp" android:icon="@drawable/ic_filter_list_white_24dp"
app:showAsAction="always"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/action_auto_check" android:id="@+id/action_auto_check"