Replace filter with filter ID in widgets

pull/384/head
Alex Baker 8 years ago
parent aef5ae7cb1
commit 79c2850eb7

@ -115,7 +115,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
TaskEditFragment taskEditFragment = getTaskEditFragment();
List<TaskEditControlFragment> taskEditControlFragments = null;
if (taskEditFragment != null) {
if (intent.hasExtra(OPEN_FILTER) || intent.hasExtra(OPEN_TASK)) {
if (intent.hasExtra(OPEN_FILTER) || intent.hasExtra(LOAD_FILTER) || intent.hasExtra(OPEN_TASK)) {
taskEditFragment.save();
taskEditFragment = null;
} else {

@ -774,8 +774,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
Filter filter = TagFilterExposer.filterFromTagData(getActivity(), td);
((TaskListActivity) getActivity()).onFilterItemClicked(filter);
}
} else {
refresh();
}
} else if (AstridApiConstants.BROADCAST_EVENT_TAG_DELETED.equals(action)) {
TagData tagData = getActiveTagData();
@ -786,12 +784,11 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
if (activeUuid.equals(uuid)) {
((TaskListActivity) getActivity()).onFilterItemClicked(BuiltInFilterExposer.getMyTasksFilter(getResources()));
((TaskListActivity) getActivity()).clearNavigationDrawer(); // Should auto refresh
} else {
refresh();
}
}
((TaskListActivity) getActivity()).refreshNavigationDrawer();
broadcaster.refresh();
}
} else if (requestCode == REQUEST_EDIT_FILTER) {
if (resultCode == Activity.RESULT_OK) {
@ -804,6 +801,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
((TaskListActivity) getActivity()).refreshNavigationDrawer();
broadcaster.refresh();
}
} else if (requestCode == REQUEST_SORT) {
if (resultCode == Activity.RESULT_OK) {

@ -49,6 +49,10 @@ public final class CustomFilterExposer {
}
private Filter load(StoreObject savedFilter) {
if (savedFilter == null) {
return null;
}
String title = savedFilter.getValue(SavedFilter.NAME);
String sql = savedFilter.getValue(SavedFilter.SQL);
String values = savedFilter.getValue(SavedFilter.VALUES);

@ -63,6 +63,9 @@ public class TagFilterExposer {
/** Create filter from new tag object */
public static FilterWithCustomIntent filterFromTag(Context context, TagData tag, Criterion criterion) {
if (tag == null) {
return null;
}
String title = tag.getName();
if (TextUtils.isEmpty(title)) {
return null;

@ -8,27 +8,20 @@ package com.todoroo.astrid.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.RemoteViews;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.tags.TagFilterExposer;
import org.tasks.Broadcaster;
import org.tasks.R;
import org.tasks.injection.BroadcastComponent;
import org.tasks.injection.InjectingAppWidgetProvider;
import org.tasks.intents.TaskIntents;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences;
import org.tasks.widget.ScrollableWidgetUpdateService;
@ -39,20 +32,20 @@ import timber.log.Timber;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.todoroo.astrid.api.AstridApiConstants.BROADCAST_EVENT_REFRESH;
import static org.tasks.intents.TaskIntents.getEditTaskStack;
import static org.tasks.intents.TaskIntents.getEditTaskIntent;
public class TasksWidget extends InjectingAppWidgetProvider {
private static int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
@Inject Broadcaster broadcaster;
@Inject TagDataDao tagDataDao;
@Inject Preferences preferences;
@Inject DefaultFilterProvider defaultFilterProvider;
public static final String COMPLETE_TASK = "COMPLETE_TASK";
public static final String EDIT_TASK = "EDIT_TASK";
public static final String EXTRA_FILTER = "extra_filter";
public static final String EXTRA_FILTER_ID = "extra_filter_id";
public static final String EXTRA_ID = "extra_id"; //$NON-NLS-1$
@Override
@ -65,8 +58,10 @@ public class TasksWidget extends InjectingAppWidgetProvider {
break;
case EDIT_TASK:
long taskId = intent.getLongExtra(EXTRA_ID, 0);
Filter filter = intent.getParcelableExtra(EXTRA_FILTER);
getEditTaskStack(context, filter, taskId).startActivities();
String filterId = intent.getStringExtra(EXTRA_FILTER_ID);
Intent editTaskIntent = getEditTaskIntent(context, filterId, taskId);
editTaskIntent.setFlags(flags);
context.startActivity(editTaskIntent);
break;
case BROADCAST_EVENT_REFRESH:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
@ -97,11 +92,9 @@ public class TasksWidget extends InjectingAppWidgetProvider {
}
private RemoteViews createScrollableWidget(Context context, int id) {
Filter filter = getFilter(context, id);
String filterId = preferences.getStringValue(WidgetConfigActivity.PREF_WIDGET_ID + id);
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class);
Bundle filterBundle = new Bundle(com.todoroo.astrid.api.Filter.class.getClassLoader());
filterBundle.putParcelable(ScrollableWidgetUpdateService.FILTER, filter);
rvIntent.putExtra(ScrollableWidgetUpdateService.FILTER, filterBundle);
rvIntent.putExtra(ScrollableWidgetUpdateService.FILTER_ID, filterId);
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
boolean darkTheme = preferences.useDarkWidgetTheme(id);
@ -114,11 +107,12 @@ public class TasksWidget extends InjectingAppWidgetProvider {
remoteViews.setInt(R.id.list_view, "setBackgroundColor", android.R.color.transparent);
remoteViews.setInt(R.id.empty_view, "setBackgroundColor", android.R.color.transparent);
}
Filter filter = defaultFilterProvider.getFilterFromPreference(filterId);
remoteViews.setTextViewText(R.id.widget_title, filter.listingTitle);
remoteViews.setRemoteAdapter(R.id.list_view, rvIntent);
remoteViews.setEmptyView(R.id.list_view, R.id.empty_view);
remoteViews.setOnClickPendingIntent(R.id.widget_title, getOpenListIntent(context, filter, id));
remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filter, id));
remoteViews.setOnClickPendingIntent(R.id.widget_title, getOpenListIntent(context, filterId, id));
remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filterId, id));
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context));
return remoteViews;
}
@ -128,74 +122,15 @@ public class TasksWidget extends InjectingAppWidgetProvider {
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
private PendingIntent getOpenListIntent(Context context, Filter filter, int widgetId) {
Intent intent = TaskIntents.getTaskListIntent(context, filter);
private PendingIntent getOpenListIntent(Context context, String filterId, int widgetId) {
Intent intent = TaskIntents.getTaskListByIdIntent(context, filterId);
intent.setFlags(flags);
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
private PendingIntent getNewTaskIntent(Context context, Filter filter, int widgetId) {
Intent intent = TaskIntents.getNewTaskIntent(context, filter);
private PendingIntent getNewTaskIntent(Context context, String filterId, int widgetId) {
Intent intent = TaskIntents.getNewTaskIntent(context, filterId);
intent.setFlags(flags);
return PendingIntent.getActivity(context, -widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
private Filter getFilter(Context context, int widgetId) {
// base our filter off the inbox filter, replace stuff if we have it
Filter filter = BuiltInFilterExposer.getMyTasksFilter(context.getResources());
String sql = preferences.getStringValue(WidgetConfigActivity.PREF_SQL + widgetId);
if (sql != null) {
sql = sql.replace("tasks.userId=0", "1"); // TODO: replace dirty hack for missing column
filter.setSqlQuery(sql);
}
String title = preferences.getStringValue(WidgetConfigActivity.PREF_TITLE + widgetId);
if (title != null) {
filter.listingTitle = title;
}
String contentValues = preferences.getStringValue(WidgetConfigActivity.PREF_VALUES + widgetId);
if (contentValues != null) {
filter.valuesForNewTasks = AndroidUtilities.contentValuesFromSerializedString(contentValues);
}
String customComponent = preferences.getStringValue(WidgetConfigActivity.PREF_CUSTOM_INTENT
+ widgetId);
if (customComponent != null) {
ComponentName component = ComponentName.unflattenFromString(customComponent);
filter = new FilterWithCustomIntent(filter.listingTitle, filter.getSqlQuery(), filter.valuesForNewTasks);
((FilterWithCustomIntent) filter).customTaskList = component;
String serializedExtras = preferences.getStringValue(WidgetConfigActivity.PREF_CUSTOM_EXTRAS
+ widgetId);
((FilterWithCustomIntent) filter).customExtras = AndroidUtilities.bundleFromSerializedString(serializedExtras);
}
// Validate tagData
long id = preferences.getLong(WidgetConfigActivity.PREF_TAG_ID + widgetId, 0);
TagData tagData;
if (id > 0) {
tagData = tagDataDao.fetch(id, TagData.ID, TagData.NAME, TagData.UUID);
if (tagData != null && !tagData.getName().equals(filter.listingTitle)) { // Tag has been renamed; rebuild filter
filter = TagFilterExposer.filterFromTagData(context, tagData);
preferences.setString(WidgetConfigActivity.PREF_SQL + widgetId, filter.getSqlQuery());
preferences.setString(WidgetConfigActivity.PREF_TITLE + widgetId, filter.listingTitle);
ContentValues newTaskValues = filter.valuesForNewTasks;
String contentValuesString = null;
if (newTaskValues != null) {
contentValuesString = AndroidUtilities.contentValuesToSerializedString(newTaskValues);
}
preferences.setString(WidgetConfigActivity.PREF_VALUES + widgetId, contentValuesString);
String flattenedExtras = AndroidUtilities.bundleToSerializedString(((FilterWithCustomIntent) filter).customExtras);
if (flattenedExtras != null) {
preferences.setString(WidgetConfigActivity.PREF_CUSTOM_EXTRAS + widgetId,
flattenedExtras);
}
}
} else {
tagData = tagDataDao.getTagByName(filter.listingTitle, TagData.ID);
if (tagData != null) {
preferences.setLong(WidgetConfigActivity.PREF_TAG_ID + widgetId, tagData.getId());
}
}
return filter;
}
}

@ -6,7 +6,6 @@
package com.todoroo.astrid.widget;
import android.appwidget.AppWidgetManager;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.util.DisplayMetrics;
@ -15,11 +14,9 @@ import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import org.tasks.R;
import org.tasks.filters.FilterCounter;
@ -27,17 +24,13 @@ import org.tasks.filters.FilterProvider;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingListActivity;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.DefaultFilterProvider;
import javax.inject.Inject;
public class WidgetConfigActivity extends InjectingListActivity {
public static final String PREF_TITLE = "widget-title-";
public static final String PREF_SQL = "widget-sql-";
public static final String PREF_VALUES = "widget-values-";
public static final String PREF_CUSTOM_INTENT = "widget-intent-";
public static final String PREF_CUSTOM_EXTRAS = "widget-extras-";
public static final String PREF_TAG_ID = "widget-tag-id-";
public static final String PREF_WIDGET_ID = "widget-id-";
public static final String PREF_SHOW_DUE_DATE = "widget-show-due-date-";
public static final String PREF_HIDE_CHECKBOXES = "widget-hide-checkboxes-";
public static final String PREF_DARK_THEME = "widget-dark-theme-";
@ -51,6 +44,7 @@ public class WidgetConfigActivity extends InjectingListActivity {
@Inject FilterCounter filterCounter;
@Inject ActivityPreferences preferences;
@Inject FilterProvider filterProvider;
@Inject DefaultFilterProvider defaultFilterProvider;
@Override
public void onCreate(Bundle icicle) {
@ -132,37 +126,14 @@ public class WidgetConfigActivity extends InjectingListActivity {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String sql = null;
String contentValuesString = null;
String title = null;
if(filterListItem != null && filterListItem instanceof Filter) {
sql = ((Filter)filterListItem).getSqlQuery();
ContentValues values = ((Filter)filterListItem).valuesForNewTasks;
if(values != null) {
contentValuesString = AndroidUtilities.contentValuesToSerializedString(values);
}
title = ((Filter)filterListItem).listingTitle;
}
preferences.setString(WidgetConfigActivity.PREF_TITLE + mAppWidgetId, title);
preferences.setString(WidgetConfigActivity.PREF_SQL + mAppWidgetId, sql);
preferences.setString(WidgetConfigActivity.PREF_VALUES + mAppWidgetId, contentValuesString);
preferences.setBoolean(WidgetConfigActivity.PREF_SHOW_DUE_DATE + mAppWidgetId, showDueDate);
preferences.setBoolean(WidgetConfigActivity.PREF_DARK_THEME + mAppWidgetId, darkTheme);
preferences.setBoolean(WidgetConfigActivity.PREF_HIDE_CHECKBOXES + mAppWidgetId, hideCheckboxes);
preferences.setBoolean(WidgetConfigActivity.PREF_HIDE_HEADER + mAppWidgetId, hideHeader);
preferences.setBoolean(WidgetConfigActivity.PREF_WIDGET_TRANSPARENT + mAppWidgetId, transparent);
if(filterListItem instanceof FilterWithCustomIntent) {
String flattenedName = ((FilterWithCustomIntent)filterListItem).customTaskList.flattenToString();
preferences.setString(WidgetConfigActivity.PREF_CUSTOM_INTENT + mAppWidgetId,
flattenedName);
String flattenedExtras = AndroidUtilities.bundleToSerializedString(((FilterWithCustomIntent)filterListItem).customExtras);
if (flattenedExtras != null) {
preferences.setString(WidgetConfigActivity.PREF_CUSTOM_EXTRAS + mAppWidgetId,
flattenedExtras);
}
if (filterListItem != null && filterListItem instanceof Filter) {
Filter filter = (Filter) filterListItem;
preferences.setString(WidgetConfigActivity.PREF_WIDGET_ID + mAppWidgetId, defaultFilterProvider.getFilterPreferenceValue(filter));
preferences.setBoolean(WidgetConfigActivity.PREF_SHOW_DUE_DATE + mAppWidgetId, showDueDate);
preferences.setBoolean(WidgetConfigActivity.PREF_DARK_THEME + mAppWidgetId, darkTheme);
preferences.setBoolean(WidgetConfigActivity.PREF_HIDE_CHECKBOXES + mAppWidgetId, hideCheckboxes);
preferences.setBoolean(WidgetConfigActivity.PREF_HIDE_HEADER + mAppWidgetId, hideHeader);
preferences.setBoolean(WidgetConfigActivity.PREF_WIDGET_TRANSPARENT + mAppWidgetId, transparent);
}
}

@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.support.v4.app.TaskStackBuilder;
import com.google.common.base.Strings;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.Filter;
@ -14,8 +15,14 @@ public class TaskIntents {
return TaskStackBuilder.create(context).addNextIntent(getEditTaskIntent(context, filter, taskId));
}
public static Intent getNewTaskIntent(Context context, Filter filter) {
return getEditTaskIntent(context, filter, 0L);
public static Intent getNewTaskIntent(Context context, String filterId) {
return getEditTaskIntent(context, filterId, 0L);
}
public static Intent getEditTaskIntent(Context context, String filterId, long taskId) {
Intent taskListIntent = getTaskListByIdIntent(context, filterId);
taskListIntent.putExtra(TaskListActivity.OPEN_TASK, taskId);
return taskListIntent;
}
public static Intent getEditTaskIntent(Context context, final Filter filter, final long taskId) {
@ -31,4 +38,12 @@ public class TaskIntents {
}
return intent;
}
public static Intent getTaskListByIdIntent(Context context, final String filterId) {
Intent intent = new Intent(context, TaskListActivity.class);
if (!Strings.isNullOrEmpty(filterId)) {
intent.putExtra(TaskListActivity.LOAD_FILTER, filterId);
}
return intent;
}
}

@ -1,5 +1,6 @@
package org.tasks.widget;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@ -23,6 +24,7 @@ import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences;
import org.tasks.ui.WidgetCheckBoxes;
@ -31,13 +33,14 @@ import timber.log.Timber;
public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private final WidgetCheckBoxes checkBoxes;
private final int widgetId;
private final Database database;
private final TaskService taskService;
private final DefaultFilterProvider defaultFilterProvider;
private final SubtasksHelper subtasksHelper;
private final Preferences preferences;
private final Context context;
private final Filter filter;
private final int widgetId;
private final String filterId;
private final boolean dark;
private final boolean showDueDates;
private final boolean hideCheckboxes;
@ -48,17 +51,19 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
SubtasksHelper subtasksHelper,
Preferences preferences,
Context context,
Filter filter,
String filterId,
int widgetId,
Database database,
TaskService taskService) {
TaskService taskService,
DefaultFilterProvider defaultFilterProvider) {
this.subtasksHelper = subtasksHelper;
this.preferences = preferences;
this.context = context;
this.filter = filter;
this.filterId = filterId;
this.widgetId = widgetId;
this.database = database;
this.taskService = taskService;
this.defaultFilterProvider = defaultFilterProvider;
checkBoxes = new WidgetCheckBoxes(context);
dark = preferences.useDarkWidgetTheme(widgetId);
@ -156,7 +161,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
long taskId = task.getId();
Intent editIntent = new Intent(TasksWidget.EDIT_TASK);
editIntent.putExtra(TasksWidget.EXTRA_FILTER, filter);
editIntent.putExtra(TasksWidget.EXTRA_FILTER_ID, filterId);
editIntent.putExtra(TasksWidget.EXTRA_ID, taskId);
row.setOnClickFillInIntent(R.id.widget_row, editIntent);
@ -195,15 +200,13 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
if(sort == 0) {
sort = SortHelper.SORT_WIDGET;
}
filter.setFilterQueryOverride(null);
String query = SortHelper.adjustQueryForFlagsAndSort(preferences,
filter.getSqlQuery(), sort).replaceAll("LIMIT \\d+", "");
String tagName = preferences.getStringValue(WidgetConfigActivity.PREF_TITLE + widgetId);
return subtasksHelper.applySubtasksToWidgetFilter(filter, query, tagName, 0);
Filter filter = defaultFilterProvider.getFilterFromPreference(filterId);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews rv = new RemoteViews(context.getPackageName(), dark ? R.layout.scrollable_widget_dark : R.layout.scrollable_widget_light);
rv.setTextViewText(R.id.widget_title, filter.listingTitle);
appWidgetManager.partiallyUpdateAppWidget(widgetId, rv);
String query = SortHelper.adjustQueryForFlagsAndSort(preferences, filter.getSqlQuery(), sort).replaceAll("LIMIT \\d+", "");
return subtasksHelper.applySubtasksToWidgetFilter(filter, query, filter.listingTitle, 0);
}
public void formatDueDate(RemoteViews row, Task task, int textColor) {

@ -4,25 +4,26 @@ import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import org.tasks.injection.InjectingRemoteViewsService;
import org.tasks.injection.ServiceComponent;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences;
import javax.inject.Inject;
public class ScrollableWidgetUpdateService extends InjectingRemoteViewsService {
public static final String FILTER = "org.tasks.widget.FILTER";
public static final String FILTER_ID = "org.tasks.widget.FILTER_ID";
@Inject Database database;
@Inject TaskService taskService;
@Inject Preferences preferences;
@Inject SubtasksHelper subtasksHelper;
@Inject DefaultFilterProvider defaultFilterProvider;
@Override
public void onStart(Intent intent, int startId) {
@ -42,11 +43,10 @@ public class ScrollableWidgetUpdateService extends InjectingRemoteViewsService {
return null;
}
Bundle bundle = extras.getBundle(FILTER);
Filter filter = (Filter) bundle.get(FILTER);
String filterId = (String) extras.get(FILTER_ID);
int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
return new ScrollableViewsFactory(subtasksHelper, preferences, this, filter,
widgetId, database, taskService);
return new ScrollableViewsFactory(subtasksHelper, preferences, this, filterId,
widgetId, database, taskService, defaultFilterProvider);
}
@Override

Loading…
Cancel
Save