diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 0bf60f924..e6dccab7d 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -147,6 +147,11 @@
+
+
+
+
+
@@ -171,13 +176,22 @@
android:resource="@xml/filepaths" />
-
+
+
+
+
+
+
+
diff --git a/Habitica/res/drawable/widget_add_daily_background.xml b/Habitica/res/drawable/widget_add_daily_background.xml
new file mode 100644
index 000000000..b16d34272
--- /dev/null
+++ b/Habitica/res/drawable/widget_add_daily_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/widget_add_habit_background.xml b/Habitica/res/drawable/widget_add_habit_background.xml
new file mode 100644
index 000000000..8c71cdacd
--- /dev/null
+++ b/Habitica/res/drawable/widget_add_habit_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/widget_add_reward_background.xml b/Habitica/res/drawable/widget_add_reward_background.xml
new file mode 100644
index 000000000..713fb37e8
--- /dev/null
+++ b/Habitica/res/drawable/widget_add_reward_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/widget_add_todo_background.xml b/Habitica/res/drawable/widget_add_todo_background.xml
new file mode 100644
index 000000000..a6997adea
--- /dev/null
+++ b/Habitica/res/drawable/widget_add_todo_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/widget_background.xml b/Habitica/res/drawable/widget_background.xml
index c617bca2d..ec645c0a6 100644
--- a/Habitica/res/drawable/widget_background.xml
+++ b/Habitica/res/drawable/widget_background.xml
@@ -10,7 +10,7 @@
+ android:radius="2dp" >
\ No newline at end of file
diff --git a/Habitica/res/layout/widget_add_task.xml b/Habitica/res/layout/widget_add_task.xml
new file mode 100644
index 000000000..a161126f5
--- /dev/null
+++ b/Habitica/res/layout/widget_add_task.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/widget_avatar_stats.xml b/Habitica/res/layout/widget_avatar_stats.xml
index c4623f7ff..d5cb57b3b 100644
--- a/Habitica/res/layout/widget_avatar_stats.xml
+++ b/Habitica/res/layout/widget_avatar_stats.xml
@@ -8,6 +8,7 @@
android:focusableInTouchMode="true"
android:background="@drawable/rounded_purple_square"
android:padding="8dp"
+ android:elevation="2dp"
android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 94f4acfe6..1366f40d3 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -397,5 +397,11 @@ To start, which parts of your life do you want to improve?
Scan QR Code
Enter Recipients User ID
You were invited to join a party!
+ Habitica Stats
+ Add Task
+ Add Habit
+ Add Daily
+ Add To-Do
+ Add Reward
diff --git a/Habitica/res/xml/add_task_widget_info.xml b/Habitica/res/xml/add_task_widget_info.xml
new file mode 100644
index 000000000..acf11d318
--- /dev/null
+++ b/Habitica/res/xml/add_task_widget_info.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.java
new file mode 100644
index 000000000..1fa439067
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.java
@@ -0,0 +1,80 @@
+package com.habitrpg.android.habitica.ui.activities;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.preference.PreferenceManager;
+import android.util.Log;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.widget.AddTaskWidgetProvider;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
+
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class AddTaskWidgetActivity extends AppCompatActivity {
+
+ private int widgetId;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setResult(RESULT_CANCELED);
+ setContentView(R.layout.widget_configure_add_task);
+ ButterKnife.bind(this);
+
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ // If this activity was started with an intent without an app widget ID,
+ // finish with an error.
+ if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ }
+ }
+
+ @OnClick(R.id.add_habit_button)
+ public void addHabitSelected() {
+ finishWithSelection(Task.TYPE_HABIT);
+ }
+
+ @OnClick(R.id.add_daily_button)
+ public void addDailySelected() {
+ finishWithSelection(Task.TYPE_DAILY);
+ }
+
+ @OnClick(R.id.add_todo_button)
+ public void addToDoSelected() {
+ finishWithSelection(Task.TYPE_TODO);
+ }
+
+ @OnClick(R.id.add_reward_button)
+ public void addRewardSelected() {
+ finishWithSelection(Task.TYPE_REWARD);
+ }
+
+ private void finishWithSelection(String selectedTaskType) {
+ storeSelectedTaskType(selectedTaskType);
+
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
+ setResult(RESULT_OK, resultValue);
+ finish();
+
+ Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, AddTaskWidgetProvider.class);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {widgetId});
+ sendBroadcast(intent);
+ }
+
+ private void storeSelectedTaskType(String selectedTaskType) {
+ SharedPreferences.Editor preferences = PreferenceManager.getDefaultSharedPreferences(this).edit();
+ preferences.putString("add_task_widget_" + widgetId, selectedTaskType);
+ preferences.apply();
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.java
new file mode 100644
index 000000000..3dc6f4524
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.java
@@ -0,0 +1,74 @@
+package com.habitrpg.android.habitica.widget;
+
+import android.appwidget.AppWidgetManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.widget.RemoteViews;
+
+import com.habitrpg.android.habitica.R;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
+
+public class AddTaskWidgetProvider extends BaseWidgetProvider {
+
+ @Override
+ public int layoutResourceId() {
+ return R.layout.widget_add_task;
+ }
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+ // Get all ids
+ ComponentName thisWidget = new ComponentName(context,
+ AddTaskWidgetProvider.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));
+ }
+ }
+ }
+
+ @Override
+ public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) {
+
+ String selectedTaskType = getSelectedTaskType(widgetId);
+ String addText = "";
+ int backgroundResource = R.drawable.widget_add_habit_background;
+ switch (selectedTaskType) {
+ case Task.TYPE_HABIT:
+ addText = this.context.getResources().getString(R.string.add_habit);
+ backgroundResource = R.drawable.widget_add_habit_background;
+ break;
+ case Task.TYPE_DAILY:
+ addText = this.context.getResources().getString(R.string.add_daily);
+ backgroundResource = R.drawable.widget_add_daily_background;
+ break;
+ case Task.TYPE_TODO:
+ addText = this.context.getResources().getString(R.string.add_todo);
+ backgroundResource = R.drawable.widget_add_todo_background;
+ break;
+ case Task.TYPE_REWARD:
+ addText = this.context.getResources().getString(R.string.add_reward);
+ backgroundResource = R.drawable.widget_add_reward_background;
+ break;
+ }
+ remoteViews.setTextViewText(R.id.add_task_text, addText);
+ remoteViews.setInt(R.id.add_task_icon, "setBackgroundResource", backgroundResource);
+ return remoteViews;
+ }
+
+ private String getSelectedTaskType(int widgetId) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this.context);
+ return preferences.getString("add_task_widget_"+widgetId, Task.TYPE_HABIT);
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java
index c73be3831..d735ce993 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java
@@ -14,22 +14,12 @@ import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;
-public class AvatarStatsWidgetProvider extends AppWidgetProvider {
+public class AvatarStatsWidgetProvider extends BaseWidgetProvider {
private static final String LOG = AvatarStatsWidgetProvider.class.getName();
- /**
- * Returns number of cells needed for given size of the widget.
- * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t
- *
- * @param size Widget size in dp.
- * @return Size in number of cells.
- */
- private static int getCellsForSize(int size) {
- int n = 2;
- while (70 * n - 30 < size) {
- ++n;
- }
- return n - 1;
+ @Override
+ public int layoutResourceId() {
+ return R.layout.widget_avatar_stats;
}
@Override
@@ -43,7 +33,7 @@ public class AvatarStatsWidgetProvider extends AppWidgetProvider {
for (int widgetId : allWidgetIds) {
Bundle options = appWidgetManager.getAppWidgetOptions(widgetId);
appWidgetManager.partiallyUpdateAppWidget(widgetId,
- configureRemoteViews(context, options));
+ sizeRemoteViews(context, options, widgetId));
}
}
@@ -55,36 +45,9 @@ public class AvatarStatsWidgetProvider extends AppWidgetProvider {
context.startService(intent);
}
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+
@Override
- public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
- Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
-
- appWidgetManager.partiallyUpdateAppWidget(appWidgetId,
- configureRemoteViews(context, options));
-
- super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
- newOptions);
-
- }
-
- /**
- * Determine appropriate view based on width provided.
- * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t
- */
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
- private RemoteViews configureRemoteViews(Context context, Bundle options) {
-
- int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
- int minHeight = options
- .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
-
- // First find out rows and columns based on width provided.
- int rows = getCellsForSize(minHeight);
- int columns = getCellsForSize(minWidth);
- RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
- R.layout.widget_avatar_stats);
-
+ public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) {
if (columns > 3) {
remoteViews.setViewVisibility(R.id.avatar_view, View.VISIBLE);
} else {
@@ -100,6 +63,5 @@ public class AvatarStatsWidgetProvider extends AppWidgetProvider {
}
return remoteViews;
-
}
}
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 a767aa6dc..60beaa967 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
@@ -27,12 +27,6 @@ import android.widget.RemoteViews;
import javax.inject.Inject;
-/**
- * The service that should update the simple widget
- *
- * @see com.habitrpg.android.habitica.widget.SimpleWidget
- * Created by Mickael on 01/11/13.
- */
public class AvatarStatsWidgetService extends Service {
private static final String LOG = ".avatarwidget.service";
@Inject
@@ -102,11 +96,9 @@ public class AvatarStatsWidgetService extends Service {
AvatarView avatarView = new AvatarView(this, true, true, true);;
avatarView.setUser(user);
avatarView.onAvatarImageReady(bitmap -> {
- Log.e("AVATAR BITMAP", bitmap.toString());
- remoteViews.setImageViewBitmap(R.id.avatar_view, bitmap);
+ remoteViews.setImageViewBitmap(R.id.avatar_view, bitmap);
appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews);
});
- Log.e("AVATAR THING", "BLA");
//If user click on life and xp: open the app
Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class);
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.java
new file mode 100644
index 000000000..831f24a4f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.java
@@ -0,0 +1,66 @@
+package com.habitrpg.android.habitica.widget;
+
+import android.annotation.TargetApi;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.RemoteViews;
+
+import com.habitrpg.android.habitica.R;
+
+public abstract class BaseWidgetProvider extends AppWidgetProvider {
+
+ protected Context context;
+
+ /**
+ * Returns number of cells needed for given size of the widget.
+ * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t
+ *
+ * @param size Widget size in dp.
+ * @return Size in number of cells.
+ */
+ private static int getCellsForSize(int size) {
+ int n = 2;
+ while (70 * n - 30 < size) {
+ ++n;
+ }
+ return n - 1;
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+ @Override
+ public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
+ this.context = context;
+ Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
+
+ appWidgetManager.partiallyUpdateAppWidget(appWidgetId,
+ sizeRemoteViews(context, options, appWidgetId));
+
+ super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
+ newOptions);
+
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+ public RemoteViews sizeRemoteViews(Context context, Bundle options, int widgetId) {
+ this.context = context;
+ int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
+ int minHeight = options
+ .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
+
+ // First find out rows and columns based on width provided.
+ int rows = getCellsForSize(minHeight);
+ int columns = getCellsForSize(minWidth);
+ RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
+ layoutResourceId());
+
+ return configureRemoteViews(remoteViews, widgetId, columns, rows);
+ }
+
+ abstract public int layoutResourceId();
+
+ abstract public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows);
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java
deleted file mode 100644
index 005f978bd..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.habitrpg.android.habitica.widget;
-
-import com.habitrpg.android.habitica.R;
-
-import android.annotation.TargetApi;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProvider;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.RemoteViews;
-
-/**
- * Define a simple custom widget for the habitrpg client
- * Created by Mickael on 31/10/13.
- */
-public class SimpleWidget extends AppWidgetProvider {
- private static final String LOG = "simplewidgetprovider";
-
- /**
- * Returns number of cells needed for given size of the widget.
- * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t
- *
- * @param size Widget size in dp.
- * @return Size in number of cells.
- */
- private static int getCellsForSize(int size) {
- int n = 2;
- while (70 * n - 30 < size) {
- ++n;
- }
- return n - 1;
- }
-
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- Log.w(LOG, "onUpdate method called");
- // Get all ids
- ComponentName thisWidget = new ComponentName(context,
- SimpleWidget.class);
- int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
-
- if (Build.VERSION.SDK_INT >= 16) {
- for (int widgetId : allWidgetIds) {
- Bundle options = appWidgetManager.getAppWidgetOptions(widgetId);
- appWidgetManager.updateAppWidget(widgetId,
- getRemoteViews(context, options));
- }
- }
- // Build the intent to call the service
- Intent intent = new Intent(context.getApplicationContext(),
- AvatarStatsWidgetService.class);
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
-
- // Update the widgets via the service
- context.startService(intent);
- }
-
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
- @Override
- public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
- Log.v(LOG, "onAppWidgetOptionChanged call");
- Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
-
- appWidgetManager.updateAppWidget(appWidgetId,
- getRemoteViews(context, options));
-
- super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
- newOptions);
-
- }
-
- /**
- * Determine appropriate view based on width provided.
- * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t
- */
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
- private RemoteViews getRemoteViews(Context context, Bundle options) {
-
- int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
- int minHeight = options
- .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
-
- // First find out rows and columns based on width provided.
- int rows = getCellsForSize(minHeight);
- int columns = getCellsForSize(minWidth);
- RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
- R.layout.simple_widget);
-
- if (columns > 2) {
- remoteViews.setViewVisibility(R.id.LL_header, View.VISIBLE);
- // Get 4 column widget remote view and return
- } else {
- remoteViews.setViewVisibility(R.id.LL_header, View.GONE);
- }
- return remoteViews;
-
- }
-
-
-}
diff --git a/build.gradle b/build.gradle
index 0e19da6e8..4bb1d4fd4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.1.2'
+ classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.android.databinding:dataBinder:1.0-rc4'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.google.gms:google-services:3.0.0'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 73e9ac19c..e34758aec 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,7 @@
-#Wed Apr 27 08:20:39 CST 2016
+#Mon Sep 12 12:48:06 CEST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip
org.gradle.jvmargs=-Xmx3072M
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip