Add option for top or bottom app bar

pull/1723/head
Alex Baker 2 years ago
parent 3d22d2d932
commit c5e71b76f3

@ -20,6 +20,9 @@ import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.app.ShareCompat
import androidx.core.view.forEach
import androidx.core.view.isVisible
import androidx.core.view.setMargins
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
@ -30,6 +33,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.bottomappbar.BottomAppBar
import com.google.android.material.snackbar.Snackbar
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.DateUtilities
@ -178,7 +182,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
coordinatorLayout = taskListCoordinator
recyclerView = bodyStandard.recyclerView
fab.setOnClickListener { createNewTask() }
bottomAppBar.setNavigationOnClickListener { callbacks.onNavigationIconClicked() }
}
filter = getFilter()
themeColor = if (filter.tint != 0) colorProvider.getThemeColor(filter.tint, true) else defaultThemeColor
@ -206,14 +209,31 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
setupRefresh(swipeRefreshLayout)
setupRefresh(emptyRefreshLayout)
binding.toolbar.title = filter.listingTitle
binding.toolbar.navigationIcon = null
binding.bottomAppBar.setOnMenuItemClickListener(this)
binding.appbarlayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _, verticalOffset ->
if (verticalOffset == 0 && binding.bottomAppBar.isScrolledDown) {
binding.bottomAppBar.performShow()
}
})
setupBottomMenu()
val toolbar = if (preferences.isTopAppBar) {
binding.bottomAppBar.isVisible = false
with (binding.fab) {
layoutParams = (layoutParams as CoordinatorLayout.LayoutParams).apply {
setMargins(resources.getDimensionPixelSize(R.dimen.keyline_first))
anchorId = View.NO_ID
gravity = Gravity.BOTTOM or Gravity.END
}
}
binding.toolbar.setNavigationIcon(R.drawable.ic_outline_menu_24px)
binding.toolbar
} else {
themeColor.apply(binding.bottomAppBar)
binding.bottomAppBar.isVisible = true
binding.toolbar.navigationIcon = null
binding.bottomAppBar
}
toolbar.setOnMenuItemClickListener(this)
toolbar.setNavigationOnClickListener { callbacks.onNavigationIconClicked() }
setupMenu(toolbar)
search = binding.toolbar.menu.findItem(R.id.menu_search).setOnActionExpandListener(this)
return binding.root
}
@ -241,16 +261,18 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
taskAdapter.setDataSource(adapter)
}
private fun setupBottomMenu() {
val menu = binding.bottomAppBar.menu
val bottomAppBar = binding.bottomAppBar
private fun setupMenu(appBar: Toolbar) {
val menu = appBar.menu
menu.clear()
if (filter.hasBeginningMenu()) {
bottomAppBar.inflateMenu(filter.beginningMenu)
appBar.inflateMenu(filter.beginningMenu)
}
bottomAppBar.inflateMenu(R.menu.menu_task_list_fragment_bottom)
appBar.inflateMenu(R.menu.menu_task_list_fragment_bottom)
if (filter.hasMenu()) {
bottomAppBar.inflateMenu(filter.menu)
appBar.inflateMenu(filter.menu)
}
if (appBar is BottomAppBar) {
menu.removeItem(R.id.menu_search)
}
val hidden = menu.findItem(R.id.menu_show_unstarted)
val completed = menu.findItem(R.id.menu_show_completed)
@ -275,7 +297,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
menu.findItem(R.id.menu_expand_subtasks).isVisible = false
}
menu.findItem(R.id.menu_voice_add).isVisible = device.voiceInputAvailable()
themeColor.apply(bottomAppBar)
}
private fun openFilter(filter: Filter?) {
@ -571,6 +592,9 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
if (searchQuery == null) {
searchByQuery("")
}
if (preferences.isTopAppBar) {
binding.toolbar.menu.forEach { it.isVisible = false }
}
return true
}
@ -579,7 +603,9 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
listViewModel.searchByFilter(filter)
searchJob?.cancel()
searchQuery = null
setupBottomMenu()
if (preferences.isTopAppBar) {
setupMenu(binding.toolbar)
}
return true
}

@ -0,0 +1,11 @@
package org.tasks.extensions
import android.content.res.Resources
import android.util.TypedValue
val Number.dp: Float
get() = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
this.toFloat(),
Resources.getSystem().displayMetrics
)

@ -519,6 +519,9 @@ class Preferences @JvmOverloads constructor(
val markdown: Boolean
get() = getBoolean(R.string.p_markdown, false)
val isTopAppBar: Boolean
get() = getIntegerFromString(R.string.p_app_bar_position, 1) == 0
companion object {
private const val PREF_SORT_SORT = "sort_sort" // $NON-NLS-1$

@ -84,8 +84,6 @@
android:contentDescription="@string/action_create_new_task"
app:backgroundTint="?attr/colorAccent"
app:layout_anchor="@id/bottomAppBar"
app:hideOnScroll="true"
app:layout_scrollFlags="scroll|enterAlways"
app:srcCompat="@drawable/ic_outline_add_24px" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -33,6 +33,12 @@
android:icon="@drawable/ic_outline_mic_none_24px"
android:title="@string/EPr_voiceInputEnabled_title"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_outline_search_24px"
android:title="@string/TLA_menu_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"/>
<item
android:id="@+id/menu_sort"
android:icon="@drawable/ic_outline_sort_24px"

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="default_app_bar_position">1</integer>
</resources>

@ -286,4 +286,10 @@
<item>0</item>
<item>1</item>
</string-array>
<string-array name="app_bar_position">
<item>@string/top</item>
<item>@string/bottom</item>
</string-array>
</resources>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="default_app_bar_position">0</integer>
<integer name="default_quiet_hours_start">79200000</integer> <!-- 22:00 -->
<integer name="default_quiet_hours_end">36000000</integer> <!-- 10:00 -->
<integer name="default_remind_time">64800000</integer> <!-- 18:00 -->

@ -446,4 +446,5 @@
<string name="p_picker_mode_date">picker_mode_date</string>
<string name="p_picker_mode_time">picker_mode_time</string>
<string name="p_markdown">markdown</string>
<string name="p_app_bar_position">app_bar_position</string>
</resources>

@ -710,4 +710,7 @@ File %1$s contained %2$s.\n\n
<string name="markdown">Markdown</string>
<string name="markdown_description">Enable Markdown in title and description</string>
<string name="completion_sound">Play completion sound</string>
<string name="app_bar_position">App bar position</string>
<string name="top">Top</string>
<string name="bottom">Bottom</string>
</resources>

@ -54,6 +54,14 @@
android:key="@string/task_list_options"
android:title="@string/task_list_options">
<ListPreference
android:defaultValue="@integer/default_app_bar_position"
android:key="@string/p_app_bar_position"
android:entries="@array/app_bar_position"
android:summary="%s"
android:entryValues="@array/two_values"
android:title="@string/app_bar_position" />
<SeekBarPreference
android:defaultValue="16"
android:key="@string/p_fontSize"

Loading…
Cancel
Save