Update drawer headers

* Move chevron to end
* Animate chevron
* 'Add' button replaces 'Create new ...' rows
pull/1722/head
Alex Baker 2 years ago
parent ad4af1a2cb
commit 08ff146320

@ -1,6 +1,6 @@
package com.todoroo.astrid.adapter
import android.app.Activity
import android.content.Context
import android.view.View
import android.widget.ImageView
import android.widget.TextView
@ -10,9 +10,9 @@ import org.tasks.databinding.FilterAdapterActionBinding
import org.tasks.themes.DrawableUtil
class ActionViewHolder internal constructor(
private val activity: Activity,
itemView: View,
private val onClick: ((FilterListItem?) -> Unit)?) : RecyclerView.ViewHolder(itemView) {
private val context: Context,
itemView: View,
private val onClick: ((FilterListItem?) -> Unit)?) : RecyclerView.ViewHolder(itemView) {
private val row: View
private val text: TextView
@ -28,7 +28,7 @@ class ActionViewHolder internal constructor(
fun bind(filter: FilterListItem) {
text.text = filter.listingTitle
icon.setImageDrawable(DrawableUtil.getWrapped(activity, filter.icon))
icon.setImageDrawable(DrawableUtil.getWrapped(context, filter.icon))
if (onClick != null) {
row.setOnClickListener {
onClick.invoke(filter)

@ -11,19 +11,14 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.FilterListItem
import com.todoroo.astrid.api.FilterListItem.Type.*
import org.tasks.LocalBroadcastManager
import org.tasks.billing.Inventory
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskDao
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.locale.Locale
import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import java.util.*
import javax.inject.Inject
@ -33,10 +28,8 @@ class FilterAdapter @Inject constructor(
private val locale: Locale,
private val inventory: Inventory,
private val colorProvider: ColorProvider,
private val preferences: Preferences,
private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao,
private val localBroadcastManager: LocalBroadcastManager) : BaseAdapter() {
private val subheaderClickHandler: SubheaderClickHandler,
) : BaseAdapter() {
private var selected: Filter? = null
private var items: List<FilterListItem> = ArrayList()
@ -80,13 +73,7 @@ class FilterAdapter @Inject constructor(
newView, false, locale, activity, inventory, colorProvider, null)
ACTION -> ActionViewHolder(activity, newView, null)
SEPARATOR -> SeparatorViewHolder(newView)
SUBHEADER -> SubheaderViewHolder(
newView,
activity as AppCompatActivity,
preferences,
googleTaskDao,
caldavDao,
localBroadcastManager)
SUBHEADER -> SubheaderViewHolder(newView, subheaderClickHandler)
}
newView
}
@ -104,7 +91,8 @@ class FilterAdapter @Inject constructor(
when (item.itemType) {
ITEM -> (viewHolder as FilterViewHolder).bind(item, item == selected, 0)
ACTION -> (viewHolder as ActionViewHolder).bind(item)
SUBHEADER -> (viewHolder as SubheaderViewHolder).bind((item as NavigationDrawerSubheader))
SUBHEADER ->
(viewHolder as SubheaderViewHolder).bind((item as NavigationDrawerSubheader))
else -> {}
}
return view

@ -1,6 +1,6 @@
package com.todoroo.astrid.adapter
import android.app.Activity
import android.content.Context
import android.view.View
import android.widget.CheckedTextView
import android.widget.ImageView
@ -22,13 +22,14 @@ import org.tasks.themes.CustomIcons.getIconResId
import org.tasks.themes.DrawableUtil
class FilterViewHolder internal constructor(
itemView: View,
private val navigationDrawer: Boolean,
private val locale: Locale,
private val activity: Activity,
private val inventory: Inventory,
private val colorProvider: ColorProvider,
private val onClick: ((FilterListItem?) -> Unit)?) : RecyclerView.ViewHolder(itemView) {
itemView: View,
private val navigationDrawer: Boolean,
private val locale: Locale,
private val context: Context,
private val inventory: Inventory,
private val colorProvider: ColorProvider,
private val onClick: ((FilterListItem?) -> Unit)?
) : RecyclerView.ViewHolder(itemView) {
private val row: View
private val text: CheckedTextView
@ -63,7 +64,7 @@ class FilterViewHolder internal constructor(
text.isChecked = selected
}
val icon = getIcon(filter)
this.icon.setImageDrawable(DrawableUtil.getWrapped(activity, icon))
this.icon.setImageDrawable(DrawableUtil.getWrapped(context, icon))
this.icon.drawable.setTint(getColor(filter))
text.text = filter.listingTitle
if (count == null || count == 0) {
@ -94,7 +95,7 @@ class FilterViewHolder internal constructor(
return color.primaryColor
}
}
return activity.getColor(R.color.text_primary)
return context.getColor(R.color.text_primary)
}
private fun getIcon(filter: FilterListItem): Int {

@ -9,7 +9,6 @@ import android.app.Activity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.api.Filter
@ -18,14 +17,10 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.channels.Channel
import org.tasks.LocalBroadcastManager
import org.tasks.activities.DragAndDropDiffer
import org.tasks.billing.Inventory
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskDao
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.locale.Locale
import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import java.util.*
import java.util.concurrent.Executors
@ -33,15 +28,13 @@ import javax.inject.Inject
import kotlin.math.max
class NavigationDrawerAdapter @Inject constructor(
private val activity: Activity,
private val locale: Locale,
private val inventory: Inventory,
private val colorProvider: ColorProvider,
private val preferences: Preferences,
private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao,
private val localBroadcastManager: LocalBroadcastManager)
: RecyclerView.Adapter<RecyclerView.ViewHolder>(), DragAndDropDiffer<FilterListItem, MutableList<FilterListItem>> {
private val activity: Activity,
private val locale: Locale,
private val inventory: Inventory,
private val colorProvider: ColorProvider,
private val subheaderClickHandler: SubheaderClickHandler,
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(),
DragAndDropDiffer<FilterListItem, MutableList<FilterListItem>> {
private lateinit var onClick: (FilterListItem?) -> Unit
private var selected: Filter? = null
@ -83,19 +76,14 @@ class NavigationDrawerAdapter @Inject constructor(
return when (type) {
FilterListItem.Type.ITEM -> FilterViewHolder(
view, true, locale, activity, inventory, colorProvider) { onClickFilter(it) }
FilterListItem.Type.SUBHEADER -> SubheaderViewHolder(
view,
activity as AppCompatActivity,
preferences,
googleTaskDao,
caldavDao,
localBroadcastManager)
FilterListItem.Type.SUBHEADER -> SubheaderViewHolder(view, subheaderClickHandler)
FilterListItem.Type.ACTION -> ActionViewHolder(activity, view) { onClickFilter(it) }
else -> SeparatorViewHolder(view)
}
}
private fun onClickFilter(filter: FilterListItem?) = onClick(if (filter == selected) null else filter)
private fun onClickFilter(filter: FilterListItem?) =
onClick(if (filter == selected) null else filter)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = getItem(position)

@ -0,0 +1,55 @@
package com.todoroo.astrid.adapter
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskDao
import org.tasks.dialogs.NewFilterDialog
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.*
import org.tasks.preferences.MainPreferences
import org.tasks.preferences.Preferences
import org.tasks.ui.NavigationDrawerFragment
import javax.inject.Inject
class SubheaderClickHandler @Inject constructor(
private val activity: Activity,
private val preferences: Preferences,
private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao,
private val localBroadcastManager: LocalBroadcastManager,
): SubheaderViewHolder.ClickHandler {
override fun onClick(subheader: NavigationDrawerSubheader) {
(activity as AppCompatActivity).lifecycleScope.launch {
val collapsed = !subheader.isCollapsed
when (subheader.subheaderType) {
PREFERENCE -> preferences.setBoolean(subheader.id.toInt(), collapsed)
GOOGLE_TASKS -> googleTaskDao.setCollapsed(subheader.id, collapsed)
CALDAV, TASKS, ETESYNC -> caldavDao.setCollapsed(subheader.id, collapsed)
}
localBroadcastManager.broadcastRefreshList()
}
}
override fun onAdd(subheader: NavigationDrawerSubheader) {
when (subheader.addIntentRc) {
NavigationDrawerFragment.REQUEST_NEW_FILTER ->
NewFilterDialog.newFilterDialog().show(
(activity as AppCompatActivity).supportFragmentManager,
FRAG_TAG_NEW_FILTER
)
else -> activity.startActivityForResult(subheader.addIntent, subheader.addIntentRc)
}
}
override fun showError() =
activity.startActivity(Intent(activity, MainPreferences::class.java))
companion object {
private const val FRAG_TAG_NEW_FILTER = "frag_tag_new_filter"
}
}

@ -1,77 +1,68 @@
package com.todoroo.astrid.adapter
import android.content.Intent
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskDao
import org.tasks.databinding.FilterAdapterSubheaderBinding
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType
import org.tasks.preferences.MainPreferences
import org.tasks.preferences.Preferences
import org.tasks.themes.DrawableUtil
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType.ETESYNC
internal class SubheaderViewHolder(
itemView: View,
private val activity: AppCompatActivity,
private val preferences: Preferences,
private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao,
private val localBroadcastManager: LocalBroadcastManager)
: RecyclerView.ViewHolder(itemView) {
itemView: View,
private val clickHandler: ClickHandler,
): RecyclerView.ViewHolder(itemView) {
interface ClickHandler {
fun onClick(subheader: NavigationDrawerSubheader)
fun onAdd(subheader: NavigationDrawerSubheader)
fun showError()
}
private val text: TextView
private val chevron: ImageView
private val add: ImageView
private val errorIcon: ImageView
private var rotation = 0f
private lateinit var subheader: NavigationDrawerSubheader
private fun onClick() {
activity.lifecycleScope.launch {
val collapsed = !subheader.isCollapsed
when (subheader.subheaderType) {
SubheaderType.PREFERENCE -> preferences.setBoolean(subheader.id.toInt(), collapsed)
SubheaderType.GOOGLE_TASKS -> googleTaskDao.setCollapsed(subheader.id, collapsed)
SubheaderType.CALDAV, SubheaderType.TASKS, SubheaderType.ETESYNC ->
caldavDao.setCollapsed(subheader.id, collapsed)
}
localBroadcastManager.broadcastRefreshList()
}
}
fun bind(subheader: NavigationDrawerSubheader) {
add.isVisible = subheader.addIntent != null
this.subheader = subheader
text.text = subheader.listingTitle
when {
subheader.error || subheader.subheaderType == SubheaderType.ETESYNC ->
subheader.error || subheader.subheaderType == ETESYNC ->
with(errorIcon) {
setColorFilter(ContextCompat.getColor(activity, R.color.overdue))
setColorFilter(ContextCompat.getColor(itemView.context, R.color.overdue))
visibility = View.VISIBLE
}
else -> errorIcon.visibility = View.GONE
}
DrawableUtil.setRightDrawable(
itemView.context,
text,
if (subheader.isCollapsed) R.drawable.ic_keyboard_arrow_down_black_18dp else R.drawable.ic_keyboard_arrow_up_black_18dp)
rotation = if (subheader.isCollapsed) 180f else 0f
chevron.rotation = rotation
}
private fun rotate() {
rotation = if (rotation == 0f) 180f else 0f
chevron.animate().rotation(rotation).setDuration(250).start()
}
init {
FilterAdapterSubheaderBinding.bind(itemView).let {
text = it.text
errorIcon = it.iconError
it.subheaderRow.setOnClickListener { onClick() }
}
errorIcon.setOnClickListener {
activity.startActivity(Intent(activity, MainPreferences::class.java))
chevron = it.chevron
add = it.addItem
it.subheaderRow.setOnClickListener {
rotate()
clickHandler.onClick(subheader)
}
}
errorIcon.setOnClickListener { clickHandler.showError() }
add.setOnClickListener { clickHandler.onAdd(subheader) }
}
}

@ -24,13 +24,10 @@ import org.tasks.R
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.*
import org.tasks.databinding.ActivityTagOrganizerBinding
import org.tasks.dialogs.NewFilterDialog.Companion.newFilterDialog
import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerAction
import org.tasks.filters.PlaceFilter
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.preferences.Preferences
import org.tasks.ui.NavigationDrawerFragment.Companion.REQUEST_NEW_FILTER
import javax.inject.Inject
@AndroidEntryPoint
@ -96,39 +93,31 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
}
private fun onClick(item: FilterListItem?) {
if (item is NavigationDrawerAction) {
when (item.requestCode) {
REQUEST_NEW_FILTER ->
newFilterDialog().show(supportFragmentManager, FRAG_TAG_NEW_FILTER)
else -> startActivity(item.intent)
}
} else {
when (item) {
is GtasksFilter ->
Intent(this, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, item.list)
.apply(this::startActivity)
is CaldavFilter ->
lifecycleScope.launch {
caldavDao.getAccountByUuid(item.account)?.let {
Intent(this@NavigationDrawerCustomization, it.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, item.calendar)
.apply { startActivity(this) }
}
when (item) {
is GtasksFilter ->
Intent(this, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, item.list)
.apply(this::startActivity)
is CaldavFilter ->
lifecycleScope.launch {
caldavDao.getAccountByUuid(item.account)?.let {
Intent(this@NavigationDrawerCustomization, it.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR, item.calendar)
.apply { startActivity(this) }
}
is CustomFilter ->
Intent(this, FilterSettingsActivity::class.java)
.putExtra(FilterSettingsActivity.TOKEN_FILTER, item)
.apply(this::startActivity)
is TagFilter ->
Intent(this, TagSettingsActivity::class.java)
.putExtra(TagSettingsActivity.EXTRA_TAG_DATA, item.tagData)
.apply(this::startActivity)
is PlaceFilter ->
Intent(this, PlaceSettingsActivity::class.java)
.putExtra(PlaceSettingsActivity.EXTRA_PLACE, item.place as Parcelable)
.apply(this::startActivity)
}
}
is CustomFilter ->
Intent(this, FilterSettingsActivity::class.java)
.putExtra(FilterSettingsActivity.TOKEN_FILTER, item)
.apply(this::startActivity)
is TagFilter ->
Intent(this, TagSettingsActivity::class.java)
.putExtra(TagSettingsActivity.EXTRA_TAG_DATA, item.tagData)
.apply(this::startActivity)
is PlaceFilter ->
Intent(this, PlaceSettingsActivity::class.java)
.putExtra(PlaceSettingsActivity.EXTRA_PLACE, item.place as Parcelable)
.apply(this::startActivity)
}
}
@ -251,6 +240,5 @@ class NavigationDrawerCustomization : ThemedInjectingAppCompatActivity(), Toolba
companion object {
private val NO_MOVEMENT = makeMovementFlags(0, 0)
private val ALLOW_DRAGGING = makeMovementFlags(UP or DOWN, 0)
private const val FRAG_TAG_NEW_FILTER = "frag_tag_new_filter"
}
}

@ -64,7 +64,10 @@ class FilterProvider @Inject constructor(
false,
collapsed,
SubheaderType.PREFERENCE,
R.string.p_collapse_debug.toLong()))
R.string.p_collapse_debug.toLong(),
0,
null,
))
.apply { if (collapsed) return this }
.plus(listOf(
BuiltInFilterExposer.getNoListFilter(),
@ -91,18 +94,14 @@ class FilterProvider @Inject constructor(
false,
collapsed,
SubheaderType.PREFERENCE,
R.string.p_collapse_filters.toLong()))
R.string.p_collapse_filters.toLong(),
NavigationDrawerFragment.REQUEST_NEW_FILTER,
if (showCreate) Intent() else null))
.apply { if (collapsed) return this }
.plusAllIf(showBuiltIn) {
builtInFilterExposer.filters()
}
.plus(filterDao.getFilters().map(::CustomFilter).sort())
.plusIf(showCreate) {
NavigationDrawerAction(
context.getString(R.string.add_filter),
R.drawable.ic_outline_add_24px,
NavigationDrawerFragment.REQUEST_NEW_FILTER)
}
}
private suspend fun addTags(showCreate: Boolean): List<FilterListItem> =
@ -116,7 +115,13 @@ class FilterProvider @Inject constructor(
false,
collapsed,
SubheaderType.PREFERENCE,
R.string.p_collapse_tags.toLong()))
R.string.p_collapse_tags.toLong(),
NavigationDrawerFragment.REQUEST_NEW_LIST,
if (showCreate) {
Intent(context, TagSettingsActivity::class.java)
} else {
null
}))
.apply { if (collapsed) return this }
.plus(tagDataDao.getTagFilters()
.filterIf(preferences.getBoolean(R.string.p_tags_hide_unused, false)) {
@ -124,13 +129,6 @@ class FilterProvider @Inject constructor(
}
.map(TagFilters::toTagFilter)
.sort())
.plusIf(showCreate) {
NavigationDrawerAction(
context.getString(R.string.new_tag),
R.drawable.ic_outline_add_24px,
Intent(context, TagSettingsActivity::class.java),
NavigationDrawerFragment.REQUEST_NEW_LIST)
}
}
private suspend fun addPlaces(showCreate: Boolean): List<FilterListItem> =
@ -144,7 +142,13 @@ class FilterProvider @Inject constructor(
false,
collapsed,
SubheaderType.PREFERENCE,
R.string.p_collapse_locations.toLong()))
R.string.p_collapse_locations.toLong(),
NavigationDrawerFragment.REQUEST_NEW_PLACE,
if (showCreate) {
Intent(context, LocationPickerActivity::class.java)
} else {
null
}))
.apply { if (collapsed) return this }
.plus(locationDao.getPlaceFilters()
.filterIf(preferences.getBoolean(R.string.p_places_hide_unused, false)) {
@ -152,13 +156,6 @@ class FilterProvider @Inject constructor(
}
.map(LocationFilters::toLocationFilter)
.sort())
.plusIf(showCreate) {
NavigationDrawerAction(
context.getString(R.string.add_place),
R.drawable.ic_outline_add_24px,
Intent(context, LocationPickerActivity::class.java),
NavigationDrawerFragment.REQUEST_NEW_PLACE)
}
}
private suspend fun getAllFilters(showCreate: Boolean = true, showBuiltIn: Boolean = true): List<FilterListItem> =
@ -216,20 +213,19 @@ class FilterProvider @Inject constructor(
account.error?.isNotBlank() ?: false,
account.isCollapsed,
SubheaderType.GOOGLE_TASKS,
account.id))
account.id,
NavigationDrawerFragment.REQUEST_NEW_LIST,
if (showCreate) {
Intent(context, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_ACCOUNT, account)
} else {
null
}))
.apply { if (account.isCollapsed) return this }
.plus(googleTaskListDao
.getGoogleTaskFilters(account.account!!)
.map(GoogleTaskFilters::toGtasksFilter)
.sort())
.plusIf(showCreate) {
NavigationDrawerAction(
context.getString(R.string.new_list),
R.drawable.ic_outline_add_24px,
Intent(context, GoogleTaskListSettingsActivity::class.java)
.putExtra(GoogleTaskListSettingsActivity.EXTRA_ACCOUNT, account),
NavigationDrawerFragment.REQUEST_NEW_LIST)
}
private suspend fun caldavFilters(showCreate: Boolean = true): List<FilterListItem> =
caldavDao.getAccounts()
@ -252,20 +248,23 @@ class FilterProvider @Inject constructor(
account.isEteSyncAccount -> SubheaderType.ETESYNC
else -> SubheaderType.CALDAV
},
account.id))
account.id,
NavigationDrawerFragment.REQUEST_NEW_LIST,
if (showCreate) {
Intent(context, account.listSettingsClass())
.putExtra(
BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT,
account
)
} else {
null
}
))
.apply { if (account.isCollapsed) return this }
.plus(caldavDao
.getCaldavFilters(account.uuid!!)
.map(CaldavFilters::toCaldavFilter)
.sort())
.plusIf(showCreate) {
NavigationDrawerAction(
context.getString(R.string.new_list),
R.drawable.ic_outline_add_24px,
Intent(context, account.listSettingsClass())
.putExtra(BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOUNT, account),
NavigationDrawerFragment.REQUEST_NEW_LIST)
}
companion object {
private val COMPARATOR = Comparator<Filter> { f1, f2 ->

@ -1,8 +1,10 @@
package org.tasks.filters;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.os.ParcelCompat;
import com.todoroo.astrid.api.FilterListItem;
@ -29,15 +31,27 @@ public class NavigationDrawerSubheader extends FilterListItem {
private boolean collapsed;
private SubheaderType subheaderType;
private long id;
@Nullable
private Intent addIntent;
private int addIntentRc;
private NavigationDrawerSubheader() {}
public NavigationDrawerSubheader(
String listingTitle, boolean error, boolean collapsed, SubheaderType subheaderType, long id) {
String listingTitle,
boolean error,
boolean collapsed,
SubheaderType subheaderType,
long id,
int addIntentRc,
@Nullable Intent addIntent
) {
this.error = error;
this.collapsed = collapsed;
this.subheaderType = subheaderType;
this.id = id;
this.addIntent = addIntent;
this.addIntentRc = addIntentRc;
this.listingTitle = listingTitle;
}
@ -49,6 +63,15 @@ public class NavigationDrawerSubheader extends FilterListItem {
return collapsed;
}
@Nullable
public Intent getAddIntent() {
return addIntent;
}
public int getAddIntentRc() {
return addIntentRc;
}
public SubheaderType getSubheaderType() {
return subheaderType;
}
@ -60,13 +83,15 @@ public class NavigationDrawerSubheader extends FilterListItem {
collapsed = ParcelCompat.readBoolean(source);
subheaderType = (SubheaderType) source.readSerializable();
id = source.readLong();
addIntent = source.readParcelable(getClass().getClassLoader());
addIntentRc = source.readInt();
}
@Override
public boolean areItemsTheSame(@NonNull FilterListItem other) {
return other instanceof NavigationDrawerSubheader
&& subheaderType == ((NavigationDrawerSubheader) other).getSubheaderType()
&& id == ((NavigationDrawerSubheader) other).getId();
&& id == other.getId();
}
@Override
@ -113,6 +138,8 @@ public class NavigationDrawerSubheader extends FilterListItem {
ParcelCompat.writeBoolean(dest, collapsed);
dest.writeSerializable(subheaderType);
dest.writeLong(id);
dest.writeParcelable(addIntent, 0);
dest.writeInt(addIntentRc);
}
@Override

@ -27,7 +27,6 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.billing.PurchaseActivity
import org.tasks.data.TaskDao
import org.tasks.dialogs.NewFilterDialog
import org.tasks.extensions.Context.openUri
import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerAction
@ -96,8 +95,6 @@ class NavigationDrawerFragment : BottomSheetDialogFragment() {
REQUEST_PURCHASE ->
startActivity(Intent(context, PurchaseActivity::class.java))
REQUEST_DONATE -> context?.openUri(R.string.url_donate)
REQUEST_NEW_FILTER -> NewFilterDialog.newFilterDialog()
.show(parentFragmentManager, FRAG_TAG_NEW_FILTER)
else -> activity?.startActivityForResult(item.intent, item.requestCode)
}
}
@ -154,7 +151,6 @@ class NavigationDrawerFragment : BottomSheetDialogFragment() {
const val REQUEST_DONATE = 10103
const val REQUEST_NEW_PLACE = 10104
const val REQUEST_NEW_FILTER = 101015
private const val FRAG_TAG_NEW_FILTER = "frag_tag_new_filter"
private const val EXTRA_SELECTED = "extra_selected"
fun newNavigationDrawer(selected: Filter?): NavigationDrawerFragment {

@ -7,6 +7,8 @@
android:id="@+id/subheader_row"
android:background="?attr/selectableItemBackground"
android:focusable="true"
android:paddingStart="0dp"
android:paddingEnd="@dimen/half_keyline_first"
android:layout_height="wrap_content">
<View
@ -16,41 +18,64 @@
android:layout_gravity="top" />
<ImageView
android:id="@+id/icon_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignBottom="@id/text"
android:layout_below="@id/divider"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="0dp"
android:background="@null"
android:paddingEnd="@dimen/keyline_first"
android:alpha="@dimen/alpha_secondary"
android:clickable="true"
android:focusable="true"
android:scaleType="center"
android:src="@drawable/ic_outline_sync_problem_24px"
app:tint="@color/overdue"
android:visibility="gone" />
android:id="@+id/chevron"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/half_keyline_first"
android:src="@drawable/ic_keyboard_arrow_down_black_24dp"
app:tint="@color/icon_tint_with_alpha"
android:layout_toStartOf="@id/add_item"
android:layout_alignWithParentIfMissing="true"
android:layout_alignBottom="@id/text"
android:layout_below="@id/divider" />
<ImageView
android:id="@+id/add_item"
android:background="?attr/selectableItemBackgroundBorderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/half_keyline_first"
android:layout_alignParentEnd="true"
app:tint="@color/icon_tint_with_alpha"
android:layout_toStartOf="@id/icon_error"
android:layout_alignWithParentIfMissing="true"
android:layout_alignBottom="@id/text"
android:layout_below="@id/divider"
android:src="@drawable/ic_outline_add_24px" />
<ImageView
android:id="@+id/icon_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignBottom="@id/text"
android:layout_below="@id/divider"
android:padding="@dimen/half_keyline_first"
android:background="@null"
android:alpha="@dimen/alpha_secondary"
android:clickable="true"
android:focusable="true"
android:scaleType="center"
android:src="@drawable/ic_outline_sync_problem_24px"
app:tint="@color/overdue"
android:visibility="gone" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:background="@null"
android:textColor="@color/text_secondary"
android:fontFamily="@string/font_fontFamily_medium"
android:layout_alignParentStart="true"
android:layout_below="@id/divider"
android:gravity="start|center_vertical"
android:drawableTint="@color/icon_tint_with_alpha"
android:singleLine="true"
android:textAlignment="viewStart"
android:textSize="14sp"
android:padding="@dimen/keyline_first"
tools:ignore="UnusedAttribute" />
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:background="@null"
android:textColor="@color/text_secondary"
android:fontFamily="@string/font_fontFamily_medium"
android:layout_alignParentStart="true"
android:layout_below="@id/divider"
android:layout_toStartOf="@id/chevron"
android:gravity="start|center_vertical"
android:singleLine="true"
android:textAlignment="viewStart"
android:textSize="14sp"
android:padding="@dimen/keyline_first"
tools:ignore="UnusedAttribute" />
</RelativeLayout>

@ -365,7 +365,6 @@
<string name="share">مشاركة</string>
<string name="shortcut_pick_time">اختر الوقت</string>
<string name="chip_appearance_icon_only">الأيقونة فقط</string>
<string name="add_place">أضف مكانًا</string>
<string name="hide_unused_places">أخفِ الأماكن الغير مستخدمة</string>
<string name="color_wheel">عجلة الألوان</string>
<string name="troubleshooting">استكشاف الأخطاء وإصلاحها</string>

@ -461,7 +461,6 @@
<string name="add_filter">Добавяне на филтър</string>
<string name="add_tags">Добавяне на етикети</string>
<string name="error_adding_account">Грешка: %s</string>
<string name="add_place">Добавяне на място</string>
<string name="place_settings">Настройки на местата</string>
<string name="places">Места</string>
<string name="no_start_date">Без начална дата</string>

@ -491,7 +491,6 @@
<string name="chip_appearance_icon_only">Pouze ikona</string>
<string name="chip_appearance_text_only">Pouze text</string>
<string name="chip_appearance_text_and_icon">Text a ikona</string>
<string name="add_place">Přidat místo</string>
<string name="hide_unused_places">Skrýt nevyužitá místa</string>
<string name="hide_unused_tags">Skrýt nevyužité štítky</string>
<string name="navigation_drawer">Postranní nabídka</string>

@ -147,7 +147,6 @@
<string name="chip_appearance_icon_only">Kun ikon</string>
<string name="chip_appearance_text_only">Kun tekst</string>
<string name="chip_appearance_text_and_icon">Tekst og ikon</string>
<string name="add_place">Tilføj sted</string>
<string name="hide_unused_places">Skjul ubrugte steder</string>
<string name="hide_unused_tags">Skjul ubrugte tags</string>
<string name="navigation_drawer">Navigationsmenu</string>

@ -496,7 +496,6 @@
<string name="navigation_drawer">Navigationsmenü</string>
<string name="hide_unused_tags">Ungenutzte Schlagwörter ausblenden</string>
<string name="hide_unused_places">Ungenutzte Orte ausblenden</string>
<string name="add_place">Ort hinzufügen</string>
<string name="menu_discard_changes">Änderungen verwerfen</string>
<string name="chip_appearance_text_and_icon">Text und Symbol</string>
<string name="chip_appearance_text_only">Nur Text</string>

@ -495,7 +495,6 @@
<string name="navigation_drawer">Cajón de navegación</string>
<string name="hide_unused_tags">Ocultar etiquetas no utilizadas</string>
<string name="hide_unused_places">Ocultar lugares inusuales</string>
<string name="add_place">Añadir lugar</string>
<string name="menu_discard_changes">Descartar los cambios</string>
<string name="chip_appearance_text_and_icon">Texto e icono</string>
<string name="chip_appearance_text_only">Sólo texto</string>

@ -495,7 +495,6 @@
<string name="navigation_drawer">Nabigazio tiradera</string>
<string name="hide_unused_tags">Ezkutatu erabili gabeko etiketak</string>
<string name="hide_unused_places">Ezkutatu erabili gabeko tokiak</string>
<string name="add_place">Gehitu tokia</string>
<string name="menu_discard_changes">Baztertu aldaketak</string>
<string name="chip_appearance_text_and_icon">Testua eta ikonoa</string>
<string name="chip_appearance_text_only">Testua soilik</string>

@ -372,7 +372,6 @@
<string name="tasker_create_task">Luo tehtävä</string>
<string name="tasker_list_notification">Ilmoituslista</string>
<string name="help">Apua</string>
<string name="add_place">Lisää paikka</string>
<string name="hide_unused_places">Piilota käyttämättömät paikat</string>
<string name="hide_unused_tags">Piilota käyttämättömät tunnistimet</string>
<string name="reinitialize_account">Uudelleenalustus</string>

@ -490,7 +490,6 @@
<string name="navigation_drawer">Tiroir de navigation</string>
<string name="hide_unused_tags">Masquer les étiquettes inutilisés</string>
<string name="hide_unused_places">Masquer les lieux inutilisés</string>
<string name="add_place">Ajouter un lieu</string>
<string name="menu_discard_changes">Annuler les modifications</string>
<string name="chip_appearance_text_and_icon">Texte et icône</string>
<string name="chip_appearance_text_only">Texte seul</string>

@ -163,7 +163,6 @@
<string name="choose_synchronization_service">Odaberi platformu</string>
<string name="not_signed_in">Nisi prijavljen/a</string>
<string name="contact_developer">Kontaktiraj programera</string>
<string name="add_place">Dodaj mjesto</string>
<string name="hide_unused_places">Sakrij nekorištena mjesta</string>
<string name="manage_drawer">Upravljaj ladicom</string>
<string name="place_settings">Postavke mjesta</string>

@ -492,7 +492,6 @@
<string name="place_settings">Hely beállítások</string>
<string name="hide_unused_tags">Használaton kívüli címkék elrejtése</string>
<string name="hide_unused_places">Használaton kívüli helyek elrejtése</string>
<string name="add_place">Hely hozzáadása</string>
<string name="navigation_drawer">Hamburger menü</string>
<string name="menu_discard_changes">Módosítások elvetése</string>
<string name="chip_appearance_text_and_icon">Szöveg és ikon</string>

@ -571,7 +571,6 @@
<string name="auto_dismiss_datetime_edit_summary">Tutup otomatis ketika mengambil dari tugas suntingan</string>
<string name="auto_dismiss_datetime_list_summary">Tutup otomatis ketika mengambil dari daftar tugas</string>
<string name="auto_dismiss_datetime">Tutup otomatis tabel tanggal dan waktu</string>
<string name="add_place">Tambah tempat</string>
<string name="hide_unused_places">Sembunyikan tempat yang tidak digunakan</string>
<string name="place_settings">Pengaturan tempat</string>
<string name="places">Tempat</string>

@ -443,7 +443,6 @@
<string name="chip_appearance_icon_only">Solo icona</string>
<string name="chip_appearance_text_only">Solo testo</string>
<string name="chip_appearance_text_and_icon">Testo e icona</string>
<string name="add_place">Aggiungi luogo</string>
<string name="hide_unused_places">Nascondi luoghi non usati</string>
<string name="hide_unused_tags">Nascondi etichette non usate</string>
<string name="navigation_drawer">Menù laterale</string>

@ -587,7 +587,6 @@
<string name="navigation_drawer">מגירת ניווט</string>
<string name="hide_unused_tags">הסתרת תגיות שאינן בשימוש</string>
<string name="hide_unused_places">הסתרת מיקומים שאינם בשימוש</string>
<string name="add_place">הוספת מיקום</string>
<string name="auto_dismiss_datetime_summary">לסגור את בוחר התאריך והשעה לאחר בחירת תאריך או שעה</string>
<string name="auto_dismiss_datetime_widget_summary">לסגור אוטומטית בעת בחירה מווידג׳ט</string>
<string name="auto_dismiss_datetime_edit">עריכת משימה</string>

@ -512,7 +512,6 @@
<string name="error_adding_account">エラー:%s</string>
<string name="tasks_org_account">Tasks.org アカウント</string>
<string name="copied_to_clipboard">%sをクリップボードにコピーしました</string>
<string name="add_place">場所を追加</string>
<string name="hide_unused_places">使われていない場所を隠す</string>
<string name="place_settings">場所の設定</string>
<string name="places">場所</string>

@ -536,7 +536,6 @@
<string name="auto_dismiss_datetime_edit">할일 수정</string>
<string name="auto_dismiss_datetime_list">할일 목록</string>
<string name="auto_dismiss_datetime">일시 선택상자 닫기</string>
<string name="add_place">위치 추가하기</string>
<string name="whats_new">새 기능</string>
<string name="building_notifications">알림 생성하기</string>
<string name="widget_due_date_after_title">제목 다음</string>

@ -700,7 +700,6 @@
<string name="add_filter">Pridėti filtrą</string>
<string name="add_tags">Pridėti etiketes</string>
<string name="auto_dismiss_datetime">Automatiškai uždaryti datos ir laiko parinkiklį</string>
<string name="add_place">Pridėti vietą</string>
<string name="hide_unused_places">Slėpti nenaudojamas vietas</string>
<string name="hide_unused_tags">Slėpti nenaudojamas etiketes</string>
<string name="upgrade_blurb_2">Aš praleidau tūkstančius valandų dirbdamas su Tasks ir nemokamai skelbiu visą pirminį kodą internete. Kad galėčiau palaikyti savo darbą, kai kurioms funkcijoms reikalinga prenumerata</string>

@ -495,7 +495,6 @@
<string name="chip_appearance_icon_only">Kun ikon</string>
<string name="chip_appearance_text_only">Kun tekst</string>
<string name="chip_appearance_text_and_icon">Tekst og ikon</string>
<string name="add_place">Legg til sted</string>
<string name="more_notification_settings_summary">Ringetone, vibrering, og mer</string>
<string name="disable_battery_optimizations">Skru av batterisparing</string>
<string name="notification_troubleshooting_summary">Trykk her hvis du har problemer med merknader</string>

@ -490,7 +490,6 @@
<string name="navigation_drawer">Navigatie la</string>
<string name="hide_unused_tags">Verberg ongebruikte labels</string>
<string name="hide_unused_places">Verberg ongebruikte plaatsen</string>
<string name="add_place">Voeg plaats toe</string>
<string name="menu_discard_changes">Negeer veranderingen</string>
<string name="chip_appearance_text_and_icon">Tekst en icon</string>
<string name="chip_appearance_text_only">Alleen tekst</string>

@ -507,7 +507,6 @@
<string name="chip_appearance_icon_only">Tylko ikona</string>
<string name="chip_appearance_text_only">Tylko tekst</string>
<string name="chip_appearance_text_and_icon">Tekst i ikona</string>
<string name="add_place">Dodaj miejsce</string>
<string name="hide_unused_places">Ukryj nieużywane miejsca</string>
<string name="hide_unused_tags">Ukryj nieużywane tagi</string>
<string name="navigation_drawer">Panel nawigacji</string>

@ -440,7 +440,6 @@
<string name="chip_appearance_icon_only">Ícone apenas</string>
<string name="chip_appearance_text_only">Apenas texto</string>
<string name="chip_appearance_text_and_icon">Texto e ícone</string>
<string name="add_place">Adicionar um lugar</string>
<string name="hide_unused_places">Esconder lugares não usados</string>
<string name="hide_unused_tags">Esconder etiquetas não usadas</string>
<string name="navigation_drawer">Gaveta de navegação</string>

@ -498,7 +498,6 @@
<string name="chip_appearance_text_only">Apenas texto</string>
<string name="chip_appearance_text_and_icon">Texto e ícone</string>
<string name="menu_discard_changes">Descartar alterações</string>
<string name="add_place">Adicionar local</string>
<string name="hide_unused_places">Ocultar locais não usados</string>
<string name="hide_unused_tags">Ocultar etiquetas não usadas</string>
<string name="navigation_drawer">Gaveta de navegação</string>

@ -601,7 +601,6 @@
<string name="chip_appearance_icon_only">Doar pictograma</string>
<string name="chip_appearance_text_only">Doar text</string>
<string name="chip_appearance_text_and_icon">Text și pictogramă</string>
<string name="add_place">Adăugați locul</string>
<string name="hide_unused_places">Ascundeți locurile nefolosite</string>
<string name="hide_unused_tags">Ascundeți etichetele nefolosite</string>
<string name="navigation_drawer">Sertar de navigare</string>

@ -512,7 +512,6 @@
<string name="chip_appearance_icon_only">Только иконка</string>
<string name="chip_appearance_text_only">Только текст</string>
<string name="chip_appearance_text_and_icon">Текст и иконка</string>
<string name="add_place">Добавить место</string>
<string name="hide_unused_places">Скрыть неиспользуемые места</string>
<string name="hide_unused_tags">Скрыть неиспользуемые теги</string>
<string name="navigation_drawer">Панель навигации</string>

@ -219,7 +219,6 @@
<string name="theme">තේමාව</string>
<string name="opacity_footer">පාදකයේ පාරාන්ධතාව</string>
<string name="chip_appearance_text_and_icon">පෙළ සහ නිරූපකය</string>
<string name="add_place">ස්ථානය එක් කරන්න</string>
<string name="hide_unused_places">භාවිතයට නොගත් ස්ථාන සඟවන්න</string>
<string name="hide_unused_tags">භාවිතයට නොගත් ටැග් සඟවන්න</string>
<string name="places">ස්ථාන</string>

@ -458,7 +458,6 @@
<string name="chip_appearance_icon_only">Ikon endast</string>
<string name="chip_appearance_text_only">Text endast</string>
<string name="chip_appearance_text_and_icon">Text och ikon</string>
<string name="add_place">Lägg till plats</string>
<string name="place_settings">Plats inställningar</string>
<string name="places">Platser</string>
<string name="chip_style_filled">Fylld</string>

@ -205,7 +205,6 @@
<string name="chip_appearance_icon_only">ஐகான் மட்டுமே</string>
<string name="chip_appearance_text_only">உரை மட்டும்</string>
<string name="chip_appearance_text_and_icon">உரை மற்றும் ஐகான்</string>
<string name="add_place">இடத்தைச் சேர்க்கவும்</string>
<string name="hide_unused_places">பயன்படுத்தப்படாத இடங்களை மறைக்கவும்</string>
<string name="hide_unused_tags">பயன்படுத்தப்படாத குறிச்சொற்களை மறைக்கவும்</string>
<string name="place_settings">அமைப்புகளை வைக்கவும்</string>

@ -599,7 +599,6 @@
<string name="chip_appearance_icon_only">ไอคอนเท่านั้น</string>
<string name="chip_appearance_text_only">เฉพาะข้อความ</string>
<string name="chip_appearance_text_and_icon">ข้อความและไอคอน</string>
<string name="add_place">เพิ่มสถานที่</string>
<string name="hide_unused_places">ซ่อนสถานที่ที่ไม่ได้ใช้</string>
<string name="hide_unused_tags">ซ่อนแท็กที่ไม่ได้ใช้</string>
<string name="navigation_drawer">ลิ้นชักนําทาง</string>

@ -495,7 +495,6 @@
<string name="navigation_drawer">Gezinim çekmecesi</string>
<string name="hide_unused_tags">Kullanılmayan etiketleri gizle</string>
<string name="hide_unused_places">Kullanılmayan yerleri gizle</string>
<string name="add_place">Yer ekle</string>
<string name="auto_dismiss_datetime_summary">Tarih veya zaman seçince tarih zaman seçiciyi kapat</string>
<string name="auto_dismiss_datetime">Tarih zaman seçiciyi kendiliğinden kapat</string>
<string name="shortcut_pick_time">Zaman seç</string>

@ -505,7 +505,6 @@
<string name="chip_appearance_icon_only">Лише піктограми</string>
<string name="chip_appearance_text_only">Лише текст</string>
<string name="chip_appearance_text_and_icon">Текст та піктограма</string>
<string name="add_place">Додати місце</string>
<string name="hide_unused_places">Сховати місця, що не використовуються</string>
<string name="hide_unused_tags">Сховати не використовувані мітки</string>
<string name="navigation_drawer">Панель навігації</string>

@ -210,7 +210,6 @@
<string name="chip_appearance_icon_only">Chỉ biểu tượng</string>
<string name="chip_appearance_text_only">Chỉ văn bản</string>
<string name="chip_appearance_text_and_icon">Văn bản và biểu tượng</string>
<string name="add_place">Thêm địa điểm</string>
<string name="hide_unused_places">Ẩn các địa điểm chưa sử dụng</string>
<string name="hide_unused_tags">Ẩn các thẻ chưa sử dụng</string>
<string name="navigation_drawer">Ngăn điều hướng</string>

@ -485,7 +485,6 @@
<string name="navigation_drawer">抽屉式导航栏</string>
<string name="hide_unused_tags">隐藏不用的标签</string>
<string name="hide_unused_places">隐藏不用的地点</string>
<string name="add_place">添加地点</string>
<string name="auto_dismiss_datetime_summary">在选择一个日期或时间后关闭日期时间选择器</string>
<string name="auto_dismiss_datetime">自动关闭日期时间选择器</string>
<string name="shortcut_pick_time">挑选时间</string>

@ -385,7 +385,6 @@
<string name="chip_appearance_text_and_icon">文字與圖示</string>
<string name="chip_appearance_icon_only">僅圖示</string>
<string name="chip_appearance_text_only">僅文字</string>
<string name="add_place">新增地點</string>
<string name="hide_unused_places">隱藏未使用地點</string>
<string name="hide_unused_tags">隱藏未使用標籤</string>
<string name="desaturate_colors_summary_off">暗色主題中顏色將不飽和</string>

@ -566,7 +566,6 @@ File %1$s contained %2$s.\n\n
<string name="navigation_drawer">Navigation drawer</string>
<string name="hide_unused_tags">Hide unused tags</string>
<string name="hide_unused_places">Hide unused places</string>
<string name="add_place">Add place</string>
<string name="chip_appearance_text_and_icon">Text and icon</string>
<string name="chip_appearance_text_only">Text only</string>
<string name="chip_appearance_icon_only">Icon only</string>

Loading…
Cancel
Save