Make habit button work

This commit is contained in:
Phillip Thelen 2016-09-23 17:02:13 +02:00
parent 44b6de04be
commit faf4b77d6d
4 changed files with 77 additions and 12 deletions

View file

@ -2,7 +2,7 @@
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_habit_button"
android:minHeight="40dp"
android:minWidth="180dp"
android:minWidth="120dp"
android:updatePeriodMillis="1800000"
android:resizeMode="horizontal|vertical"
android:configure="com.habitrpg.android.habitica.ui.activities.HabitButtonWidgetActivity">

View file

@ -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);
}

View file

@ -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;

View file

@ -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<String, Integer> 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);
}
}