|
|
@ -8,27 +8,20 @@ package com.todoroo.astrid.widget;
|
|
|
|
import android.app.PendingIntent;
|
|
|
|
import android.app.PendingIntent;
|
|
|
|
import android.appwidget.AppWidgetManager;
|
|
|
|
import android.appwidget.AppWidgetManager;
|
|
|
|
import android.content.ComponentName;
|
|
|
|
import android.content.ComponentName;
|
|
|
|
import android.content.ContentValues;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.net.Uri;
|
|
|
|
import android.net.Uri;
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.View;
|
|
|
|
import android.widget.RemoteViews;
|
|
|
|
import android.widget.RemoteViews;
|
|
|
|
|
|
|
|
|
|
|
|
import com.todoroo.andlib.utility.AndroidUtilities;
|
|
|
|
|
|
|
|
import com.todoroo.astrid.api.Filter;
|
|
|
|
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.Broadcaster;
|
|
|
|
import org.tasks.R;
|
|
|
|
import org.tasks.R;
|
|
|
|
import org.tasks.injection.BroadcastComponent;
|
|
|
|
import org.tasks.injection.BroadcastComponent;
|
|
|
|
import org.tasks.injection.InjectingAppWidgetProvider;
|
|
|
|
import org.tasks.injection.InjectingAppWidgetProvider;
|
|
|
|
import org.tasks.intents.TaskIntents;
|
|
|
|
import org.tasks.intents.TaskIntents;
|
|
|
|
|
|
|
|
import org.tasks.preferences.DefaultFilterProvider;
|
|
|
|
import org.tasks.preferences.Preferences;
|
|
|
|
import org.tasks.preferences.Preferences;
|
|
|
|
import org.tasks.widget.ScrollableWidgetUpdateService;
|
|
|
|
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_CLEAR_TOP;
|
|
|
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
|
|
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
|
|
|
import static com.todoroo.astrid.api.AstridApiConstants.BROADCAST_EVENT_REFRESH;
|
|
|
|
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 {
|
|
|
|
public class TasksWidget extends InjectingAppWidgetProvider {
|
|
|
|
|
|
|
|
|
|
|
|
private static int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
|
|
|
|
private static int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
|
|
|
|
|
|
|
|
|
|
|
|
@Inject Broadcaster broadcaster;
|
|
|
|
@Inject Broadcaster broadcaster;
|
|
|
|
@Inject TagDataDao tagDataDao;
|
|
|
|
|
|
|
|
@Inject Preferences preferences;
|
|
|
|
@Inject Preferences preferences;
|
|
|
|
|
|
|
|
@Inject DefaultFilterProvider defaultFilterProvider;
|
|
|
|
|
|
|
|
|
|
|
|
public static final String COMPLETE_TASK = "COMPLETE_TASK";
|
|
|
|
public static final String COMPLETE_TASK = "COMPLETE_TASK";
|
|
|
|
public static final String EDIT_TASK = "EDIT_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$
|
|
|
|
public static final String EXTRA_ID = "extra_id"; //$NON-NLS-1$
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
@ -65,8 +58,10 @@ public class TasksWidget extends InjectingAppWidgetProvider {
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case EDIT_TASK:
|
|
|
|
case EDIT_TASK:
|
|
|
|
long taskId = intent.getLongExtra(EXTRA_ID, 0);
|
|
|
|
long taskId = intent.getLongExtra(EXTRA_ID, 0);
|
|
|
|
Filter filter = intent.getParcelableExtra(EXTRA_FILTER);
|
|
|
|
String filterId = intent.getStringExtra(EXTRA_FILTER_ID);
|
|
|
|
getEditTaskStack(context, filter, taskId).startActivities();
|
|
|
|
Intent editTaskIntent = getEditTaskIntent(context, filterId, taskId);
|
|
|
|
|
|
|
|
editTaskIntent.setFlags(flags);
|
|
|
|
|
|
|
|
context.startActivity(editTaskIntent);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case BROADCAST_EVENT_REFRESH:
|
|
|
|
case BROADCAST_EVENT_REFRESH:
|
|
|
|
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
|
|
|
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
|
|
@ -97,11 +92,9 @@ public class TasksWidget extends InjectingAppWidgetProvider {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private RemoteViews createScrollableWidget(Context context, int id) {
|
|
|
|
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);
|
|
|
|
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class);
|
|
|
|
Bundle filterBundle = new Bundle(com.todoroo.astrid.api.Filter.class.getClassLoader());
|
|
|
|
rvIntent.putExtra(ScrollableWidgetUpdateService.FILTER_ID, filterId);
|
|
|
|
filterBundle.putParcelable(ScrollableWidgetUpdateService.FILTER, filter);
|
|
|
|
|
|
|
|
rvIntent.putExtra(ScrollableWidgetUpdateService.FILTER, filterBundle);
|
|
|
|
|
|
|
|
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
|
|
|
|
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
|
|
|
|
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
|
|
|
|
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
|
|
|
|
boolean darkTheme = preferences.useDarkWidgetTheme(id);
|
|
|
|
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.list_view, "setBackgroundColor", android.R.color.transparent);
|
|
|
|
remoteViews.setInt(R.id.empty_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.setTextViewText(R.id.widget_title, filter.listingTitle);
|
|
|
|
remoteViews.setRemoteAdapter(R.id.list_view, rvIntent);
|
|
|
|
remoteViews.setRemoteAdapter(R.id.list_view, rvIntent);
|
|
|
|
remoteViews.setEmptyView(R.id.list_view, R.id.empty_view);
|
|
|
|
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_title, getOpenListIntent(context, filterId, id));
|
|
|
|
remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filter, id));
|
|
|
|
remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filterId, id));
|
|
|
|
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context));
|
|
|
|
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context));
|
|
|
|
return remoteViews;
|
|
|
|
return remoteViews;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -128,74 +122,15 @@ public class TasksWidget extends InjectingAppWidgetProvider {
|
|
|
|
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private PendingIntent getOpenListIntent(Context context, Filter filter, int widgetId) {
|
|
|
|
private PendingIntent getOpenListIntent(Context context, String filterId, int widgetId) {
|
|
|
|
Intent intent = TaskIntents.getTaskListIntent(context, filter);
|
|
|
|
Intent intent = TaskIntents.getTaskListByIdIntent(context, filterId);
|
|
|
|
intent.setFlags(flags);
|
|
|
|
intent.setFlags(flags);
|
|
|
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private PendingIntent getNewTaskIntent(Context context, Filter filter, int widgetId) {
|
|
|
|
private PendingIntent getNewTaskIntent(Context context, String filterId, int widgetId) {
|
|
|
|
Intent intent = TaskIntents.getNewTaskIntent(context, filter);
|
|
|
|
Intent intent = TaskIntents.getNewTaskIntent(context, filterId);
|
|
|
|
intent.setFlags(flags);
|
|
|
|
intent.setFlags(flags);
|
|
|
|
return PendingIntent.getActivity(context, -widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|