mirror of https://github.com/tasks/tasks
Use coroutines in widget
parent
d550063114
commit
275369c807
@ -1,173 +0,0 @@
|
|||||||
package org.tasks.widget;
|
|
||||||
|
|
||||||
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 android.app.PendingIntent;
|
|
||||||
import android.appwidget.AppWidgetManager;
|
|
||||||
import android.appwidget.AppWidgetProvider;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.RemoteViews;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.core.graphics.ColorUtils;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.dao.TaskDaoBlocking;
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint;
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.activities.FilterSelectionActivity;
|
|
||||||
import org.tasks.intents.TaskIntents;
|
|
||||||
import org.tasks.locale.Locale;
|
|
||||||
import org.tasks.preferences.DefaultFilterProvider;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.themes.ThemeColor;
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
|
||||||
public class TasksWidget extends AppWidgetProvider {
|
|
||||||
|
|
||||||
private static final int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
|
|
||||||
@Inject Preferences preferences;
|
|
||||||
@Inject DefaultFilterProvider defaultFilterProvider;
|
|
||||||
@Inject Locale locale;
|
|
||||||
@Inject TaskDaoBlocking taskDao;
|
|
||||||
@Inject @ApplicationContext Context context;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
|
||||||
for (int id : appWidgetIds) {
|
|
||||||
try {
|
|
||||||
appWidgetManager.updateAppWidget(id, createScrollableWidget(context, id));
|
|
||||||
} catch (Exception e) {
|
|
||||||
Timber.e(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private RemoteViews createScrollableWidget(Context context, int id) {
|
|
||||||
WidgetPreferences widgetPreferences = new WidgetPreferences(context, preferences, id);
|
|
||||||
String filterId = widgetPreferences.getFilterId();
|
|
||||||
ThemeColor color = new ThemeColor(context, widgetPreferences.getColor());
|
|
||||||
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
|
|
||||||
remoteViews.setInt(R.id.widget, "setLayoutDirection", locale.getDirectionality());
|
|
||||||
if (widgetPreferences.showHeader()) {
|
|
||||||
remoteViews.setViewVisibility(R.id.widget_header, View.VISIBLE);
|
|
||||||
remoteViews.setViewVisibility(
|
|
||||||
R.id.widget_change_list, widgetPreferences.showMenu() ? View.VISIBLE : View.GONE);
|
|
||||||
int widgetTitlePadding =
|
|
||||||
widgetPreferences.showMenu()
|
|
||||||
? 0
|
|
||||||
: (int) context.getResources().getDimension(R.dimen.widget_padding);
|
|
||||||
remoteViews.setViewPadding(R.id.widget_title, widgetTitlePadding, 0, 0, 0);
|
|
||||||
remoteViews.setViewVisibility(
|
|
||||||
R.id.widget_reconfigure, widgetPreferences.showSettings() ? View.VISIBLE : View.GONE);
|
|
||||||
remoteViews.setInt(R.id.widget_title, "setTextColor", color.getColorOnPrimary());
|
|
||||||
remoteViews.setInt(R.id.widget_button, "setColorFilter", color.getColorOnPrimary());
|
|
||||||
remoteViews.setInt(R.id.widget_reconfigure, "setColorFilter", color.getColorOnPrimary());
|
|
||||||
remoteViews.setInt(R.id.widget_change_list, "setColorFilter", color.getColorOnPrimary());
|
|
||||||
} else {
|
|
||||||
remoteViews.setViewVisibility(R.id.widget_header, View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
remoteViews.setInt(
|
|
||||||
R.id.widget_header,
|
|
||||||
"setBackgroundColor",
|
|
||||||
ColorUtils.setAlphaComponent(color.getPrimaryColor(), widgetPreferences.getHeaderOpacity()));
|
|
||||||
int bgColor = getBackgroundColor(widgetPreferences.getThemeIndex());
|
|
||||||
remoteViews.setInt(
|
|
||||||
R.id.list_view,
|
|
||||||
"setBackgroundColor",
|
|
||||||
ColorUtils.setAlphaComponent(bgColor, widgetPreferences.getRowOpacity()));
|
|
||||||
remoteViews.setInt(
|
|
||||||
R.id.empty_view,
|
|
||||||
"setBackgroundColor",
|
|
||||||
ColorUtils.setAlphaComponent(bgColor, widgetPreferences.getFooterOpacity()));
|
|
||||||
|
|
||||||
Filter filter = defaultFilterProvider.getFilterFromPreferenceBlocking(filterId);
|
|
||||||
remoteViews.setTextViewText(R.id.widget_title, filter.listingTitle);
|
|
||||||
|
|
||||||
Uri cacheBuster = Uri.parse("tasks://widget/" + System.currentTimeMillis());
|
|
||||||
remoteViews.setRemoteAdapter(
|
|
||||||
R.id.list_view,
|
|
||||||
new Intent(context, ScrollableWidgetUpdateService.class)
|
|
||||||
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id)
|
|
||||||
.setData(cacheBuster));
|
|
||||||
|
|
||||||
setRipple(
|
|
||||||
remoteViews, color, R.id.widget_button, R.id.widget_change_list, R.id.widget_reconfigure);
|
|
||||||
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_change_list, getChooseListIntent(context, filter, id));
|
|
||||||
remoteViews.setOnClickPendingIntent(
|
|
||||||
R.id.widget_reconfigure, getWidgetConfigIntent(context, id));
|
|
||||||
if (widgetPreferences.openOnFooterClick()) {
|
|
||||||
remoteViews.setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id));
|
|
||||||
} else {
|
|
||||||
remoteViews.setOnClickPendingIntent(R.id.empty_view, null);
|
|
||||||
}
|
|
||||||
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context));
|
|
||||||
return remoteViews;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRipple(RemoteViews rv, ThemeColor color, int... views) {
|
|
||||||
int drawableRes =
|
|
||||||
color.isDark()
|
|
||||||
? R.drawable.widget_ripple_circle_light
|
|
||||||
: R.drawable.widget_ripple_circle_dark;
|
|
||||||
for (int view : views) {
|
|
||||||
rv.setInt(view, "setBackgroundResource", drawableRes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private @ColorInt int getBackgroundColor(int themeIndex) {
|
|
||||||
int background;
|
|
||||||
if (themeIndex == 1) {
|
|
||||||
background = android.R.color.black;
|
|
||||||
} else if (themeIndex == 2) {
|
|
||||||
background = R.color.md_background_dark;
|
|
||||||
} else {
|
|
||||||
background = android.R.color.white;
|
|
||||||
}
|
|
||||||
return context.getColor(background);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PendingIntent getPendingIntentTemplate(Context context) {
|
|
||||||
return PendingIntent.getActivity(
|
|
||||||
context, 0, new Intent(context, WidgetClickActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PendingIntent getOpenListIntent(Context context, Filter filter, int widgetId) {
|
|
||||||
Intent intent = TaskIntents.getTaskListIntent(context, filter);
|
|
||||||
intent.setFlags(flags);
|
|
||||||
intent.setAction("open_list");
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PendingIntent getChooseListIntent(Context context, Filter filter, int widgetId) {
|
|
||||||
Intent intent = new Intent(context, FilterSelectionActivity.class);
|
|
||||||
intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
|
|
||||||
intent.putExtra(FilterSelectionActivity.EXTRA_FILTER, filter);
|
|
||||||
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
|
||||||
intent.setAction("choose_list");
|
|
||||||
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,157 @@
|
|||||||
|
package org.tasks.widget
|
||||||
|
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.appwidget.AppWidgetManager
|
||||||
|
import android.appwidget.AppWidgetProvider
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.RemoteViews
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
|
import androidx.core.graphics.ColorUtils
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.activities.FilterSelectionActivity
|
||||||
|
import org.tasks.intents.TaskIntents
|
||||||
|
import org.tasks.locale.Locale
|
||||||
|
import org.tasks.preferences.DefaultFilterProvider
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import org.tasks.themes.ThemeColor
|
||||||
|
import timber.log.Timber
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class TasksWidget : AppWidgetProvider() {
|
||||||
|
@Inject lateinit var preferences: Preferences
|
||||||
|
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
|
||||||
|
@Inject lateinit var locale: Locale
|
||||||
|
@Inject @ApplicationContext lateinit var context: Context
|
||||||
|
|
||||||
|
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
|
||||||
|
for (id in appWidgetIds) {
|
||||||
|
try {
|
||||||
|
appWidgetManager.updateAppWidget(id, createScrollableWidget(context, id))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Timber.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createScrollableWidget(context: Context, id: Int): RemoteViews {
|
||||||
|
val widgetPreferences = WidgetPreferences(context, preferences, id)
|
||||||
|
val filterId = widgetPreferences.filterId
|
||||||
|
val color = ThemeColor(context, widgetPreferences.color)
|
||||||
|
val remoteViews = RemoteViews(context.packageName, R.layout.scrollable_widget)
|
||||||
|
remoteViews.setInt(R.id.widget, "setLayoutDirection", locale.directionality)
|
||||||
|
if (widgetPreferences.showHeader()) {
|
||||||
|
remoteViews.setViewVisibility(R.id.widget_header, View.VISIBLE)
|
||||||
|
remoteViews.setViewVisibility(
|
||||||
|
R.id.widget_change_list, if (widgetPreferences.showMenu()) View.VISIBLE else View.GONE)
|
||||||
|
val widgetTitlePadding = if (widgetPreferences.showMenu()) 0 else context.resources.getDimension(R.dimen.widget_padding).toInt()
|
||||||
|
remoteViews.setViewPadding(R.id.widget_title, widgetTitlePadding, 0, 0, 0)
|
||||||
|
remoteViews.setViewVisibility(
|
||||||
|
R.id.widget_reconfigure, if (widgetPreferences.showSettings()) View.VISIBLE else View.GONE)
|
||||||
|
remoteViews.setInt(R.id.widget_title, "setTextColor", color.colorOnPrimary)
|
||||||
|
remoteViews.setInt(R.id.widget_button, "setColorFilter", color.colorOnPrimary)
|
||||||
|
remoteViews.setInt(R.id.widget_reconfigure, "setColorFilter", color.colorOnPrimary)
|
||||||
|
remoteViews.setInt(R.id.widget_change_list, "setColorFilter", color.colorOnPrimary)
|
||||||
|
} else {
|
||||||
|
remoteViews.setViewVisibility(R.id.widget_header, View.GONE)
|
||||||
|
}
|
||||||
|
remoteViews.setInt(
|
||||||
|
R.id.widget_header,
|
||||||
|
"setBackgroundColor",
|
||||||
|
ColorUtils.setAlphaComponent(color.primaryColor, widgetPreferences.headerOpacity))
|
||||||
|
val bgColor = getBackgroundColor(widgetPreferences.themeIndex)
|
||||||
|
remoteViews.setInt(
|
||||||
|
R.id.list_view,
|
||||||
|
"setBackgroundColor",
|
||||||
|
ColorUtils.setAlphaComponent(bgColor, widgetPreferences.rowOpacity))
|
||||||
|
remoteViews.setInt(
|
||||||
|
R.id.empty_view,
|
||||||
|
"setBackgroundColor",
|
||||||
|
ColorUtils.setAlphaComponent(bgColor, widgetPreferences.footerOpacity))
|
||||||
|
val filter = runBlocking { defaultFilterProvider.getFilterFromPreference(filterId) }
|
||||||
|
remoteViews.setTextViewText(R.id.widget_title, filter.listingTitle)
|
||||||
|
val cacheBuster = Uri.parse("tasks://widget/" + System.currentTimeMillis())
|
||||||
|
remoteViews.setRemoteAdapter(
|
||||||
|
R.id.list_view,
|
||||||
|
Intent(context, ScrollableWidgetUpdateService::class.java)
|
||||||
|
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id)
|
||||||
|
.setData(cacheBuster))
|
||||||
|
setRipple(
|
||||||
|
remoteViews, color, R.id.widget_button, R.id.widget_change_list, R.id.widget_reconfigure)
|
||||||
|
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_change_list, getChooseListIntent(context, filter, id))
|
||||||
|
remoteViews.setOnClickPendingIntent(
|
||||||
|
R.id.widget_reconfigure, getWidgetConfigIntent(context, id))
|
||||||
|
if (widgetPreferences.openOnFooterClick()) {
|
||||||
|
remoteViews.setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id))
|
||||||
|
} else {
|
||||||
|
remoteViews.setOnClickPendingIntent(R.id.empty_view, null)
|
||||||
|
}
|
||||||
|
remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context))
|
||||||
|
return remoteViews
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setRipple(rv: RemoteViews, color: ThemeColor, vararg views: Int) {
|
||||||
|
val drawableRes = if (color.isDark) R.drawable.widget_ripple_circle_light else R.drawable.widget_ripple_circle_dark
|
||||||
|
for (view in views) {
|
||||||
|
rv.setInt(view, "setBackgroundResource", drawableRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ColorInt
|
||||||
|
private fun getBackgroundColor(themeIndex: Int): Int {
|
||||||
|
val background: Int = when (themeIndex) {
|
||||||
|
1 -> android.R.color.black
|
||||||
|
2 -> R.color.md_background_dark
|
||||||
|
else -> android.R.color.white
|
||||||
|
}
|
||||||
|
return context.getColor(background)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getPendingIntentTemplate(context: Context): PendingIntent {
|
||||||
|
return PendingIntent.getActivity(
|
||||||
|
context, 0, Intent(context, WidgetClickActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getOpenListIntent(context: Context, filter: Filter, widgetId: Int): PendingIntent {
|
||||||
|
val intent = TaskIntents.getTaskListIntent(context, filter)
|
||||||
|
intent.flags = flags
|
||||||
|
intent.action = "open_list"
|
||||||
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getNewTaskIntent(context: Context, filter: Filter, widgetId: Int): PendingIntent {
|
||||||
|
val intent = TaskIntents.getNewTaskIntent(context, filter)
|
||||||
|
intent.action = "new_task"
|
||||||
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getWidgetConfigIntent(context: Context, widgetId: Int): PendingIntent {
|
||||||
|
val intent = Intent(context, WidgetConfigActivity::class.java)
|
||||||
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
|
||||||
|
intent.action = "widget_settings"
|
||||||
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getChooseListIntent(context: Context, filter: Filter, widgetId: Int): PendingIntent {
|
||||||
|
val intent = Intent(context, FilterSelectionActivity::class.java)
|
||||||
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
|
intent.putExtra(FilterSelectionActivity.EXTRA_FILTER, filter)
|
||||||
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
|
||||||
|
intent.action = "choose_list"
|
||||||
|
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue