mirror of https://github.com/tasks/tasks
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
8.0 KiB
Java
179 lines
8.0 KiB
Java
package org.tasks.widget;
|
|
|
|
import android.app.PendingIntent;
|
|
import android.appwidget.AppWidgetManager;
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.Canvas;
|
|
import android.net.Uri;
|
|
import android.view.View;
|
|
import android.widget.RemoteViews;
|
|
|
|
import com.google.common.base.Strings;
|
|
import com.todoroo.astrid.api.Filter;
|
|
|
|
import org.tasks.R;
|
|
import org.tasks.injection.BroadcastComponent;
|
|
import org.tasks.injection.ForApplication;
|
|
import org.tasks.injection.InjectingAppWidgetProvider;
|
|
import org.tasks.intents.TaskIntents;
|
|
import org.tasks.locale.Locale;
|
|
import org.tasks.preferences.DefaultFilterProvider;
|
|
import org.tasks.preferences.Preferences;
|
|
import org.tasks.receivers.CompleteTaskReceiver;
|
|
import org.tasks.themes.ThemeCache;
|
|
import org.tasks.themes.ThemeColor;
|
|
import org.tasks.themes.WidgetTheme;
|
|
|
|
import javax.inject.Inject;
|
|
|
|
import timber.log.Timber;
|
|
|
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
|
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
|
|
import static org.tasks.intents.TaskIntents.getEditTaskIntent;
|
|
|
|
public class TasksWidget extends InjectingAppWidgetProvider {
|
|
|
|
private static final int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
|
|
|
|
@Inject Preferences preferences;
|
|
@Inject DefaultFilterProvider defaultFilterProvider;
|
|
@Inject ThemeCache themeCache;
|
|
@Inject Locale locale;
|
|
@Inject @ForApplication Context context;
|
|
|
|
public static final String COMPLETE_TASK = "COMPLETE_TASK";
|
|
public static final String EDIT_TASK = "EDIT_TASK";
|
|
|
|
public static final String EXTRA_FILTER_ID = "extra_filter_id";
|
|
public static final String EXTRA_ID = "extra_id"; //$NON-NLS-1$
|
|
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
super.onReceive(context, intent);
|
|
|
|
String action = intent.getAction();
|
|
|
|
if (Strings.isNullOrEmpty(action)) {
|
|
return;
|
|
}
|
|
|
|
switch(action) {
|
|
case COMPLETE_TASK:
|
|
Intent completionIntent = new Intent(context, CompleteTaskReceiver.class);
|
|
completionIntent.putExtra(CompleteTaskReceiver.TASK_ID, intent.getLongExtra(EXTRA_ID, 0));
|
|
completionIntent.putExtra(CompleteTaskReceiver.TOGGLE_STATE, true);
|
|
context.sendBroadcast(completionIntent);
|
|
break;
|
|
case EDIT_TASK:
|
|
long taskId = intent.getLongExtra(EXTRA_ID, 0);
|
|
String filterId = intent.getStringExtra(EXTRA_FILTER_ID);
|
|
Intent editTaskIntent = getEditTaskIntent(context, filterId, taskId);
|
|
editTaskIntent.setFlags(flags);
|
|
context.startActivity(editTaskIntent);
|
|
break;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void inject(BroadcastComponent component) {
|
|
component.inject(this);
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
|
try {
|
|
super.onUpdate(context, appWidgetManager, appWidgetIds);
|
|
|
|
ComponentName thisWidget = new ComponentName(context, TasksWidget.class);
|
|
int[] ids = appWidgetManager.getAppWidgetIds(thisWidget);
|
|
for (int id : ids) {
|
|
appWidgetManager.updateAppWidget(id, createScrollableWidget(context, id));
|
|
}
|
|
} catch (Exception e) {
|
|
Timber.e(e, e.getMessage());
|
|
}
|
|
}
|
|
|
|
private RemoteViews createScrollableWidget(Context context, int id) {
|
|
WidgetPreferences widgetPreferences = new WidgetPreferences(context, preferences, id);
|
|
String filterId = widgetPreferences.getFilterId();
|
|
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class);
|
|
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
|
|
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
|
|
WidgetTheme theme = themeCache.getWidgetTheme(widgetPreferences.getThemeIndex());
|
|
ThemeColor color = themeCache.getThemeColor(widgetPreferences.getColorIndex());
|
|
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
|
|
if (atLeastJellybeanMR1()) {
|
|
remoteViews.setInt(R.id.widget, "setLayoutDirection", locale.getDirectionality());
|
|
}
|
|
if (widgetPreferences.showHeader()) {
|
|
remoteViews.setViewVisibility(R.id.widget_header, View.VISIBLE);
|
|
remoteViews.setViewVisibility(R.id.widget_reconfigure, widgetPreferences.showSettings()
|
|
? View.VISIBLE
|
|
: View.GONE);
|
|
remoteViews.setInt(R.id.widget_title, "setTextColor", color.getActionBarTint());
|
|
remoteViews.setInt(R.id.widget_button, "setColorFilter", color.getActionBarTint());
|
|
remoteViews.setInt(R.id.widget_reconfigure, "setColorFilter", color.getActionBarTint());
|
|
} else {
|
|
remoteViews.setViewVisibility(R.id.widget_header, View.GONE);
|
|
}
|
|
int opacityPercentage = widgetPreferences.getOpacity();
|
|
int opacity = (int)((opacityPercentage / 100.0) * 255.0);
|
|
remoteViews.setImageViewBitmap(R.id.widget_background,
|
|
getSolidBackground(theme.getBackgroundColor()));
|
|
remoteViews.setImageViewBitmap(R.id.widget_header_background,
|
|
getSolidBackground(color.getPrimaryColor()));
|
|
remoteViews.setInt(R.id.widget_background, "setAlpha", opacity);
|
|
remoteViews.setInt(R.id.widget_header_background, "setAlpha", opacity);
|
|
|
|
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, filterId, id));
|
|
remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filterId, id));
|
|
remoteViews.setOnClickPendingIntent(R.id.widget_reconfigure, getWidgetConfigIntent(context, id));
|
|
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context));
|
|
return remoteViews;
|
|
}
|
|
|
|
private static Bitmap getSolidBackground(int bgColor) {
|
|
Bitmap bitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888); // Create a Bitmap
|
|
new Canvas(bitmap).drawColor(bgColor); //Set the color
|
|
return bitmap;
|
|
}
|
|
|
|
private PendingIntent getPendingIntentTemplate(Context context) {
|
|
Intent intent = new Intent(context, TasksWidget.class);
|
|
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
|
|
private PendingIntent getOpenListIntent(Context context, String filterId, int widgetId) {
|
|
Intent intent = TaskIntents.getTaskListByIdIntent(context, filterId);
|
|
intent.setFlags(flags);
|
|
intent.setAction("open_list");
|
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
|
|
private PendingIntent getNewTaskIntent(Context context, String filterId, int widgetId) {
|
|
Intent intent = TaskIntents.getNewTaskIntent(context, filterId);
|
|
intent.setFlags(flags);
|
|
intent.setAction("new_task");
|
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
|
|
private PendingIntent getWidgetConfigIntent(Context context, final int widgetId) {
|
|
Intent intent = new Intent(context, WidgetConfigActivity.class);
|
|
intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
|
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
|
intent.setAction("widget_settings");
|
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
}
|