diff --git a/Habitica/res/xml/habit_button_widget_info.xml b/Habitica/res/xml/habit_button_widget_info.xml index 2b4a832e2..84c74625f 100644 --- a/Habitica/res/xml/habit_button_widget_info.xml +++ b/Habitica/res/xml/habit_button_widget_info.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 69feea14e..14faffe08 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -56,6 +56,7 @@ import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; import com.habitrpg.android.habitica.widget.AvatarStatsWidgetService; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; +import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetService; import javax.inject.Singleton; @@ -174,4 +175,6 @@ public interface AppComponent { void inject(HabitButtonWidgetService habitButtonWidgetService); void inject(HabitButtonWidgetActivity habitButtonWidgetActivity); + + void inject(HabitButtonWidgetProvider habitButtonWidgetProvider); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java index f623fb059..8d90e7a43 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java @@ -8,10 +8,31 @@ import android.os.Build; import android.os.Bundle; import android.widget.RemoteViews; +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.Select; + +import javax.inject.Inject; public class HabitButtonWidgetProvider extends BaseWidgetProvider { - public static String TASK_ID = "TASK_ID"; + + public static final String HABIT_ACTION = "com.habitrpg.android.habitica.HABIT_ACTION"; + public static final String TASK_ID = "com.habitrpg.android.habitica.TASK_ID_ITEM"; + public static final String TASK_DIRECTION = "com.habitrpg.android.habitica.TASK_DIRECTION"; + @Inject + public APIHelper apiHelper; + + public APIHelper getApiHelper(Context context) { + if (apiHelper == null) { + HabiticaApplication application = HabiticaApplication.getInstance(context); + application.getComponent().inject(this); + } + return apiHelper; + } @Override public int layoutResourceId() { @@ -20,7 +41,6 @@ public class HabitButtonWidgetProvider extends BaseWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - // Get all ids ComponentName thisWidget = new ComponentName(context, HabitButtonWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); @@ -41,6 +61,33 @@ public class HabitButtonWidgetProvider extends BaseWidgetProvider { context.startService(intent); } + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(HABIT_ACTION)) { + AppWidgetManager mgr = AppWidgetManager.getInstance(context); + int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + String taskId = intent.getStringExtra(TASK_ID); + String direction = intent.getStringExtra(TASK_DIRECTION); + + int[] ids = {appWidgetId}; + + if (taskId != null) { + getApiHelper(context).apiService.postTaskDirection(taskId, direction) + .compose(getApiHelper(context).configureApiCallObserver()) + .subscribe(taskDirectionData -> { + Task task = new Select().from(Task.class).where(Condition.column("id").eq(taskId)).querySingle(); + task.value = task.value + taskDirectionData.getDelta(); + task.save(); + this.onUpdate(context, mgr, ids); + }, throwable -> { + this.onUpdate(context, mgr, ids); + }); + } + } + super.onReceive(context, intent); + } + @Override public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) { return remoteViews; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java index abed585ed..bdaea8c9b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java @@ -1,22 +1,22 @@ package com.habitrpg.android.habitica.widget; +import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffColorFilter; -import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.IBinder; -import android.preference.PreferenceManager; import android.view.View; import android.widget.RemoteViews; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; @@ -35,16 +35,20 @@ public class HabitButtonWidgetService extends Service { public SharedPreferences sharedPreferences; @Inject public Resources resources; + @Inject + public Context context; private AppWidgetManager appWidgetManager; private Map taskMapping; + private int[] allWidgetIds; @Override public int onStartCommand(final Intent intent, int flags, int startId) { HabiticaApplication application = (HabiticaApplication) getApplication(); application.getComponent().inject(this); this.appWidgetManager = AppWidgetManager.getInstance(this); - + ComponentName thisWidget = new ComponentName(this, HabitButtonWidgetProvider.class); + allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); makeTaskMapping(); for (String taskid : this.taskMapping.keySet()) { @@ -79,19 +83,22 @@ public class HabitButtonWidgetService extends Service { if (!task.getUp()) { remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.GONE); + remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, null); } else { remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.VISIBLE); - remoteViews.setInt(R.id.btnPlus, "setBackgroundColor", resources.getColor(task.getLightTaskColor())); + remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, getPendingIntent(task.getId(), TaskDirection.up.toString(), taskMapping.get(task.getId()))); } if (!task.getDown()) { remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.GONE); + remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, null); } else { remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.VISIBLE); remoteViews.setInt(R.id.btnMinus, "setBackgroundColor", resources.getColor(task.getMediumTaskColor())); + remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, getPendingIntent(task.getId(), TaskDirection.down.toString() , taskMapping.get(task.getId()))); } - appWidgetManager.partiallyUpdateAppWidget(taskMapping.get(task.getId()), remoteViews); + appWidgetManager.updateAppWidget(taskMapping.get(task.getId()), remoteViews); } @Override @@ -100,8 +107,6 @@ public class HabitButtonWidgetService extends Service { } private void makeTaskMapping() { - ComponentName thisWidget = new ComponentName(this, HabitButtonWidgetProvider.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); this.taskMapping = new HashMap<>(); for (int widgetId : allWidgetIds) { String taskId = getTaskId(widgetId); @@ -114,4 +119,14 @@ public class HabitButtonWidgetService extends Service { private String getTaskId(int widgetId) { return sharedPreferences.getString("habit_button_widget_"+widgetId, ""); } + + private PendingIntent getPendingIntent(String taskId, String direction, int widgetId) { + Intent taskIntent = new Intent(context, HabitButtonWidgetProvider.class); + taskIntent.setAction(HabitButtonWidgetProvider.HABIT_ACTION); + taskIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); + taskIntent.putExtra(HabitButtonWidgetProvider.TASK_ID, taskId); + taskIntent.putExtra(HabitButtonWidgetProvider.TASK_DIRECTION, direction); + return PendingIntent.getBroadcast(context, widgetId+direction.hashCode(), taskIntent, + PendingIntent.FLAG_UPDATE_CURRENT); + } }