From 776b6d58fd8e5ed842ea1d08dc22a869b458ebff Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 13 Sep 2016 21:03:12 +0200 Subject: [PATCH] start working on dailies widget --- Habitica/AndroidManifest.xml | 11 +++ Habitica/res/layout/widget_dailies.xml | 20 +++++ .../res/layout/widget_dailies_list_row.xml | 9 ++ Habitica/res/xml/dailies_task_widget_info.xml | 9 ++ .../widget/AvatarStatsWidgetService.java | 22 ++--- .../habitica/widget/DailiesListProvider.java | 87 +++++++++++++++++++ .../widget/DailiesWidgetProvider.java | 52 +++++++++++ .../habitica/widget/DailiesWidgetService.java | 12 +++ 8 files changed, 209 insertions(+), 13 deletions(-) create mode 100644 Habitica/res/layout/widget_dailies.xml create mode 100644 Habitica/res/layout/widget_dailies_list_row.xml create mode 100644 Habitica/res/xml/dailies_task_widget_info.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index e6dccab7d..c195eccc7 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -192,7 +192,18 @@ + + + + + + + diff --git a/Habitica/res/layout/widget_dailies.xml b/Habitica/res/layout/widget_dailies.xml new file mode 100644 index 000000000..f654d178b --- /dev/null +++ b/Habitica/res/layout/widget_dailies.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/widget_dailies_list_row.xml b/Habitica/res/layout/widget_dailies_list_row.xml new file mode 100644 index 000000000..1c33a6f28 --- /dev/null +++ b/Habitica/res/layout/widget_dailies_list_row.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/Habitica/res/xml/dailies_task_widget_info.xml b/Habitica/res/xml/dailies_task_widget_info.xml new file mode 100644 index 000000000..9b61d56c2 --- /dev/null +++ b/Habitica/res/xml/dailies_task_widget_info.xml @@ -0,0 +1,9 @@ + + + + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java index 60beaa967..1af3b4c08 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java @@ -1,10 +1,17 @@ package com.habitrpg.android.habitica.widget; -import com.habitrpg.android.habitica.APIHelper; +import android.app.PendingIntent; +import android.app.Service; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Intent; +import android.os.IBinder; +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.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -14,17 +21,6 @@ import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; -import android.app.PendingIntent; -import android.app.Service; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Intent; -import android.graphics.Bitmap; -import android.os.IBinder; -import android.util.Log; -import android.view.View; -import android.widget.RemoteViews; - import javax.inject.Inject; public class AvatarStatsWidgetService extends Service { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java new file mode 100644 index 000000000..6dd73ccf8 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java @@ -0,0 +1,87 @@ +package com.habitrpg.android.habitica.widget; + +import android.content.Context; +import android.content.Intent; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import com.habitrpg.android.habitica.R; +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 java.util.ArrayList; +import java.util.List; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class DailiesListProvider implements RemoteViewsService.RemoteViewsFactory { + private List taskList = new ArrayList<>(); + private Context context = null; + + public DailiesListProvider(Context context, Intent intent) { + this.context = context; + + Observable.defer(() -> Observable.from(new Select() + .from(Task.class) + .where(Condition.column("type").eq(Task.TYPE_DAILY)) + .and(Condition.column("completed").eq(false)) + .queryList())) + .filter(task -> task.isDisplayedActive(0)) + .toList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(tasks -> { + taskList = tasks; + DailiesListProvider.this.notify(); + }, throwable -> {}); + } + + @Override + public void onCreate() { + } + + @Override + public void onDataSetChanged() { + } + + @Override + public void onDestroy() { + } + + @Override + public int getCount() { + return taskList.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public RemoteViews getViewAt(int position) { + final RemoteViews remoteView = new RemoteViews( + context.getPackageName(), R.layout.widget_dailies_list_row); + Task task = taskList.get(position); + remoteView.setTextViewText(R.id.dailies_text, task.text); + return remoteView; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getViewTypeCount() { + return 0; + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java new file mode 100644 index 000000000..0a1df0797 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -0,0 +1,52 @@ +package com.habitrpg.android.habitica.widget; + +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.widget.RemoteViews; + +import com.habitrpg.android.habitica.R; + +public class DailiesWidgetProvider extends BaseWidgetProvider { + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // Get all ids + ComponentName thisWidget = new ComponentName(context, + DailiesWidgetProvider.class); + int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + + if (Build.VERSION.SDK_INT >= 16) { + for (int widgetId : allWidgetIds) { + Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); + appWidgetManager.partiallyUpdateAppWidget(widgetId, + sizeRemoteViews(context, options, widgetId)); + } + } + + for (int i = 0; i < appWidgetIds.length; ++i) { + Intent intent = new Intent(context, DailiesWidgetService.class); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); + intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_dailies); + rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); + rv.setEmptyView(R.id.list, R.id.empty_view); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + + @Override + public int layoutResourceId() { + return R.layout.widget_dailies; + } + + @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/DailiesWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java new file mode 100644 index 000000000..03f081f5f --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java @@ -0,0 +1,12 @@ +package com.habitrpg.android.habitica.widget; + +import android.content.Intent; +import android.widget.RemoteViewsService; + +public class DailiesWidgetService extends RemoteViewsService { + + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new DailiesListProvider(this.getApplicationContext(), intent); + } +}