From 16e117719f1ee75e36ee479f2e40d75b4cf14dcd Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 26 Feb 2016 16:49:45 -0600 Subject: [PATCH] Add option to set default list Closes #111 Closes #284 Closes #256 --- .../astrid/activity/TaskListActivity.java | 9 +- .../activities/FilterSelectionActivity.java | 2 + .../preferences/AppearancePreferences.java | 24 ++++++ .../preferences/DefaultFilterProvider.java | 83 +++++++++++++++++++ .../org/tasks/preferences/Preferences.java | 8 ++ src/main/res/values/keys.xml | 8 ++ src/main/res/values/strings.xml | 1 + src/main/res/xml/preferences_appearance.xml | 5 ++ 8 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/tasks/preferences/DefaultFilterProvider.java diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 7dd935b9c..214e781a1 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -23,7 +23,6 @@ import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.api.PermaSql; -import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.service.StartupService; @@ -38,6 +37,7 @@ import org.tasks.fragments.TaskEditControlSetFragmentManager; import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.intents.TaskIntents; import org.tasks.preferences.ActivityPreferences; +import org.tasks.preferences.DefaultFilterProvider; import org.tasks.receivers.RepeatConfirmationReceiver; import org.tasks.ui.EmptyTaskEditFragment; import org.tasks.ui.NavigationDrawerFragment; @@ -68,6 +68,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements @Inject TaskService taskService; @Inject TaskEditControlSetFragmentManager taskEditControlSetFragmentManager; @Inject RepeatConfirmationReceiver repeatConfirmationReceiver; + @Inject DefaultFilterProvider defaultFilterProvider; public static final int REQUEST_UPGRADE = 505; @@ -129,7 +130,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements } else { taskListFragment = getTaskListFragment(); if (taskListFragment == null) { - taskListFragment = newTaskListFragment(getDefaultFilter()); + taskListFragment = newTaskListFragment(defaultFilterProvider.getDefaultFilter()); } } loadTaskListFragment(taskListFragment); @@ -196,10 +197,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements AndroidUtilities.tryUnregisterReceiver(this, repeatConfirmationReceiver); } - protected Filter getDefaultFilter() { - return BuiltInFilterExposer.getMyTasksFilter(getResources()); - } - @Override public void onFilterItemClicked(FilterListItem item) { TaskEditFragment tef = getTaskEditFragment(); diff --git a/src/main/java/org/tasks/activities/FilterSelectionActivity.java b/src/main/java/org/tasks/activities/FilterSelectionActivity.java index baa710a84..62d3579e5 100644 --- a/src/main/java/org/tasks/activities/FilterSelectionActivity.java +++ b/src/main/java/org/tasks/activities/FilterSelectionActivity.java @@ -18,6 +18,7 @@ import javax.inject.Inject; public class FilterSelectionActivity extends InjectingAppCompatActivity { + public static final String EXTRA_FILTER = "extra_filter"; public static final String EXTRA_FILTER_NAME = "extra_filter_name"; public static final String EXTRA_FILTER_SQL = "extra_filter_query"; public static final String EXTRA_FILTER_VALUES = "extra_filter_values"; @@ -42,6 +43,7 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity { public void onClick(DialogInterface dialog, int which) { final Filter selectedFilter = (Filter) filterAdapter.getItem(which); setResult(RESULT_OK, new Intent() {{ + putExtra(EXTRA_FILTER, selectedFilter); putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle); putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery()); if (selectedFilter.valuesForNewTasks != null) { diff --git a/src/main/java/org/tasks/preferences/AppearancePreferences.java b/src/main/java/org/tasks/preferences/AppearancePreferences.java index 94106b79c..72ad5425a 100644 --- a/src/main/java/org/tasks/preferences/AppearancePreferences.java +++ b/src/main/java/org/tasks/preferences/AppearancePreferences.java @@ -5,18 +5,26 @@ import android.os.Bundle; import android.preference.Preference; import com.todoroo.astrid.activity.BeastModePreferences; +import com.todoroo.astrid.api.Filter; import org.tasks.R; +import org.tasks.activities.FilterSelectionActivity; import org.tasks.injection.InjectingPreferenceActivity; +import javax.inject.Inject; + public class AppearancePreferences extends InjectingPreferenceActivity { private static final int REQUEST_CUSTOMIZE = 1004; + private static final int REQUEST_DEFAULT_LIST = 1005; private static final String EXTRA_BUNDLE = "extra_bundle"; public static String EXTRA_RESTART = "extra_restart"; public static String EXTRA_FILTERS_CHANGED = "extra_filters_changed"; + @Inject Preferences preferences; + @Inject DefaultFilterProvider defaultFilterProvider; + private Bundle result; @Override @@ -42,6 +50,16 @@ public class AppearancePreferences extends InjectingPreferenceActivity { return true; } }); + Preference defaultList = findPreference(getString(R.string.p_default_list_name)); + Filter filter = defaultFilterProvider.getDefaultFilter(); + defaultList.setSummary(filter.listingTitle); + defaultList.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startActivityForResult(new Intent(AppearancePreferences.this, FilterSelectionActivity.class), REQUEST_DEFAULT_LIST); + return true; + } + }); } @Override @@ -65,6 +83,12 @@ public class AppearancePreferences extends InjectingPreferenceActivity { if (resultCode == RESULT_OK) { result.putBoolean(EXTRA_RESTART, true); } + } else if (requestCode == REQUEST_DEFAULT_LIST) { + if (resultCode == RESULT_OK) { + Filter filter = data.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER); + defaultFilterProvider.setDefaultFilter(filter); + findPreference(getString(R.string.p_default_list_name)).setSummary(filter.listingTitle); + } } else { super.onActivityResult(requestCode, resultCode, data); } diff --git a/src/main/java/org/tasks/preferences/DefaultFilterProvider.java b/src/main/java/org/tasks/preferences/DefaultFilterProvider.java new file mode 100644 index 000000000..79c426a42 --- /dev/null +++ b/src/main/java/org/tasks/preferences/DefaultFilterProvider.java @@ -0,0 +1,83 @@ +package org.tasks.preferences; + +import android.content.ComponentName; +import android.content.ContentValues; +import android.content.Context; + +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.astrid.api.CustomFilter; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterWithCustomIntent; +import com.todoroo.astrid.core.BuiltInFilterExposer; + +import org.tasks.R; +import org.tasks.injection.ForApplication; + +import javax.inject.Inject; + +import timber.log.Timber; + +import static com.google.common.base.Strings.isNullOrEmpty; + +public class DefaultFilterProvider { + + private static final int TYPE_FILTER = 0; + private static final int TYPE_CUSTOM_FILTER = 1; + private static final int TYPE_FILTER_WITH_CUSTOM_INTENT = 2; + + private final Context context; + private final Preferences preferences; + + @Inject + public DefaultFilterProvider(@ForApplication Context context, Preferences preferences) { + this.context = context; + this.preferences = preferences; + } + + public Filter getDefaultFilter() { + String listName = preferences.getStringValue(R.string.p_default_list_name); + if (!isNullOrEmpty(listName)) { + try { + ContentValues valuesForNewTasks = AndroidUtilities.contentValuesFromSerializedString(preferences.getStringValue(R.string.p_default_list_values)); + String sqlQuery = preferences.getStringValue(R.string.p_default_list_sql); + switch (preferences.getInt(R.string.p_default_list_type)) { + case TYPE_FILTER_WITH_CUSTOM_INTENT: + FilterWithCustomIntent filterWithCustomIntent = new FilterWithCustomIntent(listName, sqlQuery, valuesForNewTasks); + filterWithCustomIntent.customExtras = AndroidUtilities.bundleFromSerializedString(preferences.getStringValue(R.string.p_default_list_extras)); + filterWithCustomIntent.customTaskList = ComponentName.unflattenFromString(preferences.getStringValue(R.string.p_default_list_class)); + return filterWithCustomIntent; + case TYPE_CUSTOM_FILTER: + return new CustomFilter(listName, sqlQuery, valuesForNewTasks, preferences.getLong(R.string.p_default_list_id, 0L)); + } + return new Filter(listName, sqlQuery, valuesForNewTasks); + } catch (Exception e) { + Timber.e(e, e.getMessage()); + } + } + return BuiltInFilterExposer.getMyTasksFilter(context.getResources()); + } + + public void setDefaultFilter(Filter filter) { + preferences.setString(R.string.p_default_list_name, filter.listingTitle); + preferences.setString(R.string.p_default_list_sql, filter.getSqlQuery()); + preferences.setInt(R.string.p_default_list_type, getFilterType(filter)); + preferences.setString(R.string.p_default_list_values, filter.valuesForNewTasks != null + ? AndroidUtilities.contentValuesToSerializedString(filter.valuesForNewTasks) + : null); + if (filter instanceof FilterWithCustomIntent) { + preferences.setString(R.string.p_default_list_class, ((FilterWithCustomIntent) filter).customTaskList.flattenToString()); + preferences.setString(R.string.p_default_list_extras, AndroidUtilities.bundleToSerializedString(((FilterWithCustomIntent) filter).customExtras)); + } else if (filter instanceof CustomFilter) { + preferences.setLong(R.string.p_default_list_id, ((CustomFilter) filter).getId()); + } + } + + private int getFilterType(Filter filter) { + if (filter instanceof FilterWithCustomIntent) { + return TYPE_FILTER_WITH_CUSTOM_INTENT; + } else if (filter instanceof CustomFilter) { + return TYPE_CUSTOM_FILTER; + } + return TYPE_FILTER; + } +} diff --git a/src/main/java/org/tasks/preferences/Preferences.java b/src/main/java/org/tasks/preferences/Preferences.java index 594dd970e..f2939b0b2 100644 --- a/src/main/java/org/tasks/preferences/Preferences.java +++ b/src/main/java/org/tasks/preferences/Preferences.java @@ -237,10 +237,18 @@ public class Preferences { editor.commit(); } + public long getLong(int resourceId, long defValue) { + return getLong(context.getString(resourceId), defValue); + } + public long getLong(String key, long defValue) { return prefs.getLong(key, defValue); } + public void setLong(int resourceId, long value) { + setLong(context.getString(resourceId), value); + } + public void setLong(String key, long value) { Editor editor = prefs.edit(); editor.putLong(key, value); diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml index 24577ceae..4d9567ee1 100644 --- a/src/main/res/values/keys.xml +++ b/src/main/res/values/keys.xml @@ -280,4 +280,12 @@ collect_statistics back_button_saves_task + default_list_name + default_list_sql + default_list_values + default_list_type + default_list_id + default_list_class + default_list_extras + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 0fc096005..9d1c04759 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -898,6 +898,7 @@ File %1$s contained %2$s.\n\n Android will allow limited interruptions while device is in Doze mode (No title) Back button saves task + Default list diff --git a/src/main/res/xml/preferences_appearance.xml b/src/main/res/xml/preferences_appearance.xml index b02a8089f..403cc4f7f 100644 --- a/src/main/res/xml/preferences_appearance.xml +++ b/src/main/res/xml/preferences_appearance.xml @@ -8,6 +8,11 @@ android:title="@string/EPr_use_dark_theme" /> + + +