Convert filter list to recycler view

pull/996/head
Alex Baker 4 years ago
parent f3f3b1d8dc
commit d33fb285c6

@ -206,6 +206,7 @@ public class AndroidUtilities {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
currentFocus.clearFocus();
}
} catch (Exception e) {
Timber.e(e);

@ -56,6 +56,10 @@ public class CustomFilter extends Filter {
return filter;
}
public void setId(long id) {
this.id = id;
}
public long getId() {
return id;
}

@ -57,6 +57,11 @@ public abstract class CustomFilterCriterion implements Parcelable {
// --- parcelable utilities
public String getName() {
return name;
}
/** Utility method to write to parcel */
void writeToParcel(Parcel dest) {
dest.writeString(identifier);

@ -3,6 +3,7 @@ package com.todoroo.astrid.core;
import static com.google.common.collect.Lists.transform;
import static java.util.Arrays.asList;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.todoroo.andlib.utility.AndroidUtilities;
@ -63,10 +64,10 @@ public class CriterionInstance {
public CustomFilterCriterion criterion;
/** which of the entries is selected (MultipleSelect) */
int selectedIndex = -1;
public int selectedIndex = -1;
/** text of selection (TextInput) */
String selectedText = null;
public String selectedText = null;
/** type of join */
public int type = TYPE_INTERSECT;
@ -77,7 +78,7 @@ public class CriterionInstance {
public int max;
String getTitleFromCriterion() {
public String getTitleFromCriterion() {
if (criterion instanceof MultipleSelectCriterion) {
if (selectedIndex >= 0
&& ((MultipleSelectCriterion) criterion).entryTitles != null
@ -133,7 +134,19 @@ public class CriterionInstance {
+ '}';
}
public static String escape(String item) {
String serialize() {
// criterion|entry|text|type|sql
return Joiner.on(AndroidUtilities.SERIALIZATION_SEPARATOR)
.join(
asList(
escape(criterion.identifier),
escape(getValueFromCriterion()),
escape(criterion.text),
type,
criterion.sql == null ? "" : criterion.sql));
}
private static String escape(String item) {
if (item == null) {
return ""; // $NON-NLS-1$
}

@ -0,0 +1,70 @@
package com.todoroo.astrid.core
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import butterknife.BindView
import butterknife.ButterKnife
import butterknife.OnClick
import org.tasks.Callback
import org.tasks.R
import org.tasks.locale.Locale
class CriterionViewHolder(itemView: View, private val locale: Locale, private val onClick: Callback<CriterionInstance>) : RecyclerView.ViewHolder(itemView) {
@BindView(R.id.divider)
lateinit var divider: View
@BindView(R.id.icon)
lateinit var icon: ImageView
@BindView(R.id.name)
lateinit var name: TextView
@BindView(R.id.filter_count)
lateinit var filterCount: TextView
@BindView(R.id.row)
lateinit var row: View
private lateinit var criterion: CriterionInstance
init {
ButterKnife.bind(this, itemView)
}
fun bind(criterion: CriterionInstance) {
this.criterion = criterion
val title: String = criterion.titleFromCriterion
icon.visibility = if (criterion.type == CriterionInstance.TYPE_UNIVERSE) {
View.INVISIBLE
} else {
View.VISIBLE
}
when (criterion.type) {
CriterionInstance.TYPE_ADD -> {
icon.setImageResource(R.drawable.ic_call_split_24px)
divider.visibility = View.VISIBLE
}
CriterionInstance.TYPE_SUBTRACT -> {
icon.setImageResource(R.drawable.ic_outline_not_interested_24px)
divider.visibility = View.GONE
}
CriterionInstance.TYPE_INTERSECT -> {
icon.setImageResource(R.drawable.ic_outline_add_24px)
divider.visibility = View.GONE
}
}
name.text = title
filterCount.text = locale.formatNumber(criterion.end)
row.isClickable = criterion.type != CriterionInstance.TYPE_UNIVERSE
}
@OnClick(R.id.row)
fun onClick() = this.onClick.call(criterion)
}

@ -6,217 +6,59 @@
package com.todoroo.astrid.core;
import static com.todoroo.astrid.core.CriterionInstance.escape;
import static java.util.Arrays.asList;
import static com.google.common.collect.Lists.transform;
import android.content.DialogInterface;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.common.base.Joiner;
import com.todoroo.andlib.sql.UnaryCriterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.MultipleSelectCriterion;
import com.todoroo.astrid.api.TextInputCriterion;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.tasks.Callback;
import org.tasks.R;
import org.tasks.activities.FilterSettingsActivity;
import org.tasks.dialogs.AlertDialogBuilder;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.locale.Locale;
import timber.log.Timber;
/**
* Adapter for AddOns
*
* @author Tim Su <tim@todoroo.com>
*/
public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
public class CustomFilterAdapter extends RecyclerView.Adapter<CriterionViewHolder> {
private final FilterSettingsActivity activity;
private final DialogBuilder dialogBuilder;
private final LayoutInflater inflater;
private final Callback<CriterionInstance> onClick;
private final List<CriterionInstance> objects;
private final Locale locale;
private final View.OnClickListener filterClickListener =
new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewHolder viewHolder = (ViewHolder) v.getTag();
if (viewHolder == null) {
return;
}
if (viewHolder.item.type == CriterionInstance.TYPE_UNIVERSE) {
return;
}
showOptionsFor(
viewHolder.item,
() -> {
activity.updateList();
notifyDataSetInvalidated();
});
}
};
// --- view event handling
public CustomFilterAdapter(
FilterSettingsActivity activity,
DialogBuilder dialogBuilder,
List<CriterionInstance> objects,
Locale locale) {
super(activity, 0, objects);
this.activity = activity;
this.dialogBuilder = dialogBuilder;
Locale locale,
Callback<CriterionInstance> onClick) {
this.objects = objects;
this.locale = locale;
inflater = activity.getLayoutInflater();
}
public void onCreateContextMenu(ContextMenu menu, View v) {
// view holder
ViewHolder viewHolder = (ViewHolder) v.getTag();
if (viewHolder == null || viewHolder.item.type == CriterionInstance.TYPE_UNIVERSE) {
return;
}
int index = getPosition(viewHolder.item);
menu.setHeaderTitle(viewHolder.name.getText());
MenuItem item =
menu.add(
FilterSettingsActivity.MENU_GROUP_CONTEXT_TYPE,
CriterionInstance.TYPE_INTERSECT,
index,
activity.getString(
R.string.CFA_context_chain, activity.getString(R.string.CFA_type_intersect)));
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_INTERSECT);
item =
menu.add(
FilterSettingsActivity.MENU_GROUP_CONTEXT_TYPE,
CriterionInstance.TYPE_ADD,
index,
activity.getString(
R.string.CFA_context_chain, activity.getString(R.string.CFA_type_add)));
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_ADD);
item =
menu.add(
FilterSettingsActivity.MENU_GROUP_CONTEXT_TYPE,
CriterionInstance.TYPE_SUBTRACT,
index,
activity.getString(
R.string.CFA_context_chain, activity.getString(R.string.CFA_type_subtract)));
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_SUBTRACT);
menu.setGroupCheckable(FilterSettingsActivity.MENU_GROUP_CONTEXT_TYPE, true, true);
menu.add(FilterSettingsActivity.MENU_GROUP_CONTEXT_DELETE, 0, index, R.string.CFA_context_delete);
}
/** Show options menu for the given criterioninstance */
public void showOptionsFor(final CriterionInstance item, final Runnable onComplete) {
AlertDialogBuilder dialog = dialogBuilder.newDialog(item.criterion.name);
if (item.criterion instanceof MultipleSelectCriterion) {
MultipleSelectCriterion multiSelectCriterion = (MultipleSelectCriterion) item.criterion;
final String[] titles = multiSelectCriterion.entryTitles;
DialogInterface.OnClickListener listener =
(click, which) -> {
item.selectedIndex = which;
if (onComplete != null) {
onComplete.run();
}
};
dialog.setItems(titles, listener);
} else if (item.criterion instanceof TextInputCriterion) {
TextInputCriterion textInCriterion = (TextInputCriterion) item.criterion;
FrameLayout frameLayout = new FrameLayout(activity);
frameLayout.setPadding(10, 0, 10, 0);
final EditText editText = new EditText(activity);
editText.setText(item.selectedText);
editText.setHint(textInCriterion.hint);
frameLayout.addView(
editText,
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
dialog
.setView(frameLayout)
.setPositiveButton(
android.R.string.ok,
(dialogInterface, which) -> {
item.selectedText = editText.getText().toString();
if (onComplete != null) {
onComplete.run();
}
});
}
dialog.show().setOwnerActivity(activity);
this.onClick = onClick;
}
// --- view construction
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.custom_filter_row, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.type = convertView.findViewById(R.id.type);
viewHolder.name = convertView.findViewById(R.id.name);
viewHolder.filterCount = convertView.findViewById(R.id.filter_count);
convertView.setTag(viewHolder);
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.item = getItem(position);
initializeView(convertView);
// listeners
convertView.setOnCreateContextMenuListener(activity);
convertView.setOnClickListener(filterClickListener);
return convertView;
public CriterionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
return new CriterionViewHolder(
inflater.inflate(R.layout.custom_filter_row, parent, false), locale, onClick);
}
private void initializeView(View convertView) {
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
CriterionInstance item = viewHolder.item;
String title = item.getTitleFromCriterion();
@Override
public void onBindViewHolder(@NonNull CriterionViewHolder holder, int position) {
holder.bind(getItem(position));
}
viewHolder.type.setVisibility(
item.type == CriterionInstance.TYPE_UNIVERSE ? View.GONE : View.VISIBLE);
switch (item.type) {
case CriterionInstance.TYPE_ADD:
viewHolder.type.setImageResource(R.drawable.arrow_join);
title = activity.getString(R.string.CFA_type_add) + " " + title;
break;
case CriterionInstance.TYPE_SUBTRACT:
viewHolder.type.setImageResource(R.drawable.arrow_branch);
title = activity.getString(R.string.CFA_type_subtract) + " " + title;
break;
case CriterionInstance.TYPE_INTERSECT:
viewHolder.type.setImageResource(R.drawable.arrow_down);
break;
}
public List<CriterionInstance> getItems() {
return objects;
}
viewHolder.name.setText(title);
viewHolder.filterCount.setText(locale.formatNumber(item.end));
@Override
public int getItemCount() {
return objects.size();
}
private String getValue(CriterionInstance instance) {
@ -229,8 +71,7 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
public String getSql() {
StringBuilder sql = new StringBuilder(" WHERE ");
for (int i = 0; i < getCount(); i++) {
CriterionInstance instance = getItem(i);
for (CriterionInstance instance : objects) {
String value = getValue(instance);
switch (instance.type) {
@ -258,8 +99,7 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
public Map<String, Object> getValues() {
Map<String, Object> values = new HashMap<>();
for (int i = 0; i < getCount(); i++) {
CriterionInstance instance = getItem(i);
for (CriterionInstance instance : objects) {
String value = getValue(instance);
if (instance.criterion.valuesForNewTasks != null
@ -274,29 +114,22 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
}
public String getCriterion() {
List<String> rows = new ArrayList<>();
for (int i = 0; i < getCount(); i++) {
CriterionInstance item = getItem(i);
// criterion|entry|text|type|sql
String row =
Joiner.on(AndroidUtilities.SERIALIZATION_SEPARATOR)
.join(
asList(
escape(item.criterion.identifier),
escape(item.getValueFromCriterion()),
escape(item.criterion.text),
item.type,
item.criterion.sql == null ? "" : item.criterion.sql));
Timber.d("%s -> %s", item, row);
rows.add(row);
}
return Joiner.on("\n").join(rows);
return Joiner.on("\n").join(transform(objects, CriterionInstance::serialize));
}
public CriterionInstance getItem(int position) {
return objects.get(position);
}
public void remove(CriterionInstance criterionInstance) {
objects.remove(criterionInstance);
}
public void replace(CriterionInstance replace, CriterionInstance instance) {
objects.set(objects.indexOf(replace), instance);
}
private static class ViewHolder {
CriterionInstance item;
ImageView type;
TextView name;
TextView filterCount;
public void add(CriterionInstance instance) {
objects.add(instance);
}
}

@ -7,30 +7,39 @@
package org.tasks.activities;
import static android.text.TextUtils.isEmpty;
import static com.google.common.collect.Lists.transform;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ListView;
import android.widget.EditText;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnTextChanged;
import com.google.android.material.button.MaterialButtonToggleGroup;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.UnaryCriterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.CustomFilterCriterion;
import com.todoroo.astrid.api.MultipleSelectCriterion;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.api.TextInputCriterion;
import com.todoroo.astrid.core.CriterionInstance;
import com.todoroo.astrid.core.CustomFilterAdapter;
import com.todoroo.astrid.dao.Database;
@ -42,19 +51,15 @@ import java.util.Map;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.data.FilterDao;
import org.tasks.dialogs.AlertDialogBuilder;
import org.tasks.filters.FilterCriteriaProvider;
import org.tasks.injection.ActivityComponent;
import org.tasks.locale.Locale;
public class FilterSettingsActivity extends BaseListSettingsActivity {
public static final int MENU_GROUP_CONTEXT_TYPE = 1;
public static final int MENU_GROUP_CONTEXT_DELETE = 2;
private static final int MENU_GROUP_FILTER = 0;
public static final String TOKEN_FILTER = "token_filter";
public static final String EXTRA_CRITERIA = "extra_criteria";
@Inject FilterDao filterDao;
@Inject Locale locale;
@Inject Database database;
@ -66,8 +71,8 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
@BindView(R.id.name_layout)
TextInputLayout nameLayout;
@BindView(R.id.list)
ListView listView; // TODO: convert to recycler view
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@BindView(R.id.fab)
ExtendedFloatingActionButton fab;
@ -105,40 +110,138 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
instance.type = CriterionInstance.TYPE_UNIVERSE;
criteria.add(instance);
}
adapter = new CustomFilterAdapter(this, dialogBuilder, criteria, locale);
fab.setExtended(adapter.getCount() <= 1);
listView.setAdapter(adapter);
adapter = new CustomFilterAdapter(criteria, locale, this::onClick);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
updateList();
fab.setExtended(adapter.getItemCount() <= 1);
setUpListeners();
updateList();
updateTheme();
}
private void onClick(CriterionInstance criterionInstance) {
View view =
getLayoutInflater().inflate(R.layout.dialog_custom_filter_row_edit, recyclerView, false);
MaterialButtonToggleGroup group = view.findViewById(R.id.button_toggle);
int selected = getSelected(criterionInstance);
group.check(selected);
AlertDialog d = dialogBuilder
.newDialog(criterionInstance.getTitleFromCriterion())
.setView(view)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(
android.R.string.ok,
(dialog, which) -> {
criterionInstance.type = getType(group.getCheckedButtonId());
updateList();
})
.show();
view.findViewById(R.id.delete).setOnClickListener(v -> {
d.dismiss();
adapter.remove(criterionInstance);
updateList();
});
view.findViewById(R.id.reconfigure).setOnClickListener(v -> {
d.dismiss();
addCriteria(criterionInstance);
});
}
private int getSelected(CriterionInstance instance) {
switch (instance.type) {
case CriterionInstance.TYPE_ADD:
return R.id.button_or;
case CriterionInstance.TYPE_INTERSECT:
return R.id.button_and;
case CriterionInstance.TYPE_SUBTRACT:
return R.id.button_not;
default:
throw new RuntimeException();
}
}
private int getType(int selected) {
switch (selected) {
case R.id.button_and:
return CriterionInstance.TYPE_INTERSECT;
case R.id.button_or:
return CriterionInstance.TYPE_ADD;
case R.id.button_not:
return CriterionInstance.TYPE_SUBTRACT;
default:
throw new RuntimeException();
}
}
@OnClick(R.id.fab)
void addCriteria() {
listView.showContextMenu();
addCriteria(null);
fab.shrink();
}
private void setUpListeners() {
listView.setOnCreateContextMenuListener(
(menu, v, menuInfo) -> {
if (menu.hasVisibleItems()) {
/* If it has items already, then the user did not click on the "Add Criteria" button, but instead
long held on a row in the list view, which caused CustomFilterAdapter.onCreateContextMenu
to be invoked before this onCreateContextMenu method was invoked.
*/
return;
}
int i = 0;
for (CustomFilterCriterion item : filterCriteriaProvider.getAll()) {
menu.add(MENU_GROUP_FILTER, i, 0, item.name);
i++;
}
});
private void addCriteria(@Nullable CriterionInstance replace) {
AndroidUtilities.hideKeyboard(this);
List<CustomFilterCriterion> all = filterCriteriaProvider.getAll();
List<String> names = transform(all, CustomFilterCriterion::getName);
dialogBuilder.newDialog()
.setItems(names, (dialog, which) -> {
CriterionInstance instance = new CriterionInstance();
instance.criterion = all.get(which);
showOptionsFor(instance, () -> {
if (replace == null) {
adapter.add(instance);
} else {
adapter.replace(replace, instance);
}
updateList();
});
dialog.dismiss();
})
.show();
}
/** Show options menu for the given criterioninstance */
public void showOptionsFor(final CriterionInstance item, final Runnable onComplete) {
AlertDialogBuilder dialog = dialogBuilder.newDialog(item.criterion.name);
if (item.criterion instanceof MultipleSelectCriterion) {
MultipleSelectCriterion multiSelectCriterion = (MultipleSelectCriterion) item.criterion;
final String[] titles = multiSelectCriterion.entryTitles;
DialogInterface.OnClickListener listener =
(click, which) -> {
item.selectedIndex = which;
if (onComplete != null) {
onComplete.run();
}
};
dialog.setItems(titles, listener);
} else if (item.criterion instanceof TextInputCriterion) {
TextInputCriterion textInCriterion = (TextInputCriterion) item.criterion;
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setPadding(10, 0, 10, 0);
final EditText editText = new EditText(this);
editText.setText(item.selectedText);
editText.setHint(textInCriterion.hint);
frameLayout.addView(
editText,
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
dialog
.setView(frameLayout)
.setPositiveButton(
android.R.string.ok,
(dialogInterface, which) -> {
item.selectedText = editText.getText().toString();
if (onComplete != null) {
onComplete.run();
}
});
}
dialog.show();
}
@Override
@ -187,7 +290,7 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
filter.valuesForNewTasks.put(entry.getKey(), entry.getValue());
}
filter.setCriterion(adapter.getCriterion());
filterDao.insertOrUpdate(filter.toStoreObject());
filter.setId(filterDao.insertOrUpdate(filter.toStoreObject()));
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_RELOAD).putExtra(MainActivity.OPEN_FILTER, filter));
@ -226,56 +329,10 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
protected void delete() {
filterDao.delete(filter.getId());
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_DELETED).putExtra(TOKEN_FILTER, filter));
RESULT_OK, new Intent(TaskListFragment.ACTION_DELETED).putExtra(TOKEN_FILTER, filter));
finish();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if (menu.size() > 0) {
menu.clear();
}
// view holder
if (v.getTag() != null) {
adapter.onCreateContextMenu(menu, v);
}
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
if (item.getGroupId() == MENU_GROUP_FILTER) {
// give an initial value for the row before adding it
CustomFilterCriterion criterion = filterCriteriaProvider.getAll().get(item.getItemId());
final CriterionInstance instance = new CriterionInstance();
instance.criterion = criterion;
adapter.showOptionsFor(
instance,
() -> {
adapter.add(instance);
updateList();
});
return true;
}
// item type context item
else if (item.getGroupId() == MENU_GROUP_CONTEXT_TYPE) {
CriterionInstance instance = adapter.getItem(item.getOrder());
instance.type = item.getItemId();
updateList();
}
// delete context item
else if (item.getGroupId() == MENU_GROUP_CONTEXT_DELETE) {
CriterionInstance instance = adapter.getItem(item.getOrder());
adapter.remove(instance);
updateList();
}
return super.onContextItemSelected(item);
}
public void updateList() {
int max = 0, last = -1;
@ -283,8 +340,7 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
new StringBuilder(Query.select(new CountProperty()).from(Task.TABLE).toString())
.append(" WHERE ");
for (int i = 0; i < adapter.getCount(); i++) {
CriterionInstance instance = adapter.getItem(i);
for (CriterionInstance instance : adapter.getItems()) {
String value = instance.getValueFromCriterion();
if (value == null && instance.criterion.sql != null && instance.criterion.sql.contains("?")) {
value = "";
@ -311,23 +367,19 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
sql.append(Task.ID).append(" IN (").append(subSql).append(") ");
}
Cursor cursor = database.query(sql.toString(), null);
try {
try (Cursor cursor = database.query(sql.toString(), null)) {
cursor.moveToNext();
instance.start = last == -1 ? cursor.getInt(0) : last;
instance.end = cursor.getInt(0);
last = instance.end;
max = Math.max(max, last);
} finally {
cursor.close();
}
}
for (int i = 0; i < adapter.getCount(); i++) {
CriterionInstance instance = adapter.getItem(i);
for (CriterionInstance instance : adapter.getItems()) {
instance.max = max;
}
adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged();
}
}

@ -90,7 +90,7 @@ public class FilterCriteriaProvider {
public CustomFilterCriterion getStartingUniverse() {
return new MultipleSelectCriterion(
IDENTIFIER_UNIVERSE,
context.getString(R.string.CFA_universe_all),
context.getString(R.string.BFE_Active),
null,
null,
null,

@ -176,7 +176,8 @@ object CustomIcons {
1136 to R.drawable.ic_weather_sunset,
1137 to R.drawable.ic_calendar_today_24px,
1138 to R.drawable.ic_select_all_24px,
1139 to R.drawable.ic_widgets_24px
1139 to R.drawable.ic_widgets_24px,
1140 to R.drawable.ic_call_split_24px
)
@kotlin.jvm.JvmStatic

Binary file not shown.

Before

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 687 B

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M14,4l2.29,2.29 -2.88,2.88 1.42,1.42 2.88,-2.88L20,10L20,4h-6zM10,4L4,4v6l2.29,-2.29 4.71,4.7L11,20h2v-8.41l-5.29,-5.3L10,4z"/>
</vector>

@ -1,64 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="55dip"
android:paddingStart="4dip"
android:paddingEnd="6dip"
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<TextView
android:id="@+id/filter_count"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentEnd="true"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:gravity="center_vertical|end"/>
<View
android:id="@+id/divider"
style="@style/horizontal_divider"
android:visibility="gone"
android:layout_alignParentTop="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_alignParentStart="true"
android:layout_toStartOf="@id/filter_count"
android:gravity="center_vertical|start"
android:orientation="horizontal">
<!-- filter intersection type icon -->
<ImageView
android:id="@+id/type"
android:layout_width="32dip"
<TextView
android:id="@+id/filter_count"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:scaleType="center"/>
android:layout_alignParentEnd="true"
android:padding="@dimen/keyline_first"
android:gravity="center_vertical|end" />
<!-- filter icon -->
<ImageView
android:id="@+id/icon"
android:layout_width="32dip"
android:layout_height="fill_parent"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:visibility="gone"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:tint="@color/icon_tint_with_alpha"
android:padding="@dimen/keyline_first"
android:src="@drawable/ic_outline_add_24px"
android:scaleType="center" />
<!-- filter text -->
<TextView
android:id="@+id/name"
style="@style/TextAppearance"
android:layout_toEndOf="@id/icon"
android:layout_toStartOf="@id/filter_count"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:gravity="start|center_vertical"
android:textAlignment="viewStart"
android:textSize="18sp"/>
</LinearLayout>
android:textSize="18sp" />
</RelativeLayout>

@ -0,0 +1,53 @@
<?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"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/button_toggle"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_first"
android:orientation="horizontal"
app:selectionRequired="true"
app:singleSelection="true">
<com.google.android.material.button.MaterialButton
android:id="@+id/button_and"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_and" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_or"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_or" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_not"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_not" />
</com.google.android.material.button.MaterialButtonToggleGroup>
<TextView
android:id="@+id/reconfigure"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TagSettingsRow"
android:text="@string/choose_new_criteria" />
<TextView
android:id="@+id/delete"
style="@style/TagSettingsRow"
android:text="@string/delete" />
</LinearLayout>

@ -41,23 +41,21 @@
<include layout="@layout/list_settings_icon"/>
<!-- help text -->
<TextView
style="@style/TextAppearance"
android:layout_width="fill_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="0dp"
android:gravity="center"
android:text="@string/CFA_help"/>
android:textColor="?attr/colorSecondary"
android:text="@string/custom_filter_criteria"
android:padding="@dimen/keyline_first"
style="@style/TextAppearance.AppCompat.Body2" />
<ListView
android:id="@+id/list"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:scrollbars="vertical"
android:nestedScrollingEnabled="true"/>
android:paddingBottom="@dimen/task_list_footer_height"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"/>
</LinearLayout>

@ -11,7 +11,6 @@
<string name="CFA_type_intersect">ook</string>
<string name="CFA_context_chain">%s het kriteria</string>
<string name="CFA_context_delete">Verwyder ry</string>
<string name="CFA_help">Hou in op items vir addisionele opsies</string>
<string name="CFA_button_add">Voeg kriteria by</string>
<string name="CFC_dueBefore_text">Verskuldig teen: ? </string>
<string name="CFC_importance_text">Prioriteit ten minste ?</string>

@ -60,12 +60,10 @@
<string name="dont_hide">لا تُخبئ</string>
<string name="BFE_Active">مهامي</string>
<string name="BFE_Recent">ما تم تعديله مؤخرا</string>
<string name="CFA_universe_all">مهام نشطة</string>
<string name="CFA_type_add">أو</string>
<string name="CFA_type_subtract">ليس</string>
<string name="CFA_type_intersect">أيضا</string>
<string name="CFA_context_delete">حذف الصف</string>
<string name="CFA_help">ضغط مطول على الموضوع من أجل خيارات إضافية</string>
<string name="CFA_button_add">إضافة معايير</string>
<string name="CFC_dueBefore_text">مستحق بحسب :?</string>
<string name="next_month">الشهر القادم</string>

@ -123,13 +123,11 @@
<string name="default_location_reminder_on_arrival_or_departure">При пристигане и заминаване</string>
<string name="BFE_Active">Моите задачи</string>
<string name="BFE_Recent">Наскоро променени</string>
<string name="CFA_universe_all">Активни Задачи</string>
<string name="CFA_type_add">или</string>
<string name="CFA_type_subtract">не</string>
<string name="CFA_type_intersect">и</string>
<string name="CFA_context_chain">%s има критерий</string>
<string name="CFA_context_delete">Изтрий реда</string>
<string name="CFA_help">Дълго докосване върху елементите за допълнителни опции</string>
<string name="CFA_button_add">Добави Критерий</string>
<string name="CFC_dueBefore_text">Краен срок: ?</string>
<string name="CFC_dueBefore_name">Краен срок…</string>

@ -50,13 +50,11 @@
<string name="dont_hide">No amagis</string>
<string name="BFE_Active">Tasques actives</string>
<string name="BFE_Recent">Modificades fa poc</string>
<string name="CFA_universe_all">Tasques actives</string>
<string name="CFA_type_add">o</string>
<string name="CFA_type_subtract">no</string>
<string name="CFA_type_intersect">també</string>
<string name="CFA_context_chain">%s té criteris</string>
<string name="CFA_context_delete">Suprimeix la fila</string>
<string name="CFA_help">Aquesta pantalla li permet crear nous filtres. Afegeix criteris fent servir el botó de sota, premi breu o llarg per ajustar-los, i després premi \"Veure\"!</string>
<string name="CFA_button_add">Afegeix criteris</string>
<string name="CFC_dueBefore_text">Vençuda per: ?</string>
<string name="CFC_dueBefore_name">Venciment per…</string>

@ -102,13 +102,11 @@
<string name="at_deadline_or_overdue">V termínu nebo po něm</string>
<string name="BFE_Active">Aktivní úkoly</string>
<string name="BFE_Recent">Nedávno upravené</string>
<string name="CFA_universe_all">Aktivní úkoly</string>
<string name="CFA_type_add">nebo</string>
<string name="CFA_type_subtract">ne</string>
<string name="CFA_type_intersect">také</string>
<string name="CFA_context_chain">%s má kritéria</string>
<string name="CFA_context_delete">Odstranit řádek</string>
<string name="CFA_help">Zde můžete vytvořit vlastní filtry. Tlačítkem níže přidejte kritéria. Krátkým, nebo dlouhým stiskem je upravíte. Poté zvolte \"Zobrazit\"!</string>
<string name="CFA_button_add">Přidat podmínku</string>
<string name="CFC_dueBefore_text">Podle termínu: ?</string>
<string name="CFC_dueBefore_name">Podle termínu…</string>

@ -44,13 +44,11 @@
<string name="EPr_default_reminders_title">Standardpåmindelser</string>
<string name="BFE_Active">Aktive opgaver</string>
<string name="BFE_Recent">Senest ændrede</string>
<string name="CFA_universe_all">Aktive opgaver</string>
<string name="CFA_type_add">eller</string>
<string name="CFA_type_subtract">ikke</string>
<string name="CFA_type_intersect">også</string>
<string name="CFA_context_chain">%s har kriterier</string>
<string name="CFA_context_delete">Slet række</string>
<string name="CFA_help">Denne skærm lader dig oprette et nyt filter. Tilføj kriterier ved hjælp af knappen nedenfor, tryk kort eller langt på dem for at justere, og tryk derefter \"Vis\"!</string>
<string name="CFA_button_add">Tilføj kriterier</string>
<string name="CFC_dueBefore_text">Deadline: ?</string>
<string name="CFC_dueBefore_name">Deadline…</string>

@ -119,13 +119,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Bei Ankunft und Abreise</string>
<string name="BFE_Active">Meine Aufgaben</string>
<string name="BFE_Recent">Kürzlich bearbeitet</string>
<string name="CFA_universe_all">Aktuelle Aufgaben</string>
<string name="CFA_type_add">oder</string>
<string name="CFA_type_subtract">nicht</string>
<string name="CFA_type_intersect">auch</string>
<string name="CFA_context_chain">%s hat Kriterien</string>
<string name="CFA_context_delete">Zeile löschen</string>
<string name="CFA_help">Langes Drücken auf Elemente für zusätzliche Optionen</string>
<string name="CFA_button_add">Kriterium hinzufügen</string>
<string name="CFC_dueBefore_text">Fällig am: ?</string>
<string name="CFC_dueBefore_name">Fällig am …</string>

@ -95,7 +95,6 @@
<string name="CFA_type_intersect">επίσης</string>
<string name="CFA_context_chain">%s έχει κριτήρια</string>
<string name="CFA_context_delete">Διαγραφή σειράς</string>
<string name="CFA_help">Αργό πάτημα σε αντικείμενα για επιπλέον επιλογές</string>
<string name="CFA_button_add">Προσθέστε κριτήριο</string>
<string name="CFC_dueBefore_text">Λήγει στίς: ?</string>
<string name="CFC_dueBefore_name">Λήγει στίς…</string>

@ -124,13 +124,11 @@
<string name="default_location_reminder_on_arrival_or_departure">A la salida y llegada</string>
<string name="BFE_Active">Mis Tareas</string>
<string name="BFE_Recent">Recién modificadas</string>
<string name="CFA_universe_all">Tareas activas</string>
<string name="CFA_type_add">o</string>
<string name="CFA_type_subtract">no</string>
<string name="CFA_type_intersect">también</string>
<string name="CFA_context_chain">%s cumple el criterio</string>
<string name="CFA_context_delete">Eliminar Fila</string>
<string name="CFA_help">Mantén pulsado sobre los elementos para opciones adicionales</string>
<string name="CFA_button_add">Añadir Criterio</string>
<string name="CFC_dueBefore_text">Vence el: ?</string>
<string name="CFC_dueBefore_name">Vence el…</string>

@ -90,7 +90,6 @@
<string name="default_location_reminder_on_arrival_or_departure">Saabumisel ja lahkumisel</string>
<string name="BFE_Active">Minu ülesanded</string>
<string name="BFE_Recent">Hiljuti muudetud</string>
<string name="CFA_universe_all">Aktiivsed ülesanded</string>
<string name="CFA_type_add">või</string>
<string name="CFA_type_subtract">pole</string>
<string name="CFA_type_intersect">samuti</string>

@ -127,13 +127,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Ateratzean eta heltzean</string>
<string name="BFE_Active">Nire zereginak</string>
<string name="BFE_Recent">Aldatutako azkenak</string>
<string name="CFA_universe_all">Zeregin aktiboak</string>
<string name="CFA_type_add">edo</string>
<string name="CFA_type_subtract">ez</string>
<string name="CFA_type_intersect">baita</string>
<string name="CFA_context_chain">%s irizpidea du</string>
<string name="CFA_context_delete">Ezabatu errenkada</string>
<string name="CFA_help">Sakatu luze elementuetan aukera gehiagorako</string>
<string name="CFA_button_add">Gehitu irizpidea</string>
<string name="CFC_dueBefore_text">Epemuga: \?</string>
<string name="CFC_dueBefore_name">Epemuga…</string>

@ -79,12 +79,10 @@
<string name="at_deadline_or_overdue">در روز موعد یا پس از موعود</string>
<string name="BFE_Active">وظایف من</string>
<string name="BFE_Recent">اخیرا ویرایش شده</string>
<string name="CFA_universe_all">وظایف فعال</string>
<string name="CFA_type_add">يا</string>
<string name="CFA_type_subtract">نه</string>
<string name="CFA_type_intersect">همچنین</string>
<string name="CFA_context_delete">حذف سطر</string>
<string name="CFA_help">لمس طولانی روی انتخاب برای گزینه های بیشتر</string>
<string name="CFA_button_add">اضافه کردن محتوا</string>
<string name="CFC_dueBefore_name">موعود بر اساس</string>
<string name="no_due_date">بدون موعود</string>

@ -110,13 +110,11 @@
<string name="at_deadline_or_overdue">Määräpäivänä tai yliajalla</string>
<string name="BFE_Active">Omat tehtävät</string>
<string name="BFE_Recent">Äskettäin muokattu</string>
<string name="CFA_universe_all">Tasks aktiivinen</string>
<string name="CFA_type_add">tai</string>
<string name="CFA_type_subtract">ei</string>
<string name="CFA_type_intersect">myös</string>
<string name="CFA_context_chain">%s on perusteet</string>
<string name="CFA_context_delete">Poista rivi</string>
<string name="CFA_help">Pitkä painallus lisäoptioita varten</string>
<string name="CFA_button_add">Lisää kriteeri</string>
<string name="CFC_dueBefore_text">Mennessä: ?</string>
<string name="CFC_dueBefore_name">Mennessä…</string>

@ -118,13 +118,11 @@
<string name="default_location_reminder_on_arrival_or_departure">A l\'arrivée et au départ</string>
<string name="BFE_Active">Mes tâches</string>
<string name="BFE_Recent">Récemment modifié</string>
<string name="CFA_universe_all">Tâches actives</string>
<string name="CFA_type_add">ou</string>
<string name="CFA_type_subtract">non</string>
<string name="CFA_type_intersect">aussi</string>
<string name="CFA_context_chain">%s comme critère</string>
<string name="CFA_context_delete">Supprimer la ligne</string>
<string name="CFA_help">Appuyer longuement pour des options additionnelles</string>
<string name="CFA_button_add">Ajouter un critère</string>
<string name="CFC_dueBefore_text">Échue le : ?</string>
<string name="CFC_dueBefore_name">Échue le…</string>

@ -106,13 +106,11 @@
<string name="at_deadline_or_overdue">En la fecha de vencimiento o ya vencida</string>
<string name="BFE_Active">Mis Tareas</string>
<string name="BFE_Recent">Recién modificadas</string>
<string name="CFA_universe_all">Tareas activas</string>
<string name="CFA_type_add">ou</string>
<string name="CFA_type_subtract">non</string>
<string name="CFA_type_intersect">tamén</string>
<string name="CFA_context_chain">%s cumpre o criterio</string>
<string name="CFA_context_delete">Eliminar Fila</string>
<string name="CFA_help">Mantén pulsado sobre os elementos para opcións adicionáis</string>
<string name="CFA_button_add">Engadir Criterio</string>
<string name="CFC_dueBefore_text">Vence o: ?</string>
<string name="CFC_dueBefore_name">Vence el…</string>

@ -123,13 +123,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Megérkezéskor és elinduláskor</string>
<string name="BFE_Active">Saját Feladatok</string>
<string name="BFE_Recent">Nemrég módosítva</string>
<string name="CFA_universe_all">Aktív feladatok</string>
<string name="CFA_type_add">vagy</string>
<string name="CFA_type_subtract">nem</string>
<string name="CFA_type_intersect">is</string>
<string name="CFA_context_chain">%s rendelkezik kritériummal</string>
<string name="CFA_context_delete">Sor törlése</string>
<string name="CFA_help">Érintsd meg hosszan az elemet további lehetőségekért</string>
<string name="CFA_button_add">Kritérium hozzáadása</string>
<string name="CFC_dueBefore_text">Határidő: ?</string>
<string name="CFC_dueBefore_name">Határidő…</string>

@ -88,11 +88,9 @@
<string name="no_reminders">Tidak ada pengingat</string>
<string name="BFE_Active">Tugas Saya</string>
<string name="BFE_Recent">Baru-baru ini diubah</string>
<string name="CFA_universe_all">Tugas Aktif</string>
<string name="CFA_type_add">atau</string>
<string name="CFA_context_chain">%s memiliki kriteria</string>
<string name="CFA_context_delete">Hapus Baris</string>
<string name="CFA_help">Tekan lama pada item untuk opsi tambahan</string>
<string name="CFA_button_add">Tambah Kriteria</string>
<string name="next_month">Bulan Depan</string>
<string name="CFC_importance_name">Prioritas…</string>

@ -122,13 +122,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Su arrivo e partenza</string>
<string name="BFE_Active">Le mie attività</string>
<string name="BFE_Recent">Modificate di recente</string>
<string name="CFA_universe_all">Attività in corso</string>
<string name="CFA_type_add">o</string>
<string name="CFA_type_subtract">non</string>
<string name="CFA_type_intersect">anche</string>
<string name="CFA_context_chain">%s ha dei criteri</string>
<string name="CFA_context_delete">Cancella Riga</string>
<string name="CFA_help">Tenere premuto sulla voce per le opzioni aggiuntive</string>
<string name="CFA_button_add">Aggiungi Criteri</string>
<string name="CFC_dueBefore_text">Entro: ?</string>
<string name="CFC_dueBefore_name">Entro…</string>

@ -127,13 +127,11 @@
<string name="default_location_reminder_on_arrival_or_departure">ברגע ההגעה והעזיבה</string>
<string name="BFE_Active">המשימות שלי</string>
<string name="BFE_Recent">עודכנו לאחרונה</string>
<string name="CFA_universe_all">משימות פעילות</string>
<string name="CFA_type_add">או</string>
<string name="CFA_type_subtract">לא</string>
<string name="CFA_type_intersect">וגם</string>
<string name="CFA_context_chain">%s כולל קריטריונים</string>
<string name="CFA_context_delete">מחק שורה</string>
<string name="CFA_help">לחיצה ארוכה על פריטים כדי לקבל אפשרויות נוספות</string>
<string name="CFA_button_add">הוסף קריטריון</string>
<string name="CFC_dueBefore_text">תאריך יעד לפי: ?</string>
<string name="CFC_dueBefore_name">מועד יעד…</string>

@ -120,13 +120,11 @@
<string name="default_location_reminder_on_arrival_or_departure">到着と出発時</string>
<string name="BFE_Active">マイ タスク</string>
<string name="BFE_Recent">最近編集したタスク</string>
<string name="CFA_universe_all">進行中のタスク</string>
<string name="CFA_type_add">または</string>
<string name="CFA_type_subtract">除外</string>
<string name="CFA_type_intersect">かつ</string>
<string name="CFA_context_chain">%s</string>
<string name="CFA_context_delete">条件の削除</string>
<string name="CFA_help">アイテムを長押しして追加オプション</string>
<string name="CFA_button_add">条件の追加</string>
<string name="CFC_dueBefore_text">期限: ?</string>
<string name="CFC_dueBefore_name">期限</string>

@ -124,13 +124,11 @@
<string name="default_location_reminder_on_arrival_or_departure">도착 및 출발 시</string>
<string name="BFE_Active">나의 할일</string>
<string name="BFE_Recent">최근에 수정한 할일</string>
<string name="CFA_universe_all">실행중인 할일</string>
<string name="CFA_type_add">또는</string>
<string name="CFA_type_subtract">제외</string>
<string name="CFA_type_intersect">또한</string>
<string name="CFA_context_chain">%s 은 기준이 있습니다</string>
<string name="CFA_context_delete">가로줄 삭제</string>
<string name="CFA_help">추가로 설정하려면 항목에서 길게 누르기</string>
<string name="CFA_button_add">기준 추가</string>
<string name="CFC_dueBefore_text">마감일: ?</string>
<string name="CFC_dueBefore_name">마감일…</string>

@ -120,13 +120,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Atvykus ir išvykstant</string>
<string name="BFE_Active">Mano užduotys</string>
<string name="BFE_Recent">Neseniai redaguoti</string>
<string name="CFA_universe_all">Aktyvios užduotys</string>
<string name="CFA_type_add">arba</string>
<string name="CFA_type_subtract">ne</string>
<string name="CFA_type_intersect">taip pat</string>
<string name="CFA_context_chain">%s turi kriterijų</string>
<string name="CFA_context_delete">Ištrinti eilutę</string>
<string name="CFA_help">Ilgas paspaudimas ant elemento papildomoms opcijoms</string>
<string name="CFA_button_add">Pridėti kriterijų</string>
<string name="CFC_dueBefore_text">Pabaigos terminas pagal: ?</string>
<string name="CFC_dueBefore_name">Terminas pagal…</string>

@ -49,12 +49,10 @@
<string name="dont_hide">Ikke skjul</string>
<string name="BFE_Active">Mine oppgaver</string>
<string name="BFE_Recent">Nylig endret</string>
<string name="CFA_universe_all">Aktive oppgaver</string>
<string name="CFA_type_add">eller</string>
<string name="CFA_type_intersect">også</string>
<string name="CFA_context_chain">%s har kriterier</string>
<string name="CFA_context_delete">Slett rad</string>
<string name="CFA_help">Lang-trykk på elementer for ytterligere valg</string>
<string name="CFA_button_add">Legg til kriterium</string>
<string name="CFC_dueBefore_text">Frist til: ?</string>
<string name="CFC_dueBefore_name">Frist til…</string>

@ -119,13 +119,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Bij aankomst en vertrek</string>
<string name="BFE_Active">Mijn taken</string>
<string name="BFE_Recent">Onlangs aangepast</string>
<string name="CFA_universe_all">Actieve taken</string>
<string name="CFA_type_add">of</string>
<string name="CFA_type_subtract">niet</string>
<string name="CFA_type_intersect">ook</string>
<string name="CFA_context_chain">%s met criteria</string>
<string name="CFA_context_delete">Regel verwijderen</string>
<string name="CFA_help">Lang drukken op items voor extra opties</string>
<string name="CFA_button_add">Criteria toevoegen</string>
<string name="CFC_dueBefore_text">Einddatum: ?</string>
<string name="CFC_dueBefore_name">Einddatum…</string>

@ -120,13 +120,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Po przybyciu i przy wyruszeniu</string>
<string name="BFE_Active">Moje zadania</string>
<string name="BFE_Recent">Niedawno zmodyfikowane</string>
<string name="CFA_universe_all">Aktywne zadania</string>
<string name="CFA_type_add">lub</string>
<string name="CFA_type_subtract">nie</string>
<string name="CFA_type_intersect">także</string>
<string name="CFA_context_chain">%s zawiera kryteria</string>
<string name="CFA_context_delete">Usuń kryterium</string>
<string name="CFA_help">Przytrzymaj dłużej na obiekcie dla dodatkowych opcji</string>
<string name="CFA_button_add">Dodaj kryterium</string>
<string name="CFC_dueBefore_text">Termin wykonania: ?</string>
<string name="CFC_dueBefore_name">Termin wykonania…</string>

@ -121,13 +121,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Ao chegar e ao sair</string>
<string name="BFE_Active">Minhas Tarefas</string>
<string name="BFE_Recent">Modificadas recentemente</string>
<string name="CFA_universe_all">Tarefas ativas</string>
<string name="CFA_type_add">ou</string>
<string name="CFA_type_subtract">não</string>
<string name="CFA_type_intersect">e também</string>
<string name="CFA_context_chain">%s tem critério</string>
<string name="CFA_context_delete">Remover critério</string>
<string name="CFA_help">Pressione e segure um item para mais opções</string>
<string name="CFA_button_add">Adicionar Critério</string>
<string name="CFC_dueBefore_text">Vencimento: ?</string>
<string name="CFC_dueBefore_name">Vencimento…</string>

@ -108,13 +108,11 @@
<string name="at_deadline_or_overdue">Na data limite ou ultrapassada</string>
<string name="BFE_Active">Minhas tarefas</string>
<string name="BFE_Recent">Alteradas recentemente</string>
<string name="CFA_universe_all">Tarefas ativas</string>
<string name="CFA_type_add">ou</string>
<string name="CFA_type_subtract">não</string>
<string name="CFA_type_intersect">também</string>
<string name="CFA_context_chain">%s tem critérios</string>
<string name="CFA_context_delete">Eliminar linha</string>
<string name="CFA_help">Clique longo nos itens para mais opções</string>
<string name="CFA_button_add">Adicionar critério</string>
<string name="CFC_dueBefore_text">Data limite: ?</string>
<string name="CFC_dueBefore_name">Data limite…</string>

@ -126,13 +126,11 @@
<string name="default_location_reminder_on_arrival_or_departure">По прибытии и покинув место</string>
<string name="BFE_Active">Мои задачи</string>
<string name="BFE_Recent">Недавно изменённые</string>
<string name="CFA_universe_all">Активные задачи</string>
<string name="CFA_type_add">или</string>
<string name="CFA_type_subtract">не</string>
<string name="CFA_type_intersect">и</string>
<string name="CFA_context_chain">%s содержит критерий</string>
<string name="CFA_context_delete">Удалить строку</string>
<string name="CFA_help">Долгое нажатие на пункт для дополнительных опций</string>
<string name="CFA_button_add">Добавить условие</string>
<string name="CFC_dueBefore_text">Конечный срок: ?</string>
<string name="CFC_dueBefore_name">Конечный срок…</string>

@ -120,13 +120,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Pri príchode aj pri odchode</string>
<string name="BFE_Active">Moje Úlohy</string>
<string name="BFE_Recent">Naposledy upravené</string>
<string name="CFA_universe_all">Aktívne Úlohy</string>
<string name="CFA_type_add">alebo</string>
<string name="CFA_type_subtract">nie</string>
<string name="CFA_type_intersect">tiež</string>
<string name="CFA_context_chain">%s má kritériá</string>
<string name="CFA_context_delete">Zmazať riadok</string>
<string name="CFA_help">Dlhšie stlačte na položku pre viac možnosti</string>
<string name="CFA_button_add">Pridať kritériá</string>
<string name="CFC_dueBefore_text">Podľa termínu: ?</string>
<string name="CFC_dueBefore_name">Podľa termínu…</string>

@ -92,13 +92,11 @@
<string name="at_deadline_or_overdue">Ob dospelosti ali potem</string>
<string name="BFE_Active">Moji Opravki</string>
<string name="BFE_Recent">Nedavno spremenjeno</string>
<string name="CFA_universe_all">Aktivni Opravki</string>
<string name="CFA_type_add">na dan</string>
<string name="CFA_type_subtract">ne</string>
<string name="CFA_type_intersect">tudi</string>
<string name="CFA_context_chain">%s ima merila</string>
<string name="CFA_context_delete">Zbriši vrstico</string>
<string name="CFA_help">Dolg dotik na predmetih s seznama za dodatne možnosti </string>
<string name="CFA_button_add">Dodaj merila</string>
<string name="CFC_dueBefore_text">Opraviti do: ?</string>
<string name="CFC_dueBefore_name">Opraviti do:</string>

@ -12,7 +12,6 @@
<string name="CFA_type_intersect">takođe</string>
<string name="CFA_context_chain">%s od kriterijuma</string>
<string name="CFA_context_delete">Izbriši red</string>
<string name="CFA_help">Dugi pritisak za dodatne opcije</string>
<string name="CFA_button_add">Dodati kriterijum</string>
<string name="CFC_dueBefore_text">Po datumu: ?</string>
<string name="gcal_completed_title">%s (završeno)</string>

@ -107,13 +107,11 @@
<string name="at_deadline_or_overdue">Vid eller efter förfallodagen</string>
<string name="BFE_Active">Mina Uppgifter</string>
<string name="BFE_Recent">Nyligen ändrade</string>
<string name="CFA_universe_all">Aktiva uppgifter</string>
<string name="CFA_type_add">eller</string>
<string name="CFA_type_subtract">inte</string>
<string name="CFA_type_intersect">också</string>
<string name="CFA_context_chain">%s har kriterier</string>
<string name="CFA_context_delete">Radera rad</string>
<string name="CFA_help">Håll länge på en post för att visa fler alternativ</string>
<string name="CFA_button_add">Lägg till kriterium</string>
<string name="CFC_dueBefore_text">Förfaller innan: ?</string>
<string name="CFC_dueBefore_name">Förfaller innan…</string>

@ -19,7 +19,6 @@
<string name="TEA_control_notes">บันทึกย่อ</string>
<string name="BFE_Active">แผนงานตอนนี้</string>
<string name="BFE_Recent">เพิ่งถูกแก้ไข</string>
<string name="CFA_universe_all">แผนงานตอนนี้</string>
<string name="CFA_type_add">หรือ</string>
<string name="CFA_type_subtract">ไม่ใช่</string>
<string name="CFA_type_intersect">รวมถึง</string>

@ -125,13 +125,11 @@
<string name="default_location_reminder_on_arrival_or_departure">Varışta ve kalkışta</string>
<string name="BFE_Active">Görevlerim</string>
<string name="BFE_Recent">Yakında değiştirilenler</string>
<string name="CFA_universe_all">Etkin Görevler</string>
<string name="CFA_type_add">veya</string>
<string name="CFA_type_subtract">değil</string>
<string name="CFA_type_intersect">ayrıca</string>
<string name="CFA_context_chain">%s ölçütüne sahip</string>
<string name="CFA_context_delete">Satırı Sil</string>
<string name="CFA_help">Ek seçenekler için ögelere uzun basın</string>
<string name="CFA_button_add">Ölçüt Ekle</string>
<string name="CFC_dueBefore_text">Bitiş: \?</string>
<string name="CFC_dueBefore_name">Bitiş…</string>

@ -123,13 +123,11 @@
<string name="default_location_reminder_on_arrival_or_departure">По прибуттю та відправці</string>
<string name="BFE_Active">Мої завдання</string>
<string name="BFE_Recent">Недавно змінені</string>
<string name="CFA_universe_all">Активні завдання</string>
<string name="CFA_type_add">або</string>
<string name="CFA_type_subtract">ні</string>
<string name="CFA_type_intersect">також</string>
<string name="CFA_context_chain">%s має критерії</string>
<string name="CFA_context_delete">Видалити рядок</string>
<string name="CFA_help">Довгий тап на пункт для додаткових опцій</string>
<string name="CFA_button_add">Додати критерій</string>
<string name="CFC_dueBefore_text">Кінцевий термін: ?</string>
<string name="CFC_dueBefore_name">Кінцевий термін…</string>

@ -113,13 +113,11 @@
<string name="at_deadline_or_overdue">截止期限或过期时</string>
<string name="BFE_Active">我的任务</string>
<string name="BFE_Recent">最近修改过的</string>
<string name="CFA_universe_all">进行中的任务</string>
<string name="CFA_type_add"></string>
<string name="CFA_type_subtract"></string>
<string name="CFA_type_intersect"></string>
<string name="CFA_context_chain">%s 含条件</string>
<string name="CFA_context_delete">删除行</string>
<string name="CFA_help">长按项目来添加选项</string>
<string name="CFA_button_add">添加条件</string>
<string name="CFC_dueBefore_text">期限: ?</string>
<string name="CFC_dueBefore_name">何时到期…</string>

@ -95,13 +95,11 @@
<string name="at_deadline_or_overdue">在截止期限或過期時</string>
<string name="BFE_Active">我的工作</string>
<string name="BFE_Recent">最近修改過</string>
<string name="CFA_universe_all">進行中的工作</string>
<string name="CFA_type_add"></string>
<string name="CFA_type_subtract"></string>
<string name="CFA_type_intersect"></string>
<string name="CFA_context_chain">%s 含條件</string>
<string name="CFA_context_delete">刪除列</string>
<string name="CFA_help">長按開啟額外選項</string>
<string name="CFA_button_add">加入條件</string>
<string name="CFC_dueBefore_text">期限: ?</string>
<string name="CFC_dueBefore_name">期限…</string>

@ -132,13 +132,11 @@ File %1$s contained %2$s.\n\n
<string name="default_location_reminder_on_arrival_or_departure">On arrival and departure</string>
<string name="BFE_Active">My Tasks</string>
<string name="BFE_Recent">Recently modified</string>
<string name="CFA_universe_all">Active Tasks</string>
<string name="CFA_type_add">or</string>
<string name="CFA_type_subtract">not</string>
<string name="CFA_type_intersect">also</string>
<string name="CFA_context_chain">%s has criteria</string>
<string name="CFA_context_delete">Delete Row</string>
<string name="CFA_help">Long press on items for additional options</string>
<string name="CFA_button_add">Add Criteria</string>
<string name="CFC_dueBefore_text">Due By: ?</string>
<string name="CFC_dueBefore_name">Due By…</string>
@ -604,4 +602,9 @@ File %1$s contained %2$s.\n\n
<string name="widget_id">Widget ID: %d</string>
<string name="settings_default">Default</string>
<string name="compact">Compact</string>
<string name="choose_new_criteria">Choose new criteria</string>
<string name="custom_filter_criteria">Filter criteria</string>
<string name="custom_filter_and">AND</string>
<string name="custom_filter_or">OR</string>
<string name="custom_filter_not">NOT</string>
</resources>

Loading…
Cancel
Save