diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index b8eb2b9fe..f07ab4fa3 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -134,6 +134,8 @@
+
diff --git a/Habitica/res/drawable-hdpi/gems_21.png b/Habitica/res/drawable-hdpi/gems_21.png
new file mode 100644
index 000000000..185d714f4
Binary files /dev/null and b/Habitica/res/drawable-hdpi/gems_21.png differ
diff --git a/Habitica/res/drawable-hdpi/gems_4.png b/Habitica/res/drawable-hdpi/gems_4.png
new file mode 100644
index 000000000..f8d2047e7
Binary files /dev/null and b/Habitica/res/drawable-hdpi/gems_4.png differ
diff --git a/Habitica/res/drawable-hdpi/gems_42.png b/Habitica/res/drawable-hdpi/gems_42.png
new file mode 100644
index 000000000..bc76ed2ba
Binary files /dev/null and b/Habitica/res/drawable-hdpi/gems_42.png differ
diff --git a/Habitica/res/drawable-hdpi/gems_84.png b/Habitica/res/drawable-hdpi/gems_84.png
new file mode 100644
index 000000000..fcc2d5810
Binary files /dev/null and b/Habitica/res/drawable-hdpi/gems_84.png differ
diff --git a/Habitica/res/drawable-hdpi/support_habitica.png b/Habitica/res/drawable-hdpi/support_habitica.png
new file mode 100644
index 000000000..e9cf46e0b
Binary files /dev/null and b/Habitica/res/drawable-hdpi/support_habitica.png differ
diff --git a/Habitica/res/drawable-mdpi/gems_21.png b/Habitica/res/drawable-mdpi/gems_21.png
new file mode 100644
index 000000000..4e907ffeb
Binary files /dev/null and b/Habitica/res/drawable-mdpi/gems_21.png differ
diff --git a/Habitica/res/drawable-mdpi/gems_4.png b/Habitica/res/drawable-mdpi/gems_4.png
new file mode 100644
index 000000000..9aab9c34d
Binary files /dev/null and b/Habitica/res/drawable-mdpi/gems_4.png differ
diff --git a/Habitica/res/drawable-mdpi/gems_42.png b/Habitica/res/drawable-mdpi/gems_42.png
new file mode 100644
index 000000000..95da7c62b
Binary files /dev/null and b/Habitica/res/drawable-mdpi/gems_42.png differ
diff --git a/Habitica/res/drawable-mdpi/gems_84.png b/Habitica/res/drawable-mdpi/gems_84.png
new file mode 100644
index 000000000..c12b83730
Binary files /dev/null and b/Habitica/res/drawable-mdpi/gems_84.png differ
diff --git a/Habitica/res/drawable-mdpi/support_habitica.png b/Habitica/res/drawable-mdpi/support_habitica.png
new file mode 100644
index 000000000..77b12870f
Binary files /dev/null and b/Habitica/res/drawable-mdpi/support_habitica.png differ
diff --git a/Habitica/res/drawable-xhdpi/gems_21.png b/Habitica/res/drawable-xhdpi/gems_21.png
new file mode 100644
index 000000000..6fc6af0df
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/gems_21.png differ
diff --git a/Habitica/res/drawable-xhdpi/gems_4.png b/Habitica/res/drawable-xhdpi/gems_4.png
new file mode 100644
index 000000000..7c3678a9f
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/gems_4.png differ
diff --git a/Habitica/res/drawable-xhdpi/gems_42.png b/Habitica/res/drawable-xhdpi/gems_42.png
new file mode 100644
index 000000000..287f3bb38
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/gems_42.png differ
diff --git a/Habitica/res/drawable-xhdpi/gems_84.png b/Habitica/res/drawable-xhdpi/gems_84.png
new file mode 100644
index 000000000..a935cf1e7
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/gems_84.png differ
diff --git a/Habitica/res/drawable-xhdpi/support_habitica.png b/Habitica/res/drawable-xhdpi/support_habitica.png
new file mode 100644
index 000000000..4e2a1e242
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/support_habitica.png differ
diff --git a/Habitica/res/drawable-xxhdpi/gems_21.png b/Habitica/res/drawable-xxhdpi/gems_21.png
new file mode 100644
index 000000000..f422827f4
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/gems_21.png differ
diff --git a/Habitica/res/drawable-xxhdpi/gems_4.png b/Habitica/res/drawable-xxhdpi/gems_4.png
new file mode 100644
index 000000000..84f5ecd3b
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/gems_4.png differ
diff --git a/Habitica/res/drawable-xxhdpi/gems_42.png b/Habitica/res/drawable-xxhdpi/gems_42.png
new file mode 100644
index 000000000..affd585f1
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/gems_42.png differ
diff --git a/Habitica/res/drawable-xxhdpi/gems_84.png b/Habitica/res/drawable-xxhdpi/gems_84.png
new file mode 100644
index 000000000..9c8367d74
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/gems_84.png differ
diff --git a/Habitica/res/drawable-xxhdpi/support_habitica.png b/Habitica/res/drawable-xxhdpi/support_habitica.png
new file mode 100644
index 000000000..fc77fd9c9
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/support_habitica.png differ
diff --git a/Habitica/res/drawable/ic_check_purple.xml b/Habitica/res/drawable/ic_check_purple.xml
new file mode 100644
index 000000000..60e7b4dd3
--- /dev/null
+++ b/Habitica/res/drawable/ic_check_purple.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Habitica/res/drawable/purchase_button_background.xml b/Habitica/res/drawable/purchase_button_background.xml
new file mode 100644
index 000000000..697ac5c1d
--- /dev/null
+++ b/Habitica/res/drawable/purchase_button_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/activity_gem_purchase.xml b/Habitica/res/layout/activity_gem_purchase.xml
new file mode 100644
index 000000000..7776fe9a0
--- /dev/null
+++ b/Habitica/res/layout/activity_gem_purchase.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index 45b11e69e..3f1dd2b2c 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -318,7 +318,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:layout_marginTop="30dp"
+ android:layout_marginTop="20dp"
android:orientation="vertical">
-
-
-
-
-
-
+ android:layout_gravity="center_horizontal"
+ android:hint="@string/start_date"
+ android:textColor="@android:color/black"
+ android:focusable="false" />
@@ -362,6 +348,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_marginTop="20dp"
android:id="@+id/task_tags_wrapper">
-
-
-
-
-
-
-
\ No newline at end of file
+ android:padding="20dp">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/purchase_gem_view.xml b/Habitica/res/layout/purchase_gem_view.xml
new file mode 100644
index 000000000..e42fd0493
--- /dev/null
+++ b/Habitica/res/layout/purchase_gem_view.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/attrs_avatar_view.xml b/Habitica/res/values/attrs_avatar_view.xml
index 595b30f9d..0127fc1ae 100644
--- a/Habitica/res/values/attrs_avatar_view.xml
+++ b/Habitica/res/values/attrs_avatar_view.xml
@@ -4,4 +4,10 @@
+
+
+
+
+
+
diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml
index 66b3c488b..fa8d37cc1 100644
--- a/Habitica/res/values/colors.xml
+++ b/Habitica/res/values/colors.xml
@@ -3,10 +3,10 @@
#36205D
#432874
- #4F2A93
+ #4f2a93
#6133B4
#9A62FF
- #BDA8FF
+ #bda8ff
#ede7f6
@color/brand_100
@@ -37,7 +37,7 @@
#50B5E9
#46A7D9
- #2995CD
+ #2995cd
#D9D9D9
#989898
@@ -96,10 +96,12 @@
@color/colorAccent
- #ff5cb85c
- #fff0ad4e
- #ffd9534f
+ @color/good_10
+ @color/neutral_10
+ @color/worse_10
#c8432874
+ #10bda8ff
+
diff --git a/Habitica/res/values/strings.constants.xml b/Habitica/res/values/strings.constants.xml
index 8396b200a..db5e26a5d 100644
--- a/Habitica/res/values/strings.constants.xml
+++ b/Habitica/res/values/strings.constants.xml
@@ -16,6 +16,6 @@
ACCEPT_QUEST_INVITE
REJECT_QUEST_INVITE
- habitica
- habitrpg-qr-code.jpg
+ habitica
+ habitrpg-qr-code.jpg
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 8cc0aba4a..671222a75 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -415,6 +415,14 @@ To start, which parts of your life do you want to improve?
Habitica Dailies
Habitica Add Task
Google play services could not be found.
+ Purchase
+ Buying gems supports the developers and helps keep Habitica running
+ Gems allow you to buy fun extras for you account, including:
+ Cool costumes for your avatar
+ Awesome backgrounds
+ Quests that reward you with pet eggs
+ The ability to change your class before level 100
+ Support Habitica
use
diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml
index 826cef312..e53aa887d 100644
--- a/Habitica/res/values/styles.xml
+++ b/Habitica/res/values/styles.xml
@@ -182,4 +182,13 @@
- 8dp
- center
+
+
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java
index f27a5ad33..be9c760ba 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java
@@ -7,6 +7,7 @@ import com.facebook.FacebookSdk;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.components.DaggerAppComponent;
+import com.habitrpg.android.habitica.helpers.PurchaseTypes;
import com.habitrpg.android.habitica.modules.AppModule;
import com.habitrpg.android.habitica.ui.activities.IntroActivity;
import com.habitrpg.android.habitica.ui.activities.LoginActivity;
@@ -49,7 +50,6 @@ import io.fabric.sdk.android.Fabric;
public class HabiticaApplication extends MultiDexApplication {
- public static String Purchase20Gems = "com.habitrpg.android.habitica.iap.20.gems";
public static HabitRPGUser User;
public static Activity currentActivity = null;
@Inject
@@ -338,7 +338,8 @@ public class HabiticaApplication extends MultiDexApplication {
}
});
- checkout = Checkout.forApplication(billing, Products.create().add(ProductTypes.IN_APP, Arrays.asList(Purchase20Gems)));
+
+ checkout = Checkout.forApplication(billing, Products.create().add(ProductTypes.IN_APP, PurchaseTypes.allTypes));
}
@NonNull
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.java
new file mode 100644
index 000000000..b7befef4b
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.java
@@ -0,0 +1,15 @@
+package com.habitrpg.android.habitica.helpers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class PurchaseTypes {
+
+ public static String Purchase4Gems = "com.habitrpg.android.habitica.iap.4gems";
+ public static String Purchase21Gems = "com.habitrpg.android.habitica.iap.21gems";
+ public static String Purchase42Gems = "com.habitrpg.android.habitica.iap.42gems";
+ public static String Purchase84Gems = "com.habitrpg.android.habitica.iap.84gems";
+
+ public static List allTypes = Arrays.asList(Purchase4Gems, Purchase21Gems, Purchase42Gems, Purchase84Gems);
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java
index be4fbf089..4c03c9138 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java
@@ -5,6 +5,7 @@ import android.app.TimePickerDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
+import android.support.annotation.Nullable;
import android.support.v7.preference.PreferenceManager;
import android.widget.Button;
import android.widget.DatePicker;
@@ -26,7 +27,7 @@ import java.util.UUID;
*/
public class RemindersManager {
- DateFormat dateFormater;
+ private DateFormat dateFormater;
public RemindersManager(String taskType) {
if (taskType.equals("todo")) {
@@ -56,7 +57,8 @@ public class RemindersManager {
return dateFormater.format(time);
}
- public void createDialogeForEditText(EditText editText, String taskType, Context context, RemindersItem reminder) {
+ public void createReminderTimeDialog(@Nullable ReminderTimeSelectedCallback callback, String taskType,
+ Context context, @Nullable RemindersItem reminder) {
Calendar currentTime = Calendar.getInstance();
int hour = currentTime.get(Calendar.HOUR_OF_DAY);
int minute = currentTime.get(Calendar.MINUTE);
@@ -92,11 +94,7 @@ public class RemindersManager {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day, hour1, minute1, 0);
- if (reminder != null) {
- reminder.setTime(calendar.getTime());
- }
-
- editText.setText(dateFormater.format(calendar.getTime()));
+ onReminderTimeSelected(callback, reminder, calendar);
dialog.hide();
});
dialog.show();
@@ -106,15 +104,26 @@ public class RemindersManager {
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), selectedHour, selectedMinute, 0);
- if (reminder != null) {
- reminder.setTime(calendar.getTime());
- }
-
- editText.setText(dateFormater.format(calendar.getTime()));
+ onReminderTimeSelected(callback, reminder, calendar);
}, hour, minute, true);
timePickerDialog.setTitle("Select Time");
timePickerDialog.show();
}
}
+ private void onReminderTimeSelected(ReminderTimeSelectedCallback callback, RemindersItem reminder, Calendar calendar) {
+ RemindersItem remindersItem = reminder;
+ if (remindersItem == null) {
+ remindersItem = createReminderFromDateString(dateFormater.format(calendar.getTime()));
+ } else {
+ remindersItem.setTime(calendar.getTime());
+ }
+ if (callback != null) {
+ callback.onReminderTimeSelected(remindersItem);
+ }
+ }
+
+ public interface ReminderTimeSelectedCallback {
+ void onReminderTimeSelected(RemindersItem remindersItem);
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.java
new file mode 100644
index 000000000..51a616f56
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.java
@@ -0,0 +1,65 @@
+package com.habitrpg.android.habitica.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+
+public class GemPurchaseOptionsView extends FrameLayout {
+
+ @BindView(R.id.gem_image)
+ ImageView gemImageView;
+
+ @BindView(R.id.gem_amount)
+ TextView gemAmountTextView;
+
+ @BindView(R.id.purchase_button)
+ Button purchaseButton;
+ private String sku;
+
+ public GemPurchaseOptionsView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ inflate(context, R.layout.purchase_gem_view, this);
+
+ ButterKnife.bind(this);
+
+ TypedArray a = context.getTheme().obtainStyledAttributes(
+ attrs,
+ R.styleable.GemPurchaseOptionsView,
+ 0, 0);
+
+ gemAmountTextView.setText(a.getText(R.styleable.GemPurchaseOptionsView_gemAmount));
+
+ Drawable iconRes = a.getDrawable(R.styleable.GemPurchaseOptionsView_gemDrawable);
+ if (iconRes != null) {
+ gemImageView.setImageDrawable(iconRes);
+ }
+ }
+
+ public void setOnPurchaseClickListener(Button.OnClickListener listener) {
+ purchaseButton.setOnClickListener(listener);
+ }
+
+ public void setPurchaseButtonText(String price) {
+ purchaseButton.setText(price);
+ }
+
+ public void setSku(String sku) {
+ this.sku = sku;
+ }
+
+ public String getSku() {
+ return sku;
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.java
new file mode 100644
index 000000000..0054223fa
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.java
@@ -0,0 +1,83 @@
+package com.habitrpg.android.habitica.ui.activities;
+
+
+import com.habitrpg.android.habitica.HabiticaApplication;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.components.AppComponent;
+import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
+
+import org.solovyev.android.checkout.ActivityCheckout;
+import org.solovyev.android.checkout.Checkout;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+
+public class GemPurchaseActivity extends BaseActivity implements GemsPurchaseFragment.Listener {
+
+ private ActivityCheckout checkout;
+
+ @Override
+ protected int getLayoutResId() {
+ return R.layout.activity_gem_purchase;
+ }
+
+ @Override
+ protected void injectActivity(AppComponent component) {
+
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ checkout.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setupCheckout();
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+ getSupportActionBar().setTitle(R.string.gem_purchase_toolbartitle);
+ }
+
+ GemsPurchaseFragment firstFragment = new GemsPurchaseFragment();
+ getSupportFragmentManager().beginTransaction()
+ .add(R.id.fragment_container, firstFragment).commit();
+ }
+
+ @Override
+ public void onDestroy() {
+ if (checkout != null) {
+ checkout.stop();
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void setupCheckout() {
+ checkout = Checkout.forActivity(this, HabiticaApplication.getInstance(this).getCheckout());
+ checkout.start();
+ }
+
+ @Override
+ public ActivityCheckout getActivityCheckout() {
+ return checkout;
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
index 33f574565..ebf8df46c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
@@ -50,21 +50,27 @@ import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.callbacks.ItemsCallback;
import com.habitrpg.android.habitica.callbacks.MergeUserCallback;
+import com.habitrpg.android.habitica.callbacks.TaskCreationCallback;
import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
+import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback;
import com.habitrpg.android.habitica.callbacks.UnlockCallback;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.events.ContentReloadedEvent;
import com.habitrpg.android.habitica.events.DisplayFragmentEvent;
import com.habitrpg.android.habitica.events.DisplayTutorialEvent;
+import com.habitrpg.android.habitica.events.HabitScoreEvent;
import com.habitrpg.android.habitica.events.ReloadContentEvent;
import com.habitrpg.android.habitica.events.SelectClassEvent;
import com.habitrpg.android.habitica.events.ShareEvent;
import com.habitrpg.android.habitica.events.TaskRemovedEvent;
+import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.habitrpg.android.habitica.events.ToggledEditTagsEvent;
import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
+import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand;
import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand;
import com.habitrpg.android.habitica.events.commands.BuyRewardCommand;
+import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand;
import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand;
import com.habitrpg.android.habitica.events.commands.EquipCommand;
import com.habitrpg.android.habitica.events.commands.FeedCommand;
@@ -73,6 +79,7 @@ import com.habitrpg.android.habitica.events.commands.OpenFullProfileCommand;
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand;
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand;
import com.habitrpg.android.habitica.events.commands.SellItemCommand;
+import com.habitrpg.android.habitica.events.commands.TaskCheckedCommand;
import com.habitrpg.android.habitica.events.commands.UnlockPathCommand;
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand;
import com.habitrpg.android.habitica.helpers.AmplitudeManager;
@@ -163,13 +170,10 @@ import static com.habitrpg.android.habitica.ui.helpers.UiUtils.SnackbarDisplayTy
import static com.habitrpg.android.habitica.ui.helpers.UiUtils.showSnackbar;
public class MainActivity extends BaseActivity implements Action1, HabitRPGUserCallback.OnUserReceived,
- TaskScoringCallback.OnTaskScored,
- GemsPurchaseFragment.Listener, TutorialView.OnTutorialReaction {
+ TaskScoringCallback.OnTaskScored, TutorialView.OnTutorialReaction {
public static final int SELECT_CLASS_RESULT = 11;
public static final int MIN_LEVEL_FOR_SKILLS = 11;
- // Checkout needs to be in the Activity..
- public ActivityCheckout checkout = null;
@Inject
public APIHelper apiHelper;
@Inject
@@ -274,7 +278,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha
.append(this.drawer);
}
- setupCheckout();
EventBus.getDefault().register(this);
}
@@ -324,15 +327,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha
sendBroadcast(intent);
}
- private void setupCheckout() {
- checkout = Checkout.forActivity(this, HabiticaApplication.getInstance(this).getCheckout());
- checkout.start();
- }
-
- @Override
- public ActivityCheckout getActivityCheckout() {
- return checkout;
- }
private void saveLoginInformation() {
HabiticaApplication.User = user;
@@ -875,17 +869,12 @@ public class MainActivity extends BaseActivity implements Action1, Ha
}
}
super.onActivityResult(requestCode, resultCode, data);
- checkout.onActivityResult(requestCode, resultCode, data);
}
// region Events
@Override
public void onDestroy() {
- if (checkout != null) {
- checkout.stop();
- }
-
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@@ -1462,6 +1451,46 @@ public class MainActivity extends BaseActivity implements Action1, Ha
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_using)));
}
+ @Subscribe
+ public void onEvent(TaskCheckedCommand event) {
+ apiHelper.apiService.postTaskDirection(event.Task.getId(), (event.Task.getCompleted() ? TaskDirection.down : TaskDirection.up).toString())
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(new TaskScoringCallback(this, event.Task.getId()), throwable -> {
+ });
+ }
+
+ @Subscribe
+ public void onEvent(ChecklistCheckedCommand event) {
+ apiHelper.apiService.scoreChecklistItem(event.task.getId(), event.item.getId())
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(new TaskUpdateCallback(), throwable -> {
+ });
+ }
+
+ @Subscribe
+ public void onEvent(HabitScoreEvent event) {
+ apiHelper.apiService.postTaskDirection(event.habit.getId(), (event.Up ? TaskDirection.up : TaskDirection.down).toString())
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(new TaskScoringCallback(this, event.habit.getId()), throwable -> {
+ });
+ }
+
+ @Subscribe
+ public void onEvent(final TaskSaveEvent event) {
+ Task task = event.task;
+ if (event.created) {
+ this.apiHelper.apiService.createItem(task)
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(new TaskCreationCallback(), throwable -> {
+ });
+ } else {
+ this.apiHelper.apiService.updateTask(task.getId(), task)
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(new TaskUpdateCallback(), throwable -> {
+ });
+ }
+ }
+
private void checkMaintenance() {
this.maintenanceService.getMaintenanceStatus()
.compose(apiHelper.configureApiCallObserver())
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
index c07337324..d4ab73cef 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
@@ -40,6 +40,7 @@ import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand;
import com.habitrpg.android.habitica.helpers.FirstDayOfTheWeekHelper;
import com.habitrpg.android.habitica.helpers.RemindersManager;
+import com.habitrpg.android.habitica.helpers.TagsHelper;
import com.habitrpg.android.habitica.helpers.TaskAlarmManager;
import com.habitrpg.android.habitica.ui.WrapContentRecyclerViewLayoutManager;
import com.habitrpg.android.habitica.ui.adapter.tasks.CheckListAdapter;
@@ -73,13 +74,14 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
+import javax.inject.Inject;
+
import butterknife.BindView;
import butterknife.OnClick;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
-
public class TaskFormActivity extends BaseActivity implements AdapterView.OnItemSelectedListener {
public static final String TASK_ID_KEY = "taskId";
public static final String USER_ID_KEY = "userId";
@@ -160,9 +162,6 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
@BindView(R.id.reminders_recycler_view)
RecyclerView remindersRecyclerView;
- @BindView(R.id.add_reminder_button)
- Button addReminderButton;
-
@BindView(R.id.emoji_toggle_btn0)
ImageButton emojiToggle0;
@@ -192,6 +191,10 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
@BindView(R.id.task_tags_checklist)
LinearLayout tagsContainerLinearLayout;
+
+ @Inject
+ TagsHelper tagsHelper;
+
EmojiPopup popup;
private String taskType;
@@ -209,6 +212,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
private RemindersManager remindersManager;
private TaskAlarmManager taskAlarmManager;
+ private FirstDayOfTheWeekHelper firstDayOfTheWeekHelper;
@Override
protected int getLayoutResId() {
@@ -364,8 +368,9 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
@Override
public void onKeyboardClose() {
- if (popup.isShowing())
+ if (popup.isShowing()) {
popup.dismiss();
+ }
}
});
@@ -488,22 +493,13 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
mItemTouchHelper.attachToRecyclerView(remindersRecyclerView);
}
- @OnClick(R.id.add_reminder_button)
- public void addReminder() {
- if (newRemindersEditText.getText().length() > 0) {
- RemindersItem item = remindersManager.createReminderFromDateString(newRemindersEditText.getText().toString());
- if (item == null) {
- return;
- }
- item.setType(taskType);
- remindersAdapter.addItem(item);
- newRemindersEditText.setText("");
- }
+ private void addNewReminder(RemindersItem remindersItem) {
+ remindersAdapter.addItem(remindersItem);
}
@OnClick(R.id.new_reminder_edittext)
- public void changeNewReminderTime() {
- remindersManager.createDialogeForEditText(newRemindersEditText, taskType, this, null);
+ public void selectNewReminderTime() {
+ remindersManager.createReminderTimeDialog(this::addNewReminder, taskType, this, null);
}
private void createTagsCheckBoxes() {
@@ -527,6 +523,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
}
}
});
+ checkbox.setChecked(tagsHelper.isTagChecked(tag.getId()));
tagsContainerLinearLayout.addView(row);
tagCheckBoxList.add(checkbox);
position++;
@@ -574,7 +571,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
String dayOfTheWeek = sharedPreferences.getString("FirstDayOfTheWeek",
Integer.toString(Calendar.getInstance().getFirstDayOfWeek()));
- FirstDayOfTheWeekHelper firstDayOfTheWeekHelper =
+ firstDayOfTheWeekHelper =
FirstDayOfTheWeekHelper.newInstance(Integer.parseInt(dayOfTheWeek));
ArrayList weekdaysTemp = new ArrayList<>(Arrays.asList(weekdays));
Collections.rotate(weekdaysTemp, firstDayOfTheWeekHelper.getDailyTaskFormOffset());
@@ -601,13 +598,14 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
if (this.task != null) {
if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
- this.weekdayCheckboxes.get(0).setChecked(this.task.getRepeat().getM());
- this.weekdayCheckboxes.get(1).setChecked(this.task.getRepeat().getT());
- this.weekdayCheckboxes.get(2).setChecked(this.task.getRepeat().getW());
- this.weekdayCheckboxes.get(3).setChecked(this.task.getRepeat().getTh());
- this.weekdayCheckboxes.get(4).setChecked(this.task.getRepeat().getF());
- this.weekdayCheckboxes.get(5).setChecked(this.task.getRepeat().getS());
- this.weekdayCheckboxes.get(6).setChecked(this.task.getRepeat().getSu());
+ int offset = firstDayOfTheWeekHelper.getDailyTaskFormOffset();
+ this.weekdayCheckboxes.get(offset).setChecked(this.task.getRepeat().getM());
+ this.weekdayCheckboxes.get((offset+1) % 7).setChecked(this.task.getRepeat().getT());
+ this.weekdayCheckboxes.get((offset+2) % 7).setChecked(this.task.getRepeat().getW());
+ this.weekdayCheckboxes.get((offset+3) % 7).setChecked(this.task.getRepeat().getTh());
+ this.weekdayCheckboxes.get((offset+4) % 7).setChecked(this.task.getRepeat().getF());
+ this.weekdayCheckboxes.get((offset+5) % 7).setChecked(this.task.getRepeat().getS());
+ this.weekdayCheckboxes.get((offset+6) % 7).setChecked(this.task.getRepeat().getSu());
} else {
this.frequencyPicker.setValue(this.task.getEveryX());
}
@@ -631,7 +629,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
//noinspection SimplifiableIfStatement
if (id == R.id.action_save_changes) {
- finishActivitySuccessfuly();
+ finishActivitySuccessfully();
return true;
}
@@ -694,13 +692,14 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
if (task.getFrequency().equals("weekly")) {
this.dailyFrequencySpinner.setSelection(0);
if (weekdayCheckboxes.size() == 7) {
- this.weekdayCheckboxes.get(0).setChecked(task.getRepeat().getM());
- this.weekdayCheckboxes.get(1).setChecked(task.getRepeat().getT());
- this.weekdayCheckboxes.get(2).setChecked(task.getRepeat().getW());
- this.weekdayCheckboxes.get(3).setChecked(task.getRepeat().getTh());
- this.weekdayCheckboxes.get(4).setChecked(task.getRepeat().getF());
- this.weekdayCheckboxes.get(5).setChecked(task.getRepeat().getS());
- this.weekdayCheckboxes.get(6).setChecked(task.getRepeat().getSu());
+ int offset = firstDayOfTheWeekHelper.getDailyTaskFormOffset();
+ this.weekdayCheckboxes.get(offset).setChecked(this.task.getRepeat().getM());
+ this.weekdayCheckboxes.get((offset+1) % 7).setChecked(this.task.getRepeat().getT());
+ this.weekdayCheckboxes.get((offset+2) % 7).setChecked(this.task.getRepeat().getW());
+ this.weekdayCheckboxes.get((offset+3) % 7).setChecked(this.task.getRepeat().getTh());
+ this.weekdayCheckboxes.get((offset+4) % 7).setChecked(this.task.getRepeat().getF());
+ this.weekdayCheckboxes.get((offset+5) % 7).setChecked(this.task.getRepeat().getS());
+ this.weekdayCheckboxes.get((offset+6) % 7).setChecked(this.task.getRepeat().getSu());
}
} else {
this.dailyFrequencySpinner.setSelection(1);
@@ -743,8 +742,9 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
}
}
- if (task.text.isEmpty())
+ if (task.text.isEmpty()) {
return false;
+ }
task.notes = MarkdownParser.parseCompiled(taskNotes.getText());
@@ -795,13 +795,14 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
task.setRepeat(repeat);
}
- repeat.setM(this.weekdayCheckboxes.get(0).isChecked());
- repeat.setT(this.weekdayCheckboxes.get(1).isChecked());
- repeat.setW(this.weekdayCheckboxes.get(2).isChecked());
- repeat.setTh(this.weekdayCheckboxes.get(3).isChecked());
- repeat.setF(this.weekdayCheckboxes.get(4).isChecked());
- repeat.setS(this.weekdayCheckboxes.get(5).isChecked());
- repeat.setSu(this.weekdayCheckboxes.get(6).isChecked());
+ int offset = firstDayOfTheWeekHelper.getDailyTaskFormOffset();
+ repeat.setM(this.weekdayCheckboxes.get(offset).isChecked());
+ repeat.setT(this.weekdayCheckboxes.get((offset+1) % 7).isChecked());
+ repeat.setW(this.weekdayCheckboxes.get((offset+2) % 7).isChecked());
+ repeat.setTh(this.weekdayCheckboxes.get((offset+3) % 7).isChecked());
+ repeat.setF(this.weekdayCheckboxes.get((offset+4) % 7).isChecked());
+ repeat.setS(this.weekdayCheckboxes.get((offset+5) % 7).isChecked());
+ repeat.setSu(this.weekdayCheckboxes.get((offset+6) % 7).isChecked());
} else {
task.setFrequency("daily");
task.setEveryX(this.frequencyPicker.getValue());
@@ -847,7 +848,6 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
}
private void prepareSave() {
-
if (this.task == null) {
this.task = new Task();
this.task.setType(taskType);
@@ -888,12 +888,19 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
dismissKeyboard();
}
- private void finishActivitySuccessfuly() {
+ private void finishActivitySuccessfully() {
this.prepareSave();
- finish();
+ finishWithSuccess();
dismissKeyboard();
}
+ private void finishWithSuccess() {
+ Intent resultIntent = new Intent();
+ resultIntent.putExtra(TaskFormActivity.TASK_TYPE_KEY, taskType);
+ setResult(RESULT_OK, resultIntent);
+ finish();
+ }
+
private void dismissKeyboard() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View currentFocus = getCurrentFocus();
@@ -908,7 +915,6 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
EditText datePickerText;
DateFormat dateFormatter;
-
public DateEditTextListener(EditText dateText) {
calendar = Calendar.getInstance();
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RemindersAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RemindersAdapter.java
index 55f844a6b..256e9dcfa 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RemindersAdapter.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RemindersAdapter.java
@@ -6,23 +6,15 @@ import com.habitrpg.android.habitica.ui.helpers.ItemTouchHelperAdapter;
import com.habitrpg.android.habitica.ui.helpers.ItemTouchHelperViewHolder;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem;
-import android.app.Dialog;
-import android.app.TimePickerDialog;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.widget.DatePicker;
import android.widget.EditText;
-import android.widget.TimePicker;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -115,7 +107,7 @@ public class RemindersAdapter extends RecyclerView.Adapter tutorialStepTransactionListener = new TransactionListener() {
@Override
public void onResultReceived(TutorialStep step) {
@@ -87,7 +86,6 @@ public abstract class BaseFragment extends DialogFragment {
// Receive Events
try {
EventBus.getDefault().register(this);
- registerEventBus = true;
} catch (EventBusException ignored) {
}
@@ -109,7 +107,7 @@ public abstract class BaseFragment extends DialogFragment {
@Override
public void onDestroyView() {
- if (registerEventBus) {
+ if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
if (unbinder != null) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java
index 43eb1e4b0..ea30bb9e7 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java
@@ -4,6 +4,8 @@ import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.events.BoughtGemsEvent;
+import com.habitrpg.android.habitica.helpers.PurchaseTypes;
+import com.habitrpg.android.habitica.ui.GemPurchaseOptionsView;
import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
import org.greenrobot.eventbus.EventBus;
@@ -27,14 +29,26 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
+import java.util.HashMap;
+
import butterknife.BindView;
import butterknife.OnClick;
import io.fabric.sdk.android.Fabric;
-public class GemsPurchaseFragment extends BaseMainFragment {
+public class GemsPurchaseFragment extends BaseFragment {
+
+ @BindView(R.id.gems_4_view)
+ GemPurchaseOptionsView gems4View;
+ @BindView(R.id.gems_21_view)
+ GemPurchaseOptionsView gems21View;
+ @BindView(R.id.gems_42_view)
+ GemPurchaseOptionsView gems42View;
+ @BindView(R.id.gems_84_view)
+ GemPurchaseOptionsView gems84View;
+
+ private HashMap priceMap;
private static final int GEMS_TO_ADD = 21;
- @BindView(R.id.btn_purchase_gems)
Button btnPurchaseGems;
private Listener listener;
private BillingRequests billingRequests;
@@ -52,6 +66,8 @@ public class GemsPurchaseFragment extends BaseMainFragment {
super.onCreateView(inflater, container, savedInstanceState);
+ priceMap = new HashMap<>();
+
return inflater.inflate(R.layout.fragment_gem_purchase, container, false);
}
@@ -64,8 +80,10 @@ public class GemsPurchaseFragment extends BaseMainFragment {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- btnPurchaseGems.setEnabled(false);
- ViewHelper.SetBackgroundTint(btnPurchaseGems, ContextCompat.getColor(getContext(), R.color.brand));
+ gems4View.setOnPurchaseClickListener(v -> purchaseGems(PurchaseTypes.Purchase4Gems));
+ gems21View.setOnPurchaseClickListener(v -> purchaseGems(PurchaseTypes.Purchase21Gems));
+ gems42View.setOnPurchaseClickListener(v -> purchaseGems(PurchaseTypes.Purchase42Gems));
+ gems84View.setOnPurchaseClickListener(v -> purchaseGems(PurchaseTypes.Purchase84Gems));
final ActivityCheckout checkout = listener.getActivityCheckout();
@@ -75,7 +93,7 @@ public class GemsPurchaseFragment extends BaseMainFragment {
checkout.createPurchaseFlow(new RequestListener() {
@Override
public void onSuccess(@NonNull Purchase purchase) {
- if (purchase.sku.equals(HabiticaApplication.Purchase20Gems)) {
+ if (PurchaseTypes.allTypes.contains(purchase.sku)) {
billingRequests.consume(purchase.token, new RequestListener