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