mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-18 19:59:00 +00:00
Make habit button work
This commit is contained in:
parent
44b6de04be
commit
faf4b77d6d
4 changed files with 77 additions and 12 deletions
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue