From 3595f6d460d1d5c3bbb01c3d7b72ab65cef78fc9 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 27 Jun 2016 13:28:00 -0500 Subject: [PATCH 01/43] Added firebase notifications --- .gitignore | 1 + Habitica/AndroidManifest.xml | 14 ++++++++++++ Habitica/build.gradle | 5 +++++ .../HabiticaFirebaseInstanceIDService.java | 22 +++++++++++++++++++ .../HabiticaFirebaseMessagingService.java | 21 ++++++++++++++++++ build.gradle | 1 + 6 files changed, 64 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java diff --git a/.gitignore b/.gitignore index 6e6e04e44..80f87efef 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ fabric.properties Habitica/res/values/secret_strings.xml habitica.properties habitica.resources +Habitica/google-services.json diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 832b03c34..4792a630d 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -128,6 +128,20 @@ + + + + + + + + + + + + Date: Tue, 28 Jun 2016 13:27:48 -0500 Subject: [PATCH 02/43] Add UI for push settings. Added push manager. Added toggle for push enabled/disabled. --- .../PushNotificationManager.java | 19 +++++++++++++++++++ .../PushNotificationsPreferencesFragment.java | 7 +++++++ 2 files changed, 26 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java new file mode 100644 index 000000000..357c0b27f --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -0,0 +1,19 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +/** + * Created by keithholliday on 6/27/16. + */ +public class PushNotificationManager { + private static PushNotificationManager instance = null; + + protected PushNotificationManager() { + // Exists only to defeat instantiation. + } + + public static PushNotificationManager getInstance() { + if(instance == null) { + instance = new PushNotificationManager(); + } + return instance; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java new file mode 100644 index 000000000..ca67f2d3d --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java @@ -0,0 +1,7 @@ +package com.habitrpg.android.habitica.ui.fragments.preferences; + +/** + * Created by keithholliday on 6/27/16. + */ +public class PushNotificationsPreferencesFragment { +} From 335453e92605f67d5680ebff20bed40a3fd9d27c Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Tue, 28 Jun 2016 13:27:57 -0500 Subject: [PATCH 03/43] Add UI for push settings. Added push manager. Added toggle for push enabled/disabled. --- Habitica/res/values/strings.xml | 11 ++++ Habitica/res/xml/preferences_fragment.xml | 63 +++++++++++++++++++ .../habitica/components/AppComponent.java | 4 ++ .../HabiticaFirebaseInstanceIDService.java | 15 +++-- .../PushNotificationManager.java | 50 +++++++++++++-- .../habitica/ui/activities/PrefsActivity.java | 5 ++ .../preferences/PreferencesFragment.java | 22 +++++++ .../PushNotificationsPreferencesFragment.java | 28 ++++++++- .../habitrpgwrapper/lib/api/ApiService.java | 9 ++- 9 files changed, 195 insertions(+), 12 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 390d4b3b9..7589f7f26 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -22,6 +22,17 @@ Activate Reminder Set Reminder Time + User Push Notifications + Push Notifications + You won a Challenge! + Received a Private Message + Gifted Gems + Gifted Subscription + Invited to Party + Invited to Guiild + Your Quest has Begun + Invited to Quest + Value New todo diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index e88c4312f..46d5b2e1b 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -75,4 +75,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 1f4a1450e..52224eaee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.components; import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.modules.ApiModule; import com.habitrpg.android.habitica.modules.AppModule; import com.habitrpg.android.habitica.ui.activities.AboutActivity; @@ -156,4 +157,7 @@ public interface AppComponent { void inject(ShopsFragment shopsFragment); void inject(ShopFragment shopFragment); + + void inject(PushNotificationManager pushNotificationManager); + } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java index b1f27c790..7b07087ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java @@ -4,19 +4,26 @@ import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; +import com.habitrpg.android.habitica.APIHelper; + +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Inject; /** * Created by keithholliday on 6/24/16. */ public class HabiticaFirebaseInstanceIDService extends FirebaseInstanceIdService { + + public PushNotificationManager pushNotificationManager; + @Override public void onTokenRefresh() { - // Get updated InstanceID token. + pushNotificationManager = PushNotificationManager.getInstance(this); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); + pushNotificationManager.setRefreshedToken(refreshedToken); Log.d("test", "Refreshed token: " + refreshedToken); - - // TODO: Implement this method to send any registration to your app's servers. -// sendRegistrationToServer(refreshedToken); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 357c0b27f..1057ebd9b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -1,19 +1,59 @@ package com.habitrpg.android.habitica.helpers.notifications; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; + +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Inject; + /** * Created by keithholliday on 6/27/16. */ public class PushNotificationManager { - private static PushNotificationManager instance = null; - protected PushNotificationManager() { - // Exists only to defeat instantiation. + private static PushNotificationManager instance = null; + private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; + + @Inject + public APIHelper apiHelper; + + private String refreshedToken; + private SharedPreferences sharedPreferences; + + protected PushNotificationManager(Context context) { + HabiticaApplication.getInstance(context).getComponent().inject(this); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); } - public static PushNotificationManager getInstance() { + public static PushNotificationManager getInstance(Context context) { if(instance == null) { - instance = new PushNotificationManager(); + instance = new PushNotificationManager(context); } return instance; } + + public void setRefreshedToken (String refreshedToken) { + if (this.refreshedToken == null) { + this.refreshedToken = refreshedToken; +// sharedPreferences.put + } + } + + //@TODO: Use preferences + public void addPushDeviceUsingStoredToken () { + Map pushDeviceData = new HashMap(); + pushDeviceData.put("regIdRequired", this.refreshedToken); + pushDeviceData.put("typeRequired", "android"); + apiHelper.apiService.addPushDevice(pushDeviceData); + } + + public void removePushDeviceUsingStoredToken () { + apiHelper.apiService.deletePushDevice(this.refreshedToken); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java index cf74940b9..37e2f01d2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java @@ -6,6 +6,7 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.preferences.AccountDetailsFragment; import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment; +import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment; import android.content.Context; import android.content.SharedPreferences; @@ -88,6 +89,10 @@ public class PrefsActivity extends BaseActivity implements if (preferenceScreen.getKey().equals("accountDetails")) { fragment = new AccountDetailsFragment(); } + + if (preferenceScreen.getKey().equals("pushNotifications")) { + fragment = new PushNotificationsPreferencesFragment(); + } return fragment; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 1498261ce..7238243e8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.prefs.TimePreference; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity; @@ -21,6 +22,8 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.util.Log; import java.util.Calendar; @@ -33,8 +36,11 @@ public class PreferencesFragment extends BasePreferencesFragment implements public APIHelper apiHelper; private Context context; private TimePreference timePreference; + private PreferenceScreen pushNotificationsPreference; private Preference classSelectionPreference; private HabitRPGUser user; + private PushNotificationManager pushNotificationManager; + private TransactionListener userTransactionListener = new TransactionListener() { @Override public void onResultReceived(HabitRPGUser habitRPGUser) { @@ -64,6 +70,7 @@ public class PreferencesFragment extends BasePreferencesFragment implements new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(userID)).async().querySingle(userTransactionListener); } + pushNotificationManager = PushNotificationManager.getInstance(this.getActivity()); } @Override @@ -72,6 +79,12 @@ public class PreferencesFragment extends BasePreferencesFragment implements boolean useReminder = getPreferenceManager().getSharedPreferences().getBoolean("use_reminder", false); timePreference.setEnabled(useReminder); + + pushNotificationsPreference = (PreferenceScreen) findPreference("pushNotifications"); + boolean userPushNotifications = getPreferenceManager().getSharedPreferences().getBoolean("usePushNotifications", true); + pushNotificationsPreference.setEnabled(userPushNotifications); + + classSelectionPreference = findPreference("choose_class"); classSelectionPreference.setVisible(false); } @@ -176,6 +189,15 @@ public class PreferencesFragment extends BasePreferencesFragment implements } else if (key.equals("reminder_time")) { removeNotifications(); scheduleNotifications(); + } else if (key.equals("usePushNotifications")) { + boolean userPushNotifications = sharedPreferences.getBoolean(key, false); + pushNotificationsPreference.setEnabled(userPushNotifications); + Log.v("test", "test"); + if (userPushNotifications) { + pushNotificationManager.addPushDeviceUsingStoredToken(); + } else { + pushNotificationManager.removePushDeviceUsingStoredToken(); + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java index ca67f2d3d..92f1074e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.java @@ -1,7 +1,31 @@ package com.habitrpg.android.habitica.ui.fragments.preferences; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.support.v7.preference.Preference; +import android.widget.Toast; + +import com.habitrpg.android.habitica.R; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + /** * Created by keithholliday on 6/27/16. */ -public class PushNotificationsPreferencesFragment { -} +public class PushNotificationsPreferencesFragment extends BasePreferencesFragment implements + SharedPreferences.OnSharedPreferenceChangeListener { + + @Override + protected void setupPreferences() { + + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 8a0a5f4ef..a2651304c 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -232,10 +232,17 @@ public interface ApiService { //Members URL @POST("members/send-private-message") Observable postPrivateMessage(@Body HashMap messageDetails); - + @GET("shops/{identifier}") Observable fetchShopInventory(@Path("identifier") String identifier); + //Push notifications + @POST("/user/push-devices") + Observable addPushDevice(@Body Map pushDeviceData); + + @DELETE("/user/push-devices/{regId}") + Observable deletePushDevice(@Path("regId") String regId); + //DEBUG: These calls only work on a local development server @POST("debug/add-ten-gems") From 9329def499947c87bfad3a966daa30222039aeb2 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Wed, 29 Jun 2016 11:56:51 -0500 Subject: [PATCH 04/43] Added notification factory. Added party invite notification --- .../HabiticaFirebaseMessagingService.java | 8 ++- .../HabiticaLocalNotification.java | 12 +++++ .../HabiticaLocalNotificationFactory.java | 22 ++++++++ .../PartyInviteLocalNotification.java | 38 ++++++++++++++ .../PushNotificationManager.java | 51 ++++++++++++++++--- .../preferences/PreferencesFragment.java | 1 - .../habitrpgwrapper/lib/api/ApiService.java | 4 +- 7 files changed, 122 insertions(+), 14 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java index 54a8a9318..3f092b72b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java @@ -11,11 +11,9 @@ import com.google.firebase.messaging.RemoteMessage; public class HabiticaFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { - // TODO(developer): Handle FCM messages here. - // If the application is in the foreground handle both data and notification messages here. - // Also if you intend on generating your own notifications as a result of a received FCM - // message, here is where that should be initiated. See sendNotification method below. - Log.d("test", "From: " + remoteMessage.getFrom()); Log.d("test", "Notification Message Body: " + remoteMessage.getNotification().getBody()); + + PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); + pushNotificationManager.displayNotification(remoteMessage); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java new file mode 100644 index 000000000..511923d9e --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java @@ -0,0 +1,12 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.content.Context; + +/** + * Created by keithholliday on 6/28/16. + */ +public interface HabiticaLocalNotification { + + void notifyLocally(Context context, String title, String message); + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java new file mode 100644 index 000000000..3ad79d3dc --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -0,0 +1,22 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +/** + * Created by keithholliday on 6/28/16. + */ +public class HabiticaLocalNotificationFactory { + + //use getShape method to get object of type shape + public HabiticaLocalNotification build(String notificationType){ + if(notificationType == null){ + return null; + } + + if(notificationType.equalsIgnoreCase("PARTY_INVITE_NOTIFICATION")){ + return new PartyInviteLocalNotification(); + + } + + return null; + } + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java new file mode 100644 index 000000000..e65f58a63 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -0,0 +1,38 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.support.v4.app.TaskStackBuilder; +import android.support.v7.app.NotificationCompat; +import android.util.Log; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity; + +/** + * Created by keithholliday on 6/28/16. + */ +public class PartyInviteLocalNotification implements HabiticaLocalNotification { + + public void notifyLocally(Context context, String title, String message) { + Intent intent = new Intent(context, PartyInviteActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), intent, 0); + + Notification notification = new Notification.Builder(context) + .setContentTitle(title) + .setContentText(message).setSmallIcon(R.drawable.ic_gryphon) + .setContentIntent(pendingIntent) + .addAction(R.drawable.ic_action_delete_white_24, "Accept", pendingIntent) + .addAction(R.drawable.ic_gryphon, "Reject", pendingIntent) + .build(); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notification.flags |= Notification.FLAG_AUTO_CANCEL; + + notificationManager.notify((int) System.currentTimeMillis(), notification); + } + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 1057ebd9b..8146e953f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -3,9 +3,13 @@ package com.habitrpg.android.habitica.helpers.notifications; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import android.util.Log; +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.messaging.RemoteMessage; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import java.util.HashMap; import java.util.Map; @@ -25,6 +29,7 @@ public class PushNotificationManager { private String refreshedToken; private SharedPreferences sharedPreferences; + private Context context; protected PushNotificationManager(Context context) { HabiticaApplication.getInstance(context).getComponent().inject(this); @@ -35,25 +40,59 @@ public class PushNotificationManager { if(instance == null) { instance = new PushNotificationManager(context); } + + instance.context = context; + return instance; } public void setRefreshedToken (String refreshedToken) { if (this.refreshedToken == null) { - this.refreshedToken = refreshedToken; -// sharedPreferences.put + return; } + this.refreshedToken = refreshedToken; +// sharedPreferences.put } //@TODO: Use preferences public void addPushDeviceUsingStoredToken () { + if (this.refreshedToken == null) { + this.refreshedToken = FirebaseInstanceId.getInstance().getToken(); + } + + if (this.refreshedToken == null) { + return; + } + Map pushDeviceData = new HashMap(); - pushDeviceData.put("regIdRequired", this.refreshedToken); - pushDeviceData.put("typeRequired", "android"); - apiHelper.apiService.addPushDevice(pushDeviceData); + pushDeviceData.put("regId", this.refreshedToken); + pushDeviceData.put("type", "android"); + apiHelper.apiService.addPushDevice(pushDeviceData) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); } public void removePushDeviceUsingStoredToken () { - apiHelper.apiService.deletePushDevice(this.refreshedToken); + apiHelper.apiService.deletePushDevice(this.refreshedToken) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + } + + public void displayNotification (RemoteMessage remoteMessage) { + HabiticaLocalNotificationFactory notificationFactory = new HabiticaLocalNotificationFactory(); + HabiticaLocalNotification notification = notificationFactory.build("PARTY_INVITE_NOTIFICATION"); + if (userIsSubscribedToNotificationType("PARTY_INVITE_NOTIFICATION") && notification != null) { + notification.notifyLocally(this.context, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); + } + } + + private boolean userIsSubscribedToNotificationType(String type) { + String key = ""; + + if (type.equals("PARTY_INVITE_NOTIFICATION")) { + key = "preference_push_invited_to_party"; + } + + return sharedPreferences.getBoolean(key, true); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 7238243e8..72bfc2cf7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -192,7 +192,6 @@ public class PreferencesFragment extends BasePreferencesFragment implements } else if (key.equals("usePushNotifications")) { boolean userPushNotifications = sharedPreferences.getBoolean(key, false); pushNotificationsPreference.setEnabled(userPushNotifications); - Log.v("test", "test"); if (userPushNotifications) { pushNotificationManager.addPushDeviceUsingStoredToken(); } else { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index a2651304c..f51208e2c 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -237,10 +237,10 @@ public interface ApiService { Observable fetchShopInventory(@Path("identifier") String identifier); //Push notifications - @POST("/user/push-devices") + @POST("user/push-devices") Observable addPushDevice(@Body Map pushDeviceData); - @DELETE("/user/push-devices/{regId}") + @DELETE("user/push-devices/{regId}") Observable deletePushDevice(@Path("regId") String regId); //DEBUG: These calls only work on a local development server From dd366a8337fc6b2bfb6b6510cbc5f3cb44cfbeea Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 30 Jun 2016 17:02:26 -0500 Subject: [PATCH 05/43] Added reciever for responding to local noitfication actions --- Habitica/AndroidManifest.xml | 7 +++ Habitica/res/values/strings.xml | 5 ++ .../habitica/components/AppComponent.java | 2 + .../PartyInviteLocalNotification.java | 52 +++++++++++----- .../LocalNotificationActionReceiver.java | 59 +++++++++++++++++++ .../habitrpgwrapper/lib/api/ApiService.java | 3 + 6 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 4792a630d..15f767a52 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -122,6 +122,13 @@ + + + + + + + diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 7589f7f26..a80079ffc 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -374,4 +374,9 @@ To start, which parts of your life do you want to improve? hourglasses gold gold + + + ACCEPT_PARTY_INVITE + ACCEPT_PARTY_INVITE + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 52224eaee..988db627a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.modules.ApiModule; import com.habitrpg.android.habitica.modules.AppModule; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.ui.activities.AboutActivity; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; import com.habitrpg.android.habitica.ui.activities.GroupFormActivity; @@ -160,4 +161,5 @@ public interface AppComponent { void inject(PushNotificationManager pushNotificationManager); + void inject(LocalNotificationActionReceiver localNotificationActionReceiver); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java index e65f58a63..1b65d94e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -5,12 +5,16 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.support.v4.app.TaskStackBuilder; -import android.support.v7.app.NotificationCompat; +import android.content.res.Resources; +import android.media.RingtoneManager; +import android.net.Uri; + +import android.support.v4.app.NotificationCompat; import android.util.Log; import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; +import com.habitrpg.android.habitica.ui.activities.MainActivity; /** * Created by keithholliday on 6/28/16. @@ -18,21 +22,41 @@ import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity; public class PartyInviteLocalNotification implements HabiticaLocalNotification { public void notifyLocally(Context context, String title, String message) { - Intent intent = new Intent(context, PartyInviteActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), intent, 0); - Notification notification = new Notification.Builder(context) + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) .setContentTitle(title) - .setContentText(message).setSmallIcon(R.drawable.ic_gryphon) - .setContentIntent(pendingIntent) - .addAction(R.drawable.ic_action_delete_white_24, "Accept", pendingIntent) - .addAction(R.drawable.ic_gryphon, "Reject", pendingIntent) - .build(); + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Resources res = context.getResources(); + + Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); + acceptInviteIntent.setAction(res.getString(R.string.accept_party_invite)); + PendingIntent pendingIntentAccept = PendingIntent.getBroadcast( + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + + Intent rejectInviteIntent = new Intent(); + rejectInviteIntent.setAction(res.getString(R.string.reject_party_invite)); + PendingIntent pendingIntentReject = PendingIntent.getBroadcast( + context, + 2000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notification.flags |= Notification.FLAG_AUTO_CANCEL; - - notificationManager.notify((int) System.currentTimeMillis(), notification); + notificationManager.notify(10, notificationBuilder.build()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java new file mode 100644 index 000000000..3cd526c9e --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -0,0 +1,59 @@ +package com.habitrpg.android.habitica.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.util.Log; + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; + +import javax.inject.Inject; + +/** + * Created by keithholliday on 6/30/16. + */ +public class LocalNotificationActionReceiver extends BroadcastReceiver implements HabitRPGUserCallback.OnUserReceived { + @Inject + public APIHelper apiHelper; + + private HabitRPGUser user; + private String action; + private Resources resources; + + @Override + public void onReceive(Context context, Intent arg1) { + HabiticaApplication.getInstance(context).getComponent().inject(this); + this.resources = context.getResources(); + + this.action = arg1.getAction(); + + this.apiHelper.apiService.getUser() + .compose(this.apiHelper.configureApiCallObserver()) + .subscribe(new HabitRPGUserCallback(this), throwable -> {}); + } + + @Override + public void onUserReceived(HabitRPGUser user) { + this.user = user; + this.handleLocalNotificationAction(action); + } + + private void handleLocalNotificationAction(String action) { + //@TODO: This is a good place for a factory and event emitter pattern + + if (action.equals(this.resources.getString(R.string.accept_party_invite))) { + apiHelper.apiService.joinGroup("party") + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + } else if (action.equals(this.resources.getString(R.string.reject_party_invite))) { + apiHelper.apiService.rejectGroupInvite("party") + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + } + } +} diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index f51208e2c..aed129702 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -205,6 +205,9 @@ public interface ApiService { @POST("groups/{gid}/invite") Observable inviteToGroup(@Path("gid") String groupId, @Body Map inviteData); + @POST("groups/{gid}/reject-invite") + Observable rejectGroupInvite(@Path("gid") String groupId); + @POST("groups/{gid}/quests/accept") Observable acceptQuest(@Path("gid") String groupId); From abe2a3a34d60dba7788d7a21374d0cf83ae80207 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 1 Jul 2016 13:14:43 -0500 Subject: [PATCH 06/43] Added push notification fore received a priavate message --- .../HabiticaLocalNotificationFactory.java | 5 ++- .../PushNotificationManager.java | 14 ++++-- ...ceivedPrivateMessageLocalNotification.java | 44 +++++++++++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java index 3ad79d3dc..e6dbe0c06 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -11,9 +11,10 @@ public class HabiticaLocalNotificationFactory { return null; } - if(notificationType.equalsIgnoreCase("PARTY_INVITE_NOTIFICATION")){ + if (notificationType.equalsIgnoreCase(PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY)) { return new PartyInviteLocalNotification(); - + } else if (notificationType.contains(PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY)) { + return new ReceivedPrivateMessageLocalNotification(); } return null; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 8146e953f..aaa1a3cfc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -23,6 +23,8 @@ public class PushNotificationManager { private static PushNotificationManager instance = null; private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; + public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; + public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from test33@test.com:"; @Inject public APIHelper apiHelper; @@ -80,8 +82,8 @@ public class PushNotificationManager { public void displayNotification (RemoteMessage remoteMessage) { HabiticaLocalNotificationFactory notificationFactory = new HabiticaLocalNotificationFactory(); - HabiticaLocalNotification notification = notificationFactory.build("PARTY_INVITE_NOTIFICATION"); - if (userIsSubscribedToNotificationType("PARTY_INVITE_NOTIFICATION") && notification != null) { + HabiticaLocalNotification notification = notificationFactory.build(remoteMessage.getNotification().getBody()); + if (userIsSubscribedToNotificationType(remoteMessage.getNotification().getBody()) && notification != null) { notification.notifyLocally(this.context, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); } } @@ -89,10 +91,16 @@ public class PushNotificationManager { private boolean userIsSubscribedToNotificationType(String type) { String key = ""; - if (type.equals("PARTY_INVITE_NOTIFICATION")) { + //@TODO: If user has push turned off to send + + if (type.equals(PARTY_INVITE_PUSH_NOTIFICATION_KEY)) { key = "preference_push_invited_to_party"; } + if (type.contains(RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_received_a_private_message"; + } + return sharedPreferences.getBoolean(key, true); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java new file mode 100644 index 000000000..89e966f2e --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java @@ -0,0 +1,44 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/1/16. + */ +public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} From c580a6ad9a39f9b70d8d73ee7031233e4ecd1921 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 1 Jul 2016 13:26:49 -0500 Subject: [PATCH 07/43] Added received gems gift notification. Added quest begun notification class --- .../HabiticaLocalNotificationFactory.java | 2 + .../PushNotificationManager.java | 7 ++-- .../QuestsBegunLocalNotification.java | 42 +++++++++++++++++++ .../ReceivedGemsGiftLocalNotification.java | 42 +++++++++++++++++++ 4 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java index e6dbe0c06..c83ef55f6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -15,6 +15,8 @@ public class HabiticaLocalNotificationFactory { return new PartyInviteLocalNotification(); } else if (notificationType.contains(PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY)) { return new ReceivedPrivateMessageLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.RECEIVED_GEMS_PUSH_NOTIFICATION_KEY)) { + return new ReceivedGemsGiftLocalNotification(); } return null; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index aaa1a3cfc..914b4821a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -25,6 +25,7 @@ public class PushNotificationManager { private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from test33@test.com:"; + public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; @Inject public APIHelper apiHelper; @@ -95,10 +96,10 @@ public class PushNotificationManager { if (type.equals(PARTY_INVITE_PUSH_NOTIFICATION_KEY)) { key = "preference_push_invited_to_party"; - } - - if (type.contains(RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY)) { + } else if (type.contains(RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY)) { key = "preference_push_received_a_private_message"; + } else if (type.contains(RECEIVED_GEMS_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_gifted_gems"; } return sharedPreferences.getBoolean(key, true); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java new file mode 100644 index 000000000..adaf2270d --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java @@ -0,0 +1,42 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/1/16. + */ +public class QuestsBegunLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java new file mode 100644 index 000000000..576be24f0 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java @@ -0,0 +1,42 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/1/16. + */ +public class ReceivedGemsGiftLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} From 1c45ee87cc3d3170da1102590a9e9b2dfe00d14e Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 1 Jul 2016 13:30:24 -0500 Subject: [PATCH 08/43] Added receive gift subscription notification --- .../HabiticaLocalNotificationFactory.java | 2 + .../PushNotificationManager.java | 3 ++ ...ivedSubscriptionGiftLocalNotification.java | 42 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java index c83ef55f6..c5da1e695 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -17,6 +17,8 @@ public class HabiticaLocalNotificationFactory { return new ReceivedPrivateMessageLocalNotification(); } else if (notificationType.contains(PushNotificationManager.RECEIVED_GEMS_PUSH_NOTIFICATION_KEY)) { return new ReceivedGemsGiftLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY)) { + return new ReceivedSubscriptionGiftLocalNotification(); } return null; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 914b4821a..fbfc9d612 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -26,6 +26,7 @@ public class PushNotificationManager { public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from test33@test.com:"; public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; + public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; @Inject public APIHelper apiHelper; @@ -100,6 +101,8 @@ public class PushNotificationManager { key = "preference_push_received_a_private_message"; } else if (type.contains(RECEIVED_GEMS_PUSH_NOTIFICATION_KEY)) { key = "preference_push_gifted_gems"; + } else if (type.contains(RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_gifted_subscription"; } return sharedPreferences.getBoolean(key, true); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java new file mode 100644 index 000000000..553ce5796 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java @@ -0,0 +1,42 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/1/16. + */ +public class ReceivedSubscriptionGiftLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} From c834d020ac0beb68cc0216c4f5aa03dff47e8ac5 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 1 Jul 2016 14:20:42 -0500 Subject: [PATCH 09/43] Added quest begun, invite to party and invite to guild local notifications --- Habitica/res/values/strings.xml | 6 +- .../GuildInviteLocalNotification.java | 56 +++++++++++++++++++ .../HabiticaLocalNotificationFactory.java | 6 ++ .../PushNotificationManager.java | 11 +++- .../QuestBegunLocalNotification.java | 42 ++++++++++++++ .../QuestInviteLocalNotification.java | 56 +++++++++++++++++++ 6 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index a80079ffc..f8ea6fd5a 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -377,6 +377,10 @@ To start, which parts of your life do you want to improve? ACCEPT_PARTY_INVITE - ACCEPT_PARTY_INVITE + REJECT_PARTY_INVITE + ACCEPT_GUILD_INVITE + REJECT_GUILD_INVITE + ACCEPT_QUEST_INVITE + REJECT_QUEST_INVITE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java new file mode 100644 index 000000000..b259874ab --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java @@ -0,0 +1,56 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; + +/** + * Created by keithholliday on 7/1/16. + */ +public class GuildInviteLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Resources res = context.getResources(); + + Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); + acceptInviteIntent.setAction(res.getString(R.string.accept_guild_invite)); + PendingIntent pendingIntentAccept = PendingIntent.getBroadcast( + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + + Intent rejectInviteIntent = new Intent(); + rejectInviteIntent.setAction(res.getString(R.string.reject_guild_invite)); + PendingIntent pendingIntentReject = PendingIntent.getBroadcast( + context, + 2000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java index c5da1e695..9cc361ed4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -19,6 +19,12 @@ public class HabiticaLocalNotificationFactory { return new ReceivedGemsGiftLocalNotification(); } else if (notificationType.contains(PushNotificationManager.RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY)) { return new ReceivedSubscriptionGiftLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY)) { + return new GuildInviteLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY)) { + return new QuestInviteLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY)) { + return new QuestBegunLocalNotification(); } return null; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index fbfc9d612..d3cf80124 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -24,9 +24,12 @@ public class PushNotificationManager { private static PushNotificationManager instance = null; private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; - public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from test33@test.com:"; + public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from"; public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; + public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "Guild"; + public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "Quest Invitation"; + public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "Your Quest has Begun"; @Inject public APIHelper apiHelper; @@ -103,6 +106,12 @@ public class PushNotificationManager { key = "preference_push_gifted_gems"; } else if (type.contains(RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY)) { key = "preference_push_gifted_subscription"; + } else if (type.contains(GUILD_INVITE_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_invited_to_guild"; + } else if (type.contains(QUEST_INVITE_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_invited_to_quest"; + } else if (type.contains(QUEST_BEGUN_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_your_quest_has_begun"; } return sharedPreferences.getBoolean(key, true); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java new file mode 100644 index 000000000..579382076 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java @@ -0,0 +1,42 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/1/16. + */ +public class QuestBegunLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java new file mode 100644 index 000000000..1dbb43639 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -0,0 +1,56 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; + +/** + * Created by keithholliday on 7/1/16. + */ +public class QuestInviteLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Resources res = context.getResources(); + + Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); + acceptInviteIntent.setAction(res.getString(R.string.accept_quest_invite)); + PendingIntent pendingIntentAccept = PendingIntent.getBroadcast( + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + + Intent rejectInviteIntent = new Intent(); + rejectInviteIntent.setAction(res.getString(R.string.reject_quest_invite)); + PendingIntent pendingIntentReject = PendingIntent.getBroadcast( + context, + 2000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} From fa4e49abcaf32dbea361fcded197c4dbe0a2c117 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 10:19:59 -0500 Subject: [PATCH 10/43] Subscribe on token refresh --- .../helpers/notifications/PushNotificationManager.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index d3cf80124..2e93b9bdb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -57,8 +57,12 @@ public class PushNotificationManager { if (this.refreshedToken == null) { return; } + this.refreshedToken = refreshedToken; -// sharedPreferences.put + + if (this.userIsSubscribedToNotifications()) { + this.addPushDeviceUsingStoredToken(); + } } //@TODO: Use preferences @@ -93,6 +97,10 @@ public class PushNotificationManager { } } + private boolean userIsSubscribedToNotifications() { + return sharedPreferences.getBoolean("pushNotifications", true); + } + private boolean userIsSubscribedToNotificationType(String type) { String key = ""; From 0883cab950433c0267250a4c796d139d0686f788 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 11:29:29 -0500 Subject: [PATCH 11/43] Added invitations to user model --- .../HabiticaFirebaseInstanceIDService.java | 1 - .../HabiticaFirebaseMessagingService.java | 1 + .../lib/models/HabitRPGUser.java | 18 +++++ .../lib/models/invitations/GuildInvite.java | 76 +++++++++++++++++++ .../lib/models/invitations/Invitations.java | 71 +++++++++++++++++ .../lib/models/invitations/PartyInvite.java | 73 ++++++++++++++++++ 6 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/GuildInvite.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/PartyInvite.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java index 7b07087ec..c9504930a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseInstanceIDService.java @@ -23,7 +23,6 @@ public class HabiticaFirebaseInstanceIDService extends FirebaseInstanceIdService pushNotificationManager = PushNotificationManager.getInstance(this); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); pushNotificationManager.setRefreshedToken(refreshedToken); - Log.d("test", "Refreshed token: " + refreshedToken); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java index 3f092b72b..d5c4d7c4a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java @@ -12,6 +12,7 @@ public class HabiticaFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d("test", "Notification Message Body: " + remoteMessage.getNotification().getBody()); + Log.d("test", "Notification Message Body: " + remoteMessage.getData().toString()); PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); pushNotificationManager.displayNotification(remoteMessage); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 211d0ee4a..eea72813f 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName; import com.habitrpg.android.habitica.HabitDatabase; import com.habitrpg.android.habitica.ui.AvatarView; +import com.magicmicky.habitrpgwrapper.lib.models.invitations.Invitations; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TasksOrder; import com.raizlabs.android.dbflow.annotation.Column; @@ -92,6 +93,12 @@ public class HabitRPGUser extends BaseModel { foreignColumnName = "user_id")}) private ContributorInfo contributor; + @Column + @ForeignKey(references = {@ForeignKeyReference(columnName = "invitations_id", + columnType = String.class, + foreignColumnName = "user_id")}) + private Invitations invitations; + private Purchases purchased; private TasksOrder tasksOrder; @@ -137,6 +144,7 @@ public class HabitRPGUser extends BaseModel { this.profile = profile; } +<<<<<<< e956287345a142dd1171f260872d6f1813f43d22 public ContributorInfo getContributor() { return contributor; } @@ -145,6 +153,13 @@ public class HabitRPGUser extends BaseModel { this.contributor = contributor; } + public Invitations getInvitations() { + return invitations; + } + + public void setInvitations(Invitations invitations) { + this.invitations = invitations; + } public UserParty getParty() { return party; @@ -293,6 +308,9 @@ public class HabitRPGUser extends BaseModel { authentication.user_id = id; flags.user_id = id; if (contributor != null) { contributor.user_id = id; } + contributor.user_id = id; + invitations.user_id = id; + ArrayList allTasks = new ArrayList(); if (dailys != null) { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/GuildInvite.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/GuildInvite.java new file mode 100644 index 000000000..e3d1a7291 --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/GuildInvite.java @@ -0,0 +1,76 @@ +package com.magicmicky.habitrpgwrapper.lib.models.invitations; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by keithholliday on 7/2/16. + */ +public class GuildInvite { + + @SerializedName("inviter") + @Expose + private String inviter; + + @SerializedName("name") + @Expose + private String name; + + @SerializedName("id") + @Expose + private String id; + + /** + * + * @return + * The inviter + */ + public String getInviter() { + return inviter; + } + + /** + * + * @param inviter + * The inviter + */ + public void setInviter(String inviter) { + this.inviter = inviter; + } + + /** + * + * @return + * The name + */ + public String getName() { + return name; + } + + /** + * + * @param name + * The name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + * The id + */ + public String getId() { + return id; + } + + /** + * + * @param id + * The id + */ + public void setId(String id) { + this.id = id; + } +} diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java new file mode 100644 index 000000000..64dcf9c98 --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java @@ -0,0 +1,71 @@ +package com.magicmicky.habitrpgwrapper.lib.models.invitations; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.habitrpg.android.habitica.HabitDatabase; +import com.magicmicky.habitrpgwrapper.lib.models.invitations.PartyInvite; +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.NotNull; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.structure.BaseModel; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Created by keithholliday on 7/2/16. + */ +@Table(databaseName = HabitDatabase.NAME) +public class Invitations extends BaseModel { + + @Column + @PrimaryKey + @NotNull + public String user_id; + + @SerializedName("party") + @Expose + private Map party; + + @SerializedName("guilds") + @Expose + private List guilds = new ArrayList(); + + /** + * + * @return + * The party invite + */ + public Map getParty() { + return party; + } + + /** + * + * @param party + * The party + */ + public void setParty(Map party) { + this.party = party; + } + + /** + * + * @return + * The guilds invite + */ + public List getGuilds() { + return guilds; + } + + /** + * + * @param guilds + * The guilds + */ + public void setGuilds(List guilds) { + this.guilds = guilds; + } +} diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/PartyInvite.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/PartyInvite.java new file mode 100644 index 000000000..05bb1e08c --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/PartyInvite.java @@ -0,0 +1,73 @@ +package com.magicmicky.habitrpgwrapper.lib.models.invitations; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by keithholliday on 7/2/16. + */ +public class PartyInvite { + @SerializedName("id") + @Expose + private String id; + @SerializedName("name") + @Expose + private String name; + @SerializedName("inviter") + @Expose + private String inviter; + + /** + * + * @return + * The id + */ + public String getId() { + return id; + } + + /** + * + * @param id + * The id + */ + public void setId(String id) { + this.id = id; + } + + /** + * + * @return + * The name + */ + public String getName() { + return name; + } + + /** + * + * @param name + * The name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + * The inviter + */ + public String getInviter() { + return inviter; + } + + /** + * + * @param inviter + * The inviter + */ + public void setInviter(String inviter) { + this.inviter = inviter; + } +} From 59bf3f9b807bfdb6fe8d4bd83de9f2ffedc9973f Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 11:45:19 -0500 Subject: [PATCH 12/43] Added party notification actions --- .../receivers/LocalNotificationActionReceiver.java | 8 ++++++-- .../lib/models/invitations/Invitations.java | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index 3cd526c9e..04ea865af 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -47,11 +47,15 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement //@TODO: This is a good place for a factory and event emitter pattern if (action.equals(this.resources.getString(R.string.accept_party_invite))) { - apiHelper.apiService.joinGroup("party") + if (this.user.getInvitations().getParty() == null) return; + String partyId = this.user.getInvitations().getParty().getId(); + apiHelper.apiService.joinGroup(partyId) .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); } else if (action.equals(this.resources.getString(R.string.reject_party_invite))) { - apiHelper.apiService.rejectGroupInvite("party") + if (this.user.getInvitations().getParty() == null) return; + String partyId = this.user.getInvitations().getParty().getId(); + apiHelper.apiService.rejectGroupInvite(partyId) .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java index 64dcf9c98..d09fda0e8 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/invitations/Invitations.java @@ -27,7 +27,7 @@ public class Invitations extends BaseModel { @SerializedName("party") @Expose - private Map party; + private PartyInvite party; @SerializedName("guilds") @Expose @@ -38,7 +38,7 @@ public class Invitations extends BaseModel { * @return * The party invite */ - public Map getParty() { + public PartyInvite getParty() { return party; } @@ -47,7 +47,7 @@ public class Invitations extends BaseModel { * @param party * The party */ - public void setParty(Map party) { + public void setParty(PartyInvite party) { this.party = party; } From 057b734ee5a39aab04224b9a4d5c7ba194b9deec Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 13:11:35 -0500 Subject: [PATCH 13/43] Added use of push identifier --- .../helpers/notifications/PushNotificationManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 2e93b9bdb..70c0ae5fa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -24,11 +24,11 @@ public class PushNotificationManager { private static PushNotificationManager instance = null; private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; - public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "New Message from"; + public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "newPM"; public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "Guild"; - public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "Quest Invitation"; + public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "questInvitation"; public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "Your Quest has Begun"; @Inject @@ -90,9 +90,11 @@ public class PushNotificationManager { } public void displayNotification (RemoteMessage remoteMessage) { + String remoteMessageIdentifier = remoteMessage.getData().get("identifier"); + HabiticaLocalNotificationFactory notificationFactory = new HabiticaLocalNotificationFactory(); - HabiticaLocalNotification notification = notificationFactory.build(remoteMessage.getNotification().getBody()); - if (userIsSubscribedToNotificationType(remoteMessage.getNotification().getBody()) && notification != null) { + HabiticaLocalNotification notification = notificationFactory.build(remoteMessageIdentifier); + if (userIsSubscribedToNotificationType(remoteMessageIdentifier) && notification != null) { notification.notifyLocally(this.context, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); } } From a020bd6f2d696c47d2084d035a604e1440ceed31 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 13:35:38 -0500 Subject: [PATCH 14/43] Added quest actions --- Habitica/AndroidManifest.xml | 2 ++ .../HabiticaFirebaseMessagingService.java | 2 +- .../notifications/PushNotificationManager.java | 2 +- .../QuestInviteLocalNotification.java | 4 ++-- .../receivers/LocalNotificationActionReceiver.java | 14 +++++++++++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 15f767a52..4741a895f 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -127,6 +127,8 @@ + + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java index d5c4d7c4a..5a21f5e97 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java @@ -12,7 +12,7 @@ public class HabiticaFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d("test", "Notification Message Body: " + remoteMessage.getNotification().getBody()); - Log.d("test", "Notification Message Body: " + remoteMessage.getData().toString()); + Log.d("test", "Notification Message Body: " + remoteMessage.getData().get("identifier")); PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); pushNotificationManager.displayNotification(remoteMessage); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 70c0ae5fa..f84820933 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -29,7 +29,7 @@ public class PushNotificationManager { public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "Guild"; public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "questInvitation"; - public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "Your Quest has Begun"; + public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "questStarted"; @Inject public APIHelper apiHelper; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java index 1dbb43639..0273f38a7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -40,12 +40,12 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); - Intent rejectInviteIntent = new Intent(); + Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_quest_invite)); PendingIntent pendingIntentReject = PendingIntent.getBroadcast( context, 2000, - acceptInviteIntent, + rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index 04ea865af..d3305e265 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -45,7 +45,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private void handleLocalNotificationAction(String action) { //@TODO: This is a good place for a factory and event emitter pattern - + Log.v("test", action); if (action.equals(this.resources.getString(R.string.accept_party_invite))) { if (this.user.getInvitations().getParty() == null) return; String partyId = this.user.getInvitations().getParty().getId(); @@ -58,6 +58,18 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement apiHelper.apiService.rejectGroupInvite(partyId) .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); + } else if (action.equals(this.resources.getString(R.string.accept_quest_invite))) { + if (this.user.getParty() == null) return; + String partyId = this.user.getParty().getId(); + apiHelper.apiService.acceptQuest(partyId) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + } else if (action.equals(this.resources.getString(R.string.reject_quest_invite))) { + if (this.user.getParty() == null) return; + String partyId = this.user.getParty().getId(); + apiHelper.apiService.rejectQuest(partyId) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); } } } From eaed54db57925bfa062ec6b981fd8c3e8142b2f3 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 13:44:47 -0500 Subject: [PATCH 15/43] Added won a challenge local notification --- .../HabiticaLocalNotificationFactory.java | 2 + .../PushNotificationManager.java | 4 ++ .../WonChallengeLocalNotification.java | 42 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java index 9cc361ed4..3abb8db9d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.java @@ -25,6 +25,8 @@ public class HabiticaLocalNotificationFactory { return new QuestInviteLocalNotification(); } else if (notificationType.contains(PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY)) { return new QuestBegunLocalNotification(); + } else if (notificationType.contains(PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY)) { + return new WonChallengeLocalNotification(); } return null; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index f84820933..be38aec8d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -30,6 +30,8 @@ public class PushNotificationManager { public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "Guild"; public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "questInvitation"; public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "questStarted"; + public static String WON_CHALLENGE_PUSH_NOTIFICATION_KEY = "wonChallenge"; + @Inject public APIHelper apiHelper; @@ -122,6 +124,8 @@ public class PushNotificationManager { key = "preference_push_invited_to_quest"; } else if (type.contains(QUEST_BEGUN_PUSH_NOTIFICATION_KEY)) { key = "preference_push_your_quest_has_begun"; + } else if (type.contains(WON_CHALLENGE_PUSH_NOTIFICATION_KEY)) { + key = "preference_push_you_won_challenge"; } return sharedPreferences.getBoolean(key, true); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java new file mode 100644 index 000000000..8b30869bd --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java @@ -0,0 +1,42 @@ +package com.habitrpg.android.habitica.helpers.notifications; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; + +/** + * Created by keithholliday on 7/2/16. + */ +public class WonChallengeLocalNotification implements HabiticaLocalNotification { + @Override + public void notifyLocally(Context context, String title, String message) { + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + NotificationCompat.Builder notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + 3000, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + notificationBuilder.setContentIntent(pendingIntent); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } +} From cad531936aa1a05bc98e6c5e4b228eb532c1ed6e Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 2 Jul 2016 14:25:38 -0500 Subject: [PATCH 16/43] Added guild invite actions --- .../GuildInviteLocalNotification.java | 17 +++++++++++++-- .../HabiticaFirebaseMessagingService.java | 2 +- .../HabiticaLocalNotification.java | 3 +++ .../PartyInviteLocalNotification.java | 7 +++++++ .../PushNotificationManager.java | 4 ++-- .../QuestBegunLocalNotification.java | 7 +++++++ .../QuestInviteLocalNotification.java | 7 +++++++ .../QuestsBegunLocalNotification.java | 7 +++++++ .../ReceivedGemsGiftLocalNotification.java | 7 +++++++ ...ceivedPrivateMessageLocalNotification.java | 7 +++++++ ...ivedSubscriptionGiftLocalNotification.java | 7 +++++++ .../WonChallengeLocalNotification.java | 7 +++++++ .../LocalNotificationActionReceiver.java | 21 +++++++++++++++++-- 13 files changed, 96 insertions(+), 7 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java index b259874ab..5bc9f5307 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java @@ -7,15 +7,21 @@ import android.content.Intent; import android.content.res.Resources; import android.media.RingtoneManager; import android.net.Uri; +import android.os.Bundle; import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ public class GuildInviteLocalNotification implements HabiticaLocalNotification { + + private Map data; + @Override public void notifyLocally(Context context, String title, String message) { Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); @@ -32,6 +38,7 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); acceptInviteIntent.setAction(res.getString(R.string.accept_guild_invite)); + acceptInviteIntent.putExtra("groupID", this.data.get("groupID")); PendingIntent pendingIntentAccept = PendingIntent.getBroadcast( context, 3000, @@ -40,12 +47,13 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); - Intent rejectInviteIntent = new Intent(); + Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_guild_invite)); + rejectInviteIntent.putExtra("groupID", this.data.get("groupID")); PendingIntent pendingIntentReject = PendingIntent.getBroadcast( context, 2000, - acceptInviteIntent, + rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); @@ -53,4 +61,9 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + this.data = data; + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java index 5a21f5e97..c640998bc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java @@ -12,7 +12,7 @@ public class HabiticaFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d("test", "Notification Message Body: " + remoteMessage.getNotification().getBody()); - Log.d("test", "Notification Message Body: " + remoteMessage.getData().get("identifier")); + Log.d("test", "Notification Message Body: " + remoteMessage.getData()); PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); pushNotificationManager.displayNotification(remoteMessage); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java index 511923d9e..686e3d281 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java @@ -2,6 +2,8 @@ package com.habitrpg.android.habitica.helpers.notifications; import android.content.Context; +import java.util.Map; + /** * Created by keithholliday on 6/28/16. */ @@ -9,4 +11,5 @@ public interface HabiticaLocalNotification { void notifyLocally(Context context, String title, String message); + void setExtras(Map data); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java index 1b65d94e0..a50200dfe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -16,6 +16,8 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 6/28/16. */ @@ -59,4 +61,9 @@ public class PartyInviteLocalNotification implements HabiticaLocalNotification { notificationManager.notify(10, notificationBuilder.build()); } + @Override + public void setExtras(Map data) { + + } + } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index be38aec8d..3caeb1b99 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -22,12 +22,11 @@ import javax.inject.Inject; public class PushNotificationManager { private static PushNotificationManager instance = null; - private static String DEVICE_TOKEN_PREFERENCE_STRING = "device-token-preference-string"; public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "newPM"; public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; - public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "Guild"; + public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "invitedGuild"; public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "questInvitation"; public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "questStarted"; public static String WON_CHALLENGE_PUSH_NOTIFICATION_KEY = "wonChallenge"; @@ -97,6 +96,7 @@ public class PushNotificationManager { HabiticaLocalNotificationFactory notificationFactory = new HabiticaLocalNotificationFactory(); HabiticaLocalNotification notification = notificationFactory.build(remoteMessageIdentifier); if (userIsSubscribedToNotificationType(remoteMessageIdentifier) && notification != null) { + notification.setExtras(remoteMessage.getData()); notification.notifyLocally(this.context, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java index 579382076..41023b89d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java @@ -11,6 +11,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -39,4 +41,9 @@ public class QuestBegunLocalNotification implements HabiticaLocalNotification { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java index 0273f38a7..d3d1a41dc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -12,6 +12,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -53,4 +55,9 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java index adaf2270d..8c90b6664 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java @@ -11,6 +11,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -39,4 +41,9 @@ public class QuestsBegunLocalNotification implements HabiticaLocalNotification { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java index 576be24f0..63fe5658b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java @@ -11,6 +11,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -39,4 +41,9 @@ public class ReceivedGemsGiftLocalNotification implements HabiticaLocalNotificat NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java index 89e966f2e..576164279 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java @@ -13,6 +13,8 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -41,4 +43,9 @@ public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNot NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java index 553ce5796..3bbf54958 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java @@ -11,6 +11,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/1/16. */ @@ -39,4 +41,9 @@ public class ReceivedSubscriptionGiftLocalNotification implements HabiticaLocalN NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java index 8b30869bd..3912414dc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java @@ -11,6 +11,8 @@ import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.MainActivity; +import java.util.Map; + /** * Created by keithholliday on 7/2/16. */ @@ -39,4 +41,9 @@ public class WonChallengeLocalNotification implements HabiticaLocalNotification NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); } + + @Override + public void setExtras(Map data) { + + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index d3305e265..a60882035 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.os.Bundle; import android.util.Log; import com.habitrpg.android.habitica.APIHelper; @@ -24,13 +25,15 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private HabitRPGUser user; private String action; private Resources resources; + private Intent intent; @Override - public void onReceive(Context context, Intent arg1) { + public void onReceive(Context context, Intent intent) { HabiticaApplication.getInstance(context).getComponent().inject(this); this.resources = context.getResources(); - this.action = arg1.getAction(); + this.action = intent.getAction(); + this.intent = intent; this.apiHelper.apiService.getUser() .compose(this.apiHelper.configureApiCallObserver()) @@ -70,6 +73,20 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement apiHelper.apiService.rejectQuest(partyId) .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); + } else if (action.equals(this.resources.getString(R.string.accept_guild_invite))) { + Bundle extras = this.intent.getExtras(); + String guildId = extras.getString("groupID"); + if (guildId == null) return; + apiHelper.apiService.joinGroup(guildId) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + } else if (action.equals(this.resources.getString(R.string.reject_guild_invite))) { + Bundle extras = this.intent.getExtras(); + String guildId = extras.getString("groupID"); + if (guildId == null) return; + apiHelper.apiService.rejectGroupInvite(guildId) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); } } } From 31f4ea6c0d7acff90845658983c834a8ada27a6a Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 3 Jul 2016 11:12:27 -0500 Subject: [PATCH 17/43] Ensured user gets subscribed to notification --- .../PushNotificationManager.java | 11 ++++- ...ceivedPrivateMessageLocalNotification.java | 9 +++- .../LocalNotificationActionReceiver.java | 7 ++- .../habitica/ui/activities/LoginActivity.java | 48 +++++++++++++++++++ .../habitica/ui/activities/MainActivity.java | 4 ++ 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 3caeb1b99..9c107412f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -22,6 +22,8 @@ import javax.inject.Inject; public class PushNotificationManager { private static PushNotificationManager instance = null; + public static String DEVICE_TOKEN_PREFERENCE_KEY = "device-token-preference"; + public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "newPM"; public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; @@ -49,6 +51,7 @@ public class PushNotificationManager { instance = new PushNotificationManager(context); } + instance.refreshedToken = instance.sharedPreferences.getString(DEVICE_TOKEN_PREFERENCE_KEY, ""); instance.context = context; return instance; @@ -60,6 +63,10 @@ public class PushNotificationManager { } this.refreshedToken = refreshedToken; + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString(DEVICE_TOKEN_PREFERENCE_KEY, refreshedToken); + editor.commit(); + if (this.userIsSubscribedToNotifications()) { this.addPushDeviceUsingStoredToken(); @@ -68,11 +75,11 @@ public class PushNotificationManager { //@TODO: Use preferences public void addPushDeviceUsingStoredToken () { - if (this.refreshedToken == null) { + if (this.refreshedToken == null || this.refreshedToken.isEmpty()) { this.refreshedToken = FirebaseInstanceId.getInstance().getToken(); } - if (this.refreshedToken == null) { + if (this.refreshedToken == null || this.refreshedToken.isEmpty()) { return; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java index 576164279..9dd3d7649 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.helpers.notifications; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; @@ -8,6 +9,9 @@ import android.content.res.Resources; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; +import android.support.v4.app.RemoteInput; +import android.util.Log; +import android.widget.RemoteViews; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; @@ -19,6 +23,7 @@ import java.util.Map; * Created by keithholliday on 7/1/16. */ public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNotification { + @Override public void notifyLocally(Context context, String title, String message) { Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); @@ -31,13 +36,15 @@ public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNot .setAutoCancel(true) .setSound(path); - Intent intent = new Intent(context, MainActivity.class); + Intent intent = new Intent(context, LocalNotificationActionReceiver.class); +// rejectInviteIntent.setAction(res.getString(R.string.reject_guild_invite)); PendingIntent pendingIntent = PendingIntent.getActivity( context, 3000, intent, PendingIntent.FLAG_UPDATE_CURRENT ); + notificationBuilder.setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index a60882035..90e8fe8c1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.receivers; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -26,6 +27,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private String action; private Resources resources; private Intent intent; + private Context conext; @Override public void onReceive(Context context, Intent intent) { @@ -34,6 +36,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement this.action = intent.getAction(); this.intent = intent; + this.conext = conext; this.apiHelper.apiService.getUser() .compose(this.apiHelper.configureApiCallObserver()) @@ -48,7 +51,6 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private void handleLocalNotificationAction(String action) { //@TODO: This is a good place for a factory and event emitter pattern - Log.v("test", action); if (action.equals(this.resources.getString(R.string.accept_party_invite))) { if (this.user.getInvitations().getParty() == null) return; String partyId = this.user.getInvitations().getParty().getId(); @@ -88,5 +90,8 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); } + + NotificationManager notificationManager = (NotificationManager) this.conext.getSystemService(this.conext.NOTIFICATION_SERVICE); + notificationManager.cancel(10); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index 364968838..bdeb3efae 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -214,6 +214,54 @@ public class LoginActivity extends BaseActivity hide(this.mConfirmPasswordRow); } } + } + + private View.OnClickListener mLoginNormalClick = new View.OnClickListener() { + @Override + public void onClick(View v) { + mProgressBar.setVisibility(View.VISIBLE); + if (isRegistering) { + String username, email,password,cpassword; + username = String.valueOf(mUsernameET.getText()).trim(); + email = String.valueOf(mEmail.getText()).trim(); + password = String.valueOf(mPasswordET.getText()); + cpassword = String.valueOf(mConfirmPassword.getText()); + if (username.length() == 0 || password.length() == 0 || email.length() == 0 || cpassword.length() == 0) { + showValidationError(R.string.login_validation_error_fieldsmissing); + return; + } + apiHelper.registerUser(username,email,password, cpassword) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(LoginActivity.this, throwable -> {hideProgress();}); + } else { + String username,password; + username = String.valueOf(mUsernameET.getText()).trim(); + password = String.valueOf(mPasswordET.getText()); + if (username.length() == 0 || password.length() == 0) { + showValidationError(R.string.login_validation_error_fieldsmissing); + return; + } + apiHelper.connectUser(username,password) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(LoginActivity.this, throwable -> {hideProgress();}); + } + } + }; + + private View.OnClickListener mForgotPWClick = v -> { + String url = BuildConfig.BASE_URL; + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); + }; + + + public static void show(final View v) { + v.setVisibility(View.VISIBLE); + } + + public static void hide(final View v) { + v.setVisibility(View.GONE); } private void startMainActivity() { 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 7c685e246..71f499fe5 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 @@ -32,6 +32,7 @@ import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; import com.habitrpg.android.habitica.events.commands.SellItemCommand; import com.habitrpg.android.habitica.events.commands.UnlockPathCommand; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; +import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; import com.habitrpg.android.habitica.ui.TutorialView; @@ -221,6 +222,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha //Check if reminder alarm is set scheduleReminder(this); + PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); + pushNotificationManager.addPushDeviceUsingStoredToken(); + new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); setupToolbar(toolbar); From 17f3e87050d875d7802ffb0c18d73c361dae0b30 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 4 Jul 2016 20:10:54 -0500 Subject: [PATCH 18/43] Updated identifiers. Fixed party notification --- .../helpers/notifications/PartyInviteLocalNotification.java | 4 ++-- .../helpers/notifications/PushNotificationManager.java | 6 +++--- .../habitica/receivers/LocalNotificationActionReceiver.java | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java index a50200dfe..9388364f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -47,12 +47,12 @@ public class PartyInviteLocalNotification implements HabiticaLocalNotification { ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); - Intent rejectInviteIntent = new Intent(); + Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_party_invite)); PendingIntent pendingIntentReject = PendingIntent.getBroadcast( context, 2000, - acceptInviteIntent, + rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index 9c107412f..e45a19403 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -24,10 +24,10 @@ public class PushNotificationManager { private static PushNotificationManager instance = null; public static String DEVICE_TOKEN_PREFERENCE_KEY = "device-token-preference"; - public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "Invited To Party"; + public static String PARTY_INVITE_PUSH_NOTIFICATION_KEY = "invitedParty"; public static String RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY = "newPM"; - public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "Gems"; - public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "Subscription"; + public static String RECEIVED_GEMS_PUSH_NOTIFICATION_KEY = "giftedGems"; + public static String RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY = "giftedSubscription"; public static String GUILD_INVITE_PUSH_NOTIFICATION_KEY = "invitedGuild"; public static String QUEST_INVITE_PUSH_NOTIFICATION_KEY = "questInvitation"; public static String QUEST_BEGUN_PUSH_NOTIFICATION_KEY = "questStarted"; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index 90e8fe8c1..cad645295 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -50,6 +50,9 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement } private void handleLocalNotificationAction(String action) { + NotificationManager notificationManager = (NotificationManager) this.conext.getSystemService(this.conext.NOTIFICATION_SERVICE); + notificationManager.cancel(10); + //@TODO: This is a good place for a factory and event emitter pattern if (action.equals(this.resources.getString(R.string.accept_party_invite))) { if (this.user.getInvitations().getParty() == null) return; @@ -90,8 +93,5 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement .compose(apiHelper.configureApiCallObserver()) .subscribe(aVoid -> {}, throwable -> {}); } - - NotificationManager notificationManager = (NotificationManager) this.conext.getSystemService(this.conext.NOTIFICATION_SERVICE); - notificationManager.cancel(10); } } From 51029dacbe3225311d9188489cd9761a7ccfa14d Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 4 Jul 2016 22:39:51 -0500 Subject: [PATCH 19/43] Removed icon from notification actions --- .../GuildInviteLocalNotification.java | 4 +- .../PartyInviteLocalNotification.java | 4 +- .../QuestBegunLocalNotification.java | 2 +- .../QuestInviteLocalNotification.java | 6 +-- .../QuestsBegunLocalNotification.java | 49 ------------------- ...ceivedPrivateMessageLocalNotification.java | 1 - .../LocalNotificationActionReceiver.java | 2 +- 7 files changed, 9 insertions(+), 59 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java index 5bc9f5307..8c6e15cc7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java @@ -45,7 +45,7 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { acceptInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + notificationBuilder.addAction(0, "Accept", pendingIntentAccept); Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_guild_invite)); @@ -56,7 +56,7 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); + notificationBuilder.addAction(0, "Reject", pendingIntentReject); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java index 9388364f5..190f30218 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -45,7 +45,7 @@ public class PartyInviteLocalNotification implements HabiticaLocalNotification { acceptInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + notificationBuilder.addAction(0, "Accept", pendingIntentAccept); Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_party_invite)); @@ -55,7 +55,7 @@ public class PartyInviteLocalNotification implements HabiticaLocalNotification { rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); + notificationBuilder.addAction(0, "Reject", pendingIntentReject); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notificationManager.notify(10, notificationBuilder.build()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java index 41023b89d..b58d4b620 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java @@ -39,7 +39,7 @@ public class QuestBegunLocalNotification implements HabiticaLocalNotification { notificationBuilder.setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); + notificationManager.notify(10000, notificationBuilder.build()); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java index d3d1a41dc..221346c03 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -40,7 +40,7 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { acceptInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Accept", pendingIntentAccept); + notificationBuilder.addAction(0, "Accept", pendingIntentAccept); Intent rejectInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); rejectInviteIntent.setAction(res.getString(R.string.reject_quest_invite)); @@ -50,10 +50,10 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { rejectInviteIntent, PendingIntent.FLAG_UPDATE_CURRENT ); - notificationBuilder.addAction(R.drawable.ic_gryphon, "Reject", pendingIntentReject); + notificationBuilder.addAction(0, "Reject", pendingIntentReject); NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); + notificationManager.notify(10000, notificationBuilder.build()); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java deleted file mode 100644 index 8c90b6664..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestsBegunLocalNotification.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.habitrpg.android.habitica.helpers.notifications; - -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.media.RingtoneManager; -import android.net.Uri; -import android.support.v4.app.NotificationCompat; - -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.ui.activities.MainActivity; - -import java.util.Map; - -/** - * Created by keithholliday on 7/1/16. - */ -public class QuestsBegunLocalNotification implements HabiticaLocalNotification { - @Override - public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); - - Intent intent = new Intent(context, MainActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity( - context, - 3000, - intent, - PendingIntent.FLAG_UPDATE_CURRENT - ); - notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java index 9dd3d7649..7d9203642 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java @@ -37,7 +37,6 @@ public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNot .setSound(path); Intent intent = new Intent(context, LocalNotificationActionReceiver.class); -// rejectInviteIntent.setAction(res.getString(R.string.reject_guild_invite)); PendingIntent pendingIntent = PendingIntent.getActivity( context, 3000, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index cad645295..d9527289a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -51,7 +51,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private void handleLocalNotificationAction(String action) { NotificationManager notificationManager = (NotificationManager) this.conext.getSystemService(this.conext.NOTIFICATION_SERVICE); - notificationManager.cancel(10); + notificationManager.cancelAll(); //@TODO: This is a good place for a factory and event emitter pattern if (action.equals(this.resources.getString(R.string.accept_party_invite))) { From c8b05d54b82e57bfd3e0afabfada476262f6e73f Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Tue, 5 Jul 2016 11:31:14 -0500 Subject: [PATCH 20/43] Added dismiss notification when action is clicked --- .../helpers/notifications/QuestInviteLocalNotification.java | 2 +- .../habitica/receivers/LocalNotificationActionReceiver.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java index 221346c03..f87c3abd7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -52,7 +52,7 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { ); notificationBuilder.addAction(0, "Reject", pendingIntentReject); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(10000, notificationBuilder.build()); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java index d9527289a..506b41c67 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.java @@ -27,7 +27,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement private String action; private Resources resources; private Intent intent; - private Context conext; + private Context context; @Override public void onReceive(Context context, Intent intent) { @@ -36,7 +36,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement this.action = intent.getAction(); this.intent = intent; - this.conext = conext; + this.context = context; this.apiHelper.apiService.getUser() .compose(this.apiHelper.configureApiCallObserver()) @@ -50,7 +50,7 @@ public class LocalNotificationActionReceiver extends BroadcastReceiver implement } private void handleLocalNotificationAction(String action) { - NotificationManager notificationManager = (NotificationManager) this.conext.getSystemService(this.conext.NOTIFICATION_SERVICE); + NotificationManager notificationManager = (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); //@TODO: This is a good place for a factory and event emitter pattern From 2bf908f9de6fd47ddb0a88ff19b2a64c9baab0d4 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Tue, 5 Jul 2016 12:20:10 -0500 Subject: [PATCH 21/43] Ensured user was subscribed to notification only when they do not have the device token --- .../PushNotificationManager.java | 30 +++++++++++++--- .../habitica/ui/activities/MainActivity.java | 8 +++-- .../lib/models/HabitRPGUser.java | 10 ++++++ .../lib/models/PushDevice.java | 34 +++++++++++++++++++ 4 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/PushDevice.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index e45a19403..ed58f8288 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -10,6 +10,8 @@ import com.google.firebase.messaging.RemoteMessage; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.PushDevice; import java.util.HashMap; import java.util.Map; @@ -40,12 +42,18 @@ public class PushNotificationManager { private String refreshedToken; private SharedPreferences sharedPreferences; private Context context; + private HabitRPGUser user; protected PushNotificationManager(Context context) { HabiticaApplication.getInstance(context).getComponent().inject(this); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); } + public void setUser(HabitRPGUser user) { + Log.v("test", "sdffsdf"); + this.user = user; + } + public static PushNotificationManager getInstance(Context context) { if(instance == null) { instance = new PushNotificationManager(context); @@ -66,11 +74,6 @@ public class PushNotificationManager { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(DEVICE_TOKEN_PREFERENCE_KEY, refreshedToken); editor.commit(); - - - if (this.userIsSubscribedToNotifications()) { - this.addPushDeviceUsingStoredToken(); - } } //@TODO: Use preferences @@ -82,6 +85,14 @@ public class PushNotificationManager { if (this.refreshedToken == null || this.refreshedToken.isEmpty()) { return; } + Log.v("Test", this.user.toString()); + if (this.user == null || this.userHasPushDevice()) { + return; + } + + if (!this.userIsSubscribedToNotifications()) { + return; + } Map pushDeviceData = new HashMap(); pushDeviceData.put("regId", this.refreshedToken); @@ -97,6 +108,15 @@ public class PushNotificationManager { .subscribe(aVoid -> {}, throwable -> {}); } + private Boolean userHasPushDevice() { + for(PushDevice pushDevice : this.user.getPushDevices()) { + if(pushDevice.getRegId().equals(this.refreshedToken)) { + return true; + } + } + return false; + } + public void displayNotification (RemoteMessage remoteMessage) { String remoteMessageIdentifier = remoteMessage.getData().get("identifier"); 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 71f499fe5..dfdd1e5fd 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 @@ -206,6 +206,8 @@ public class MainActivity extends BaseActivity implements Action1, Ha return (Math.round(value * Math.pow(10, n))) / (Math.pow(10, n)); } + PushNotificationManager pushNotificationManager; + @Override protected int getLayoutResId() { return R.layout.activity_main; @@ -222,8 +224,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha //Check if reminder alarm is set scheduleReminder(this); - PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); - pushNotificationManager.addPushDeviceUsingStoredToken(); + pushNotificationManager = PushNotificationManager.getInstance(this); new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); @@ -352,8 +353,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha displayDeathDialogIfNeeded(); if (!fromLocalDb) { - displayNewInboxMessagesBadge(); + pushNotificationManager.setUser(user); + pushNotificationManager.addPushDeviceUsingStoredToken(); // Update the oldEntries new Thread(() -> { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index eea72813f..5521c042c 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -99,6 +99,8 @@ public class HabitRPGUser extends BaseModel { foreignColumnName = "user_id")}) private Invitations invitations; + private List pushDevices = new ArrayList(); + private Purchases purchased; private TasksOrder tasksOrder; @@ -297,6 +299,14 @@ public class HabitRPGUser extends BaseModel { this.tasksOrder = tasksOrder; } + public List getPushDevices() { + return this.pushDevices; + } + + public void setPushDevices(List pushDevices) { + this.pushDevices = pushDevices; + } + @Override public void save() { // We need to set the user_id to all other objects diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/PushDevice.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/PushDevice.java new file mode 100644 index 000000000..c70ec2a06 --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/PushDevice.java @@ -0,0 +1,34 @@ +package com.magicmicky.habitrpgwrapper.lib.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Created by keithholliday on 7/5/16. + */ +public class PushDevice { + + @SerializedName("regId") + @Expose + private String regId; + + @SerializedName("type") + @Expose + private String type; + + public String getRegId() { + return this.regId; + } + + public void setRegId(String regId) { + this.regId = regId; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } +} From 3a774858b4e1433dd5e2f816fa3a1a6428e60693 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 16:01:53 -0500 Subject: [PATCH 22/43] Added example google services. Added instruction for google services. --- Habitica/google-services.json.example | 73 +++++++++++++++++++++++++++ README.md | 3 +- 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 Habitica/google-services.json.example diff --git a/Habitica/google-services.json.example b/Habitica/google-services.json.example new file mode 100644 index 000000000..07d605784 --- /dev/null +++ b/Habitica/google-services.json.example @@ -0,0 +1,73 @@ +{ + "project_info": { + "project_number": "project-number", + "firebase_url": "https://example.firebaseio.com", + "project_id": "project-id", + "storage_bucket": "storage.bucket" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "app-id", + "android_client_info": { + "package_name": "com.example" + } + }, + "oauth_client": [ + { + "client_id": "client-key", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "api-key" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "app-id", + "android_client_info": { + "package_name": "com.example" + } + }, + "oauth_client": [ + { + "client_id": "client-id", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "api-key" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} diff --git a/README.md b/README.md index e671d23ce..284422afb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It's also on Google Play: src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" /> -Having the application installed is a good way to be notified of new releases. However, clicking "Watch" on this +Having the application installed is a good way to be notified of new releases. However, clicking "Watch" on this repository will allow GitHub to email you whenever we publish a release. @@ -54,6 +54,7 @@ Setup Habitica build config files by simply copying the example habitica files. $ cp habitica.properties.example habitica.properties $ cp habitica.resources.example habitica.resources + $ cp Habitica/google-services.json.example Habitica/google-services.json (Get .json from Firebase Console) Note: this is the default production `habitica.properties` file for habitica.com. If you want to use a local habitica server, please modify the values in the properties file accordingly. From b1a4f7b6543307c555864318567c430c5fab2def Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 16:02:59 -0500 Subject: [PATCH 23/43] Corrected db number --- .../main/java/com/habitrpg/android/habitica/HabitDatabase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java index c0c6af461..f4d1cc3d4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java @@ -7,5 +7,5 @@ public class HabitDatabase { public static final String NAME = "Habitica"; - public static final int VERSION = 23; + public static final int VERSION = 24; } From 63347ab72b6cfa43be9a4d7f586da4986e78f9c4 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 16:13:28 -0500 Subject: [PATCH 24/43] Removed extra log --- .../habitica/helpers/notifications/PushNotificationManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index ed58f8288..b91acde42 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -50,7 +50,6 @@ public class PushNotificationManager { } public void setUser(HabitRPGUser user) { - Log.v("test", "sdffsdf"); this.user = user; } From 27ad0a1ed6e6c138532ed1da7696a0b62ffab4ce Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 16:30:02 -0500 Subject: [PATCH 25/43] Moved strings to contants file. Ensured constants will not be translated. --- Habitica/res/values/strings.constants.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Habitica/res/values/strings.constants.xml b/Habitica/res/values/strings.constants.xml index 2c56c1eb5..b7d64b085 100644 --- a/Habitica/res/values/strings.constants.xml +++ b/Habitica/res/values/strings.constants.xml @@ -7,4 +7,12 @@ Username E-mail https://habitica.com + + + ACCEPT_PARTY_INVITE + REJECT_PARTY_INVITE + ACCEPT_GUILD_INVITE + REJECT_GUILD_INVITE + ACCEPT_QUEST_INVITE + REJECT_QUEST_INVITE \ No newline at end of file From 5c8b1a676c200c441d5273f447615aa64665ca90 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 16:41:50 -0500 Subject: [PATCH 26/43] Fixed merge error --- .../habitica/ui/activities/LoginActivity.java | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index bdeb3efae..a36181a04 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -84,55 +84,6 @@ public class LoginActivity extends BaseActivity TextView mForgotPWTV; private Menu menu; private CallbackManager callbackManager; - private View.OnClickListener mLoginNormalClick = new View.OnClickListener() { - @Override - public void onClick(View v) { - mProgressBar.setVisibility(View.VISIBLE); - if (isRegistering) { - String username, email, password, cpassword; - username = String.valueOf(mUsernameET.getText()).trim(); - email = String.valueOf(mEmail.getText()).trim(); - password = String.valueOf(mPasswordET.getText()); - cpassword = String.valueOf(mConfirmPassword.getText()); - if (username.length() == 0 || password.length() == 0 || email.length() == 0 || cpassword.length() == 0) { - showValidationError(R.string.login_validation_error_fieldsmissing); - return; - } - apiHelper.registerUser(username, email, password, cpassword) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(LoginActivity.this, throwable -> { - hideProgress(); - }); - } else { - String username, password; - username = String.valueOf(mUsernameET.getText()).trim(); - password = String.valueOf(mPasswordET.getText()); - if (username.length() == 0 || password.length() == 0) { - showValidationError(R.string.login_validation_error_fieldsmissing); - return; - } - apiHelper.connectUser(username, password) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(LoginActivity.this, throwable -> { - hideProgress(); - }); - } - } - }; - private View.OnClickListener mForgotPWClick = v -> { - String url = BuildConfig.BASE_URL; - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse(url)); - startActivity(i); - }; - - public static void show(final View v) { - v.setVisibility(View.VISIBLE); - } - - public static void hide(final View v) { - v.setVisibility(View.GONE); - } @Override protected int getLayoutResId() { From 634651690f8108b65d2fa7a12c0a636066c040f9 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 8 Jul 2016 20:27:07 -0500 Subject: [PATCH 27/43] Refactored HabiticaLocalNotifications to be an abstract class --- .../GuildInviteLocalNotification.java | 27 ++++--------- .../HabiticaLocalNotification.java | 38 +++++++++++++++++-- .../PartyInviteLocalNotification.java | 27 ++++--------- .../QuestBegunLocalNotification.java | 25 ++++-------- .../QuestInviteLocalNotification.java | 25 ++++-------- .../ReceivedGemsGiftLocalNotification.java | 27 +++++-------- ...ceivedPrivateMessageLocalNotification.java | 25 ++++-------- ...ivedSubscriptionGiftLocalNotification.java | 25 ++++-------- .../WonChallengeLocalNotification.java | 25 ++++-------- 9 files changed, 93 insertions(+), 151 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java index 8c6e15cc7..a728ac0cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.java @@ -18,22 +18,17 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class GuildInviteLocalNotification implements HabiticaLocalNotification { - - private Map data; +public class GuildInviteLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } + protected void setNotificationActions() { Resources res = context.getResources(); Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); @@ -57,13 +52,5 @@ public class GuildInviteLocalNotification implements HabiticaLocalNotification { PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(0, "Reject", pendingIntentReject); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - this.data = data; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java index 686e3d281..bad509da4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.java @@ -1,15 +1,47 @@ package com.habitrpg.android.habitica.helpers.notifications; import android.content.Context; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.annotation.CallSuper; +import android.support.v4.app.NotificationCompat; + +import com.habitrpg.android.habitica.R; import java.util.Map; /** * Created by keithholliday on 6/28/16. */ -public interface HabiticaLocalNotification { +public abstract class HabiticaLocalNotification { - void notifyLocally(Context context, String title, String message); + protected Map data; + protected Context context; + protected String title; + protected String message; - void setExtras(Map data); + protected NotificationCompat.Builder notificationBuilder; + + @CallSuper + public void notifyLocally(Context context, String title, String message) { + this.context = context; + this.title = title; + this.message = message; + + Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + this.notificationBuilder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_gryphon) + .setContentTitle(title) + .setContentText(message) + .setAutoCancel(true) + .setSound(path); + } + + public void setExtras(Map data) { + this.data = data; + } + + protected abstract void setNotificationActions(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java index 190f30218..3b1e2d5e3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.java @@ -21,20 +21,16 @@ import java.util.Map; /** * Created by keithholliday on 6/28/16. */ -public class PartyInviteLocalNotification implements HabiticaLocalNotification { +public class PartyInviteLocalNotification extends HabiticaLocalNotification { public void notifyLocally(Context context, String title, String message) { + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); - + protected void setNotificationActions() { Resources res = context.getResources(); Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); @@ -56,14 +52,5 @@ public class PartyInviteLocalNotification implements HabiticaLocalNotification { PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(0, "Reject", pendingIntentReject); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); } - - @Override - public void setExtras(Map data) { - - } - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java index b58d4b620..f49d32ec5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestBegunLocalNotification.java @@ -16,19 +16,16 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class QuestBegunLocalNotification implements HabiticaLocalNotification { +public class QuestBegunLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(10000, notificationBuilder.build()); + } + protected void setNotificationActions() { Intent intent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( context, @@ -37,13 +34,5 @@ public class QuestBegunLocalNotification implements HabiticaLocalNotification { PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10000, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java index f87c3abd7..87ddbc61e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.java @@ -17,19 +17,16 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class QuestInviteLocalNotification implements HabiticaLocalNotification { +public class QuestInviteLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(10000, notificationBuilder.build()); + } + protected void setNotificationActions() { Resources res = context.getResources(); Intent acceptInviteIntent = new Intent(context, LocalNotificationActionReceiver.class); @@ -51,13 +48,5 @@ public class QuestInviteLocalNotification implements HabiticaLocalNotification { PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.addAction(0, "Reject", pendingIntentReject); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(10000, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java index 63fe5658b..7e4d394c4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedGemsGiftLocalNotification.java @@ -4,11 +4,13 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.ui.activities.MainActivity; import java.util.Map; @@ -16,19 +18,16 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class ReceivedGemsGiftLocalNotification implements HabiticaLocalNotification { +public class ReceivedGemsGiftLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } + protected void setNotificationActions() { Intent intent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( context, @@ -37,13 +36,5 @@ public class ReceivedGemsGiftLocalNotification implements HabiticaLocalNotificat PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java index 7d9203642..e36f9b605 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.java @@ -22,20 +22,17 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNotification { +public class ReceivedPrivateMessageLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } + protected void setNotificationActions() { Intent intent = new Intent(context, LocalNotificationActionReceiver.class); PendingIntent pendingIntent = PendingIntent.getActivity( context, @@ -45,13 +42,5 @@ public class ReceivedPrivateMessageLocalNotification implements HabiticaLocalNot ); notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java index 3bbf54958..e2658ff6f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedSubscriptionGiftLocalNotification.java @@ -16,19 +16,16 @@ import java.util.Map; /** * Created by keithholliday on 7/1/16. */ -public class ReceivedSubscriptionGiftLocalNotification implements HabiticaLocalNotification { +public class ReceivedSubscriptionGiftLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } + protected void setNotificationActions() { Intent intent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( context, @@ -37,13 +34,5 @@ public class ReceivedSubscriptionGiftLocalNotification implements HabiticaLocalN PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java index 3912414dc..62e709169 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/WonChallengeLocalNotification.java @@ -16,19 +16,16 @@ import java.util.Map; /** * Created by keithholliday on 7/2/16. */ -public class WonChallengeLocalNotification implements HabiticaLocalNotification { +public class WonChallengeLocalNotification extends HabiticaLocalNotification { @Override public void notifyLocally(Context context, String title, String message) { - Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_gryphon) - .setContentTitle(title) - .setContentText(message) - .setAutoCancel(true) - .setSound(path); + super.notifyLocally(context, title, message); + this.setNotificationActions(); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + notificationManager.notify(10, notificationBuilder.build()); + } + protected void setNotificationActions() { Intent intent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( context, @@ -37,13 +34,5 @@ public class WonChallengeLocalNotification implements HabiticaLocalNotification PendingIntent.FLAG_UPDATE_CURRENT ); notificationBuilder.setContentIntent(pendingIntent); - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - notificationManager.notify(10, notificationBuilder.build()); - } - - @Override - public void setExtras(Map data) { - } } From b77e825960f6f31b2ab29209d288d4515562716a Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sat, 9 Jul 2016 01:13:55 -0500 Subject: [PATCH 28/43] Removed extra logging code --- .../notifications/HabiticaFirebaseMessagingService.java | 3 --- .../helpers/notifications/PushNotificationManager.java | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java index c640998bc..a4c66251c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java @@ -11,9 +11,6 @@ import com.google.firebase.messaging.RemoteMessage; public class HabiticaFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { - Log.d("test", "Notification Message Body: " + remoteMessage.getNotification().getBody()); - Log.d("test", "Notification Message Body: " + remoteMessage.getData()); - PushNotificationManager pushNotificationManager = PushNotificationManager.getInstance(this); pushNotificationManager.displayNotification(remoteMessage); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java index b91acde42..8b0ec84a0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.java @@ -84,7 +84,7 @@ public class PushNotificationManager { if (this.refreshedToken == null || this.refreshedToken.isEmpty()) { return; } - Log.v("Test", this.user.toString()); + if (this.user == null || this.userHasPushDevice()) { return; } @@ -123,7 +123,7 @@ public class PushNotificationManager { HabiticaLocalNotification notification = notificationFactory.build(remoteMessageIdentifier); if (userIsSubscribedToNotificationType(remoteMessageIdentifier) && notification != null) { notification.setExtras(remoteMessage.getData()); - notification.notifyLocally(this.context, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); + notification.notifyLocally(this.context, remoteMessage.getData().get("title"), remoteMessage.getData().get("body")); } } From 730274286210e81b85207c43ef95d377cd066c46 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 14 Jul 2016 14:10:17 -0500 Subject: [PATCH 29/43] Added google service json to travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 15b9c450c..52df7c594 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,5 +41,6 @@ android: script: - cp habitica.properties.travis habitica.properties - cp habitica.resources.example habitica.resources + - cp Habitica/google-services.json.example Habitica/google-services.json - ./gradlew assembleDebug - ./gradlew testDebugUnitTest --info From 4df8d3c615925cb07e452321ef390e6ba9e382d8 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 14 Jul 2016 16:10:05 -0500 Subject: [PATCH 30/43] Updated example to use habitica debug package --- Habitica/google-services.json.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Habitica/google-services.json.example b/Habitica/google-services.json.example index 07d605784..a7499e800 100644 --- a/Habitica/google-services.json.example +++ b/Habitica/google-services.json.example @@ -10,7 +10,7 @@ "client_info": { "mobilesdk_app_id": "app-id", "android_client_info": { - "package_name": "com.example" + "package_name": "com.habitrpg.android.habitica.debug" } }, "oauth_client": [ @@ -41,7 +41,7 @@ "client_info": { "mobilesdk_app_id": "app-id", "android_client_info": { - "package_name": "com.example" + "package_name": "com.habitrpg.android.habitica.debug" } }, "oauth_client": [ From 4b27900d1d56d43c69ce9390e9e9e0acff51e9c8 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 14 Jul 2016 19:11:52 -0500 Subject: [PATCH 31/43] Fixed merge issue --- .../com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 5521c042c..1092cfd45 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -146,7 +146,6 @@ public class HabitRPGUser extends BaseModel { this.profile = profile; } -<<<<<<< e956287345a142dd1171f260872d6f1813f43d22 public ContributorInfo getContributor() { return contributor; } From 6aa8da81a07d5ff40af3c1f28aa19bb024ba6d84 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Tue, 2 Aug 2016 13:40:51 -0500 Subject: [PATCH 32/43] Removed strings left accidently by merge --- Habitica/res/values/strings.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index f8ea6fd5a..7589f7f26 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -374,13 +374,4 @@ To start, which parts of your life do you want to improve? hourglasses gold gold - - - ACCEPT_PARTY_INVITE - REJECT_PARTY_INVITE - ACCEPT_GUILD_INVITE - REJECT_GUILD_INVITE - ACCEPT_QUEST_INVITE - REJECT_QUEST_INVITE - From 52624c7e7cd949ef9bc28b602728527fd2469119 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 3 Aug 2016 15:42:15 +0200 Subject: [PATCH 33/43] Improvements to shops --- .../habitica/ui/activities/MainActivity.java | 47 ++++++++++++------- .../inventory/ShopRecyclerAdapter.java | 24 ++++++---- .../inventory/shops/ShopFragment.java | 10 ++-- .../habitrpgwrapper/lib/api/ApiService.java | 3 ++ .../habitrpgwrapper/lib/models/ShopItem.java | 13 +++++ 5 files changed, 64 insertions(+), 33 deletions(-) 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 7c685e246..9cfdbde55 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 @@ -138,6 +138,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import butterknife.BindView; +import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.functions.Action1; @@ -868,26 +869,38 @@ public class MainActivity extends BaseActivity implements Action1, Ha @Subscribe public void onEvent(final BuyGemItemCommand event) { - Observable observable; - if (event.shopIdentifier.equals(Shop.TIME_TRAVELERS_SHOP)) { - if (event.item.purchaseType.equals("gear")) { - observable = apiHelper.apiService.purchaseMysterySet(event.item.categoryIdentifier); + if (event.item.canBuy(user) || !event.item.getCurrency().equals("gems")) { + Observable observable; + if (event.shopIdentifier.equals(Shop.TIME_TRAVELERS_SHOP)) { + if (event.item.purchaseType.equals("gear")) { + observable = apiHelper.apiService.purchaseMysterySet(event.item.categoryIdentifier); + } else { + observable = apiHelper.apiService.purchaseHourglassItem(event.item.purchaseType, event.item.key); + } + } else if (event.item.purchaseType.equals("quests")) { + observable = apiHelper.apiService.purchaseQuest(event.item.key); } else { - observable = apiHelper.apiService.purchaseHourglassItem(event.item.purchaseType, event.item.key); + observable = apiHelper.apiService.purchaseItem(event.item.purchaseType, event.item.key); } + observable + .compose(apiHelper.configureApiCallObserver()) + .doOnNext(aVoid -> { + showSnackbar(this, floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), SnackbarDisplayType.NORMAL); + }) + .subscribe(buyResponse -> { + apiHelper.retrieveUser(false) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new HabitRPGUserCallback(this), throwable -> { + }); + }, throwable -> { + HttpException error = (HttpException) throwable; + if (error.code() == 401 && event.item.getCurrency().equals("gems")) { + openGemPurchaseFragment(null); + } + }); } else { - observable = apiHelper.apiService.purchaseItem(event.item.purchaseType, event.item.key); + openGemPurchaseFragment(null); } - observable - .compose(apiHelper.configureApiCallObserver()) - .doOnNext(aVoid -> { - showSnackbar(this, floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), SnackbarDisplayType.NORMAL); - }) - .subscribe(buyResponse -> { - apiHelper.retrieveUser(false) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(new HabitRPGUserCallback(this), throwable -> {}); - }, throwable -> {}); } @Subscribe @@ -978,7 +991,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha } @Subscribe - public void onEvent(OpenGemPurchaseFragmentCommand cmd) { + public void openGemPurchaseFragment(OpenGemPurchaseFragmentCommand cmd) { drawer.setSelection(MainDrawerBuilder.SIDEBAR_PURCHASE); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java index 559a5e7be..18431b772 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java @@ -162,6 +162,10 @@ public class ShopRecyclerAdapter extends RecyclerView.Adapter { this.shop = shop; this.adapter.setShop(shop); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 8a0a5f4ef..df990a3cf 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -75,6 +75,9 @@ public interface ApiService { @POST("user/buy-mystery-set/{key}") Observable purchaseMysterySet(@Path("key") String itemKey); + @POST("user/buy-quest/{key}") + Observable purchaseQuest(@Path("key") String key); + @POST("user/sell/{type}/{key}") Observable sellItem(@Path("type") String itemType, @Path("key") String itemKey); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java index b7c1b47f1..efe333218 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java @@ -60,6 +60,9 @@ public class ShopItem { } public Boolean getLocked() { + if (locked == null) { + return false; + } return locked; } @@ -90,4 +93,14 @@ public class ShopItem { public void setUnlockCondition(ShopItemUnlockCondition unlockCondition) { this.unlockCondition = unlockCondition; } + + public boolean canBuy(HabitRPGUser user) { + if (getCurrency().equals("gold")) { + return getValue() < user.getStats().getGp(); + } else if (getCurrency().equals("gems")) { + return getValue() < user.getBalance(); + } else { + return false; + } + } } From f2a716edc56544a81af7e943990f67cf5666e212 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 3 Aug 2016 15:42:23 +0200 Subject: [PATCH 34/43] update translations --- Habitica/AndroidManifest.xml | 4 +- Habitica/res/values-bg/strings.sidebar.xml | 20 + Habitica/res/values-bg/strings.tutorial.xml | 14 + Habitica/res/values-bg/strings.xml | 344 ++++++++++++++++++ Habitica/res/values-de/strings.sidebar.xml | 1 + Habitica/res/values-de/strings.xml | 17 +- Habitica/res/values-es/strings.sidebar.xml | 1 + Habitica/res/values-es/strings.xml | 5 + Habitica/res/values-ja/strings.sidebar.xml | 1 + Habitica/res/values-ja/strings.xml | 16 + Habitica/res/values-nl/strings.xml | 11 + Habitica/res/values-pt-rBR/strings.xml | 8 + .../res/values-zh-rTW/strings.sidebar.xml | 1 + Habitica/res/values-zh-rTW/strings.xml | 9 +- Habitica/res/values-zh/strings.sidebar.xml | 1 + Habitica/res/values-zh/strings.xml | 16 + .../habitrpgwrapper/lib/models/ShopItem.java | 2 +- translations/store_strings-bg.xml | 11 + 18 files changed, 475 insertions(+), 7 deletions(-) create mode 100644 Habitica/res/values-bg/strings.sidebar.xml create mode 100644 Habitica/res/values-bg/strings.tutorial.xml create mode 100644 Habitica/res/values-bg/strings.xml create mode 100644 translations/store_strings-bg.xml diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 832b03c34..57770fd05 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,8 +2,8 @@ diff --git a/Habitica/res/values-bg/strings.sidebar.xml b/Habitica/res/values-bg/strings.sidebar.xml new file mode 100644 index 000000000..3eccbc877 --- /dev/null +++ b/Habitica/res/values-bg/strings.sidebar.xml @@ -0,0 +1,20 @@ + + + Задачи + Умения + Общност + Входящи + Кръчма + Група + Купуване на диаманти + Гилдии + Предизвикателства + Чанта + Герой + Екипировка + Конюшня + Новини + Настройки + Относно + Магазини + diff --git a/Habitica/res/values-bg/strings.tutorial.xml b/Habitica/res/values-bg/strings.tutorial.xml new file mode 100644 index 000000000..3224530e4 --- /dev/null +++ b/Habitica/res/values-bg/strings.tutorial.xml @@ -0,0 +1,14 @@ + + + Отбелязвайте положителните си навици, за да получавате злато и опит! Отрицателните навици ще наранят героя Ви, ако ги докоснете, така че ги избягвайте в истинския живот! + Побеждавайте своите повтарящи се ежедневни задачи, за да печелите злато и опит. Внимание! Ежедневните задачи ще наранят героя Ви, ако не ги изпълните навреме. + Завършвайте задачите си за изпълнение в истинския живот, а след това ги отбелязвайте тук за ЗЛАТО и ОПИТ; така ще можете да отключвате награди и нови функционалности! + Това са наградите Ви! Печелете злато като изпълнявате истинските си навици, ежедневни задачи и задачи за изпълнение. След това го харчете за награди в играта или персонализирани такива за истинския живот! + Когато купувате екипировка, тя се появява тук. Бойното снаряжение променя атрибутите Ви, а костюмът (ако е включен) влияе на това какво носи героят Ви. + Печелете предмети като изпълнявате задачи и качвате нива. Докоснете предмет, за да го използвате! + Когато изпълнявате задачите си в истинския живот, имате шанс на случаен принцип да Ви се паднат яйца и отвари. Комбинирайте ги, за да си излюпите любимци. + Уменията са специални способности, които имат мощни ефекти! Докоснете умение, за да го използвате. Това ще Ви струва малко мана (синята лента), която се възстановява при влизане в играта всеки ден, както и като изпълнявате задачите от истинския си живот. Прегледайте ЧЗВ в менюто за повече информация! + Тук е мястото, където заедно с приятелите си можете взаимно да се държите отговорни за изпълнението на целите си, както и да се биете срещу чудовища със задачите си! + Добре дошли в кръчмата — обществено място за разговори, достъпно за хора от всички възрасти! Тук можете да разговаряте за продуктивността си и да задавате въпроси. Приятно прекарване! + Изберете дали да бъдете воин, магьосник, лечител или мошеник! Всеки клас има уникална екипировка и умения. Докоснете (?), за да научите повече! + diff --git a/Habitica/res/values-bg/strings.xml b/Habitica/res/values-bg/strings.xml new file mode 100644 index 000000000..29549d18a --- /dev/null +++ b/Habitica/res/values-bg/strings.xml @@ -0,0 +1,344 @@ + + + Хабитика + Опресняване + Опит + Здраве + Мана + Настройките не могат да бъдат заредени от кода + + Настройки + Вашият персонализиран сървър + Потребителски идентификатор + Вашият потребителски идентификатор + Жетон за ППИ + Вашият жетон за ППИ + Свържете се с мен + Възникна грешка… + Профил + Ежедневно напомняне + Включване на напомнянето + Задаване на времето за напомняне + + Стойност + Нова задача за изпълнение + Нова награда + Нова ежедневна задача + Нов навик + Редактиране + Изтриване + Отказ + Вход + Регистрация + Потребителско име + Е-поща или потребителско име + Парола + Е-поща + Потвърдете паролата + Изход + Излизане от Вашия профил + Подробности за профила + Добре дошли + Съживяване + Моля, свържете се чрез приложението, преди да използвате джаджа + Относно + Библиотеки + История на версиите + Хабитика е софтуер с отворен код, който е наличен в Github + Оценете приложението + Изпратете ни отзивите си! + Докладване на грешка + Изходен код + + Грешка при свързване + Нямате връзка с Интернет. + Изглежда има проблем със сървъра. Опитайте отново по-късно. + Грешка при удостоверяване + Потребителското име и/или паролата е грешна. + Грешка при проверяването + Трябва да попълните всички полета. + Запазване + Бележки + Текст + Трудност + Етикети + Елементарно + Лесно + Средно + Трудно + Начална дата + Положителен ( + ) + Отрицателен ( - ) + Подзадачи + Напомняния + Действия + Атрибути + Физическа + Умствена + Обществена + Други + Честота + В определени дни от седмицата + На всеки Х дни + Понеделник + Вторник + Сряда + Четвъртък + Петък + Събота + Неделя + Вдигнахте ниво! + Изпълнявайки целите си в истинския живот, Вие достигнахте ниво %1$d! + Вие бяхте излекуван(а) напълно! + Ура! + Не се отчайвайте! + Изгубихте ниво, всичкото си злато и един предмет от екипировката си, но можете да си ги върнете с усърдна работа! Късмет — ще се справите. + Здравето Ви свърши! + Възстановете здравето си и опитайте отново + Филтър + Профилно изображение + %d ТМ + Използвахте %1$s за %2$d точки мана. + нова подзадача + Добавяне + Не забравяйте да изпълнявате ежедневните си задачи! + Използване на умение + Очаквайте скоро + Наистина ли искате да докладвате това съобщение за нарушение? + Докладване на съобщението + Оключва се на ниво 11 + Вие не участвате в група. За да се присъедините към група, моля, посетете уеб сайта. + Забравена парола + Забравена парола? Моля, използвайте мобилния уеб сайт. + Включете отново ежедневните си задачи + Пауза на ежедн. + Купуване + Премахване + Група + Чат + Членове + Навици + Ежедневни + Задачи + Награди + Сигурен/на ли сте? + Наистина ли искате да изтриете това? + Да + Не + Мисия + Тяло + Коса + Риза + Кожа + Животински уши + Основа + Цвят + Брада + Мустаци + Цвете + Бретон + Няма нищо + Размер + Слаб + Широк + Фон + Купуване на персонализация + Отключване на комплекта за %d диамант(а) + Купуване + Купуване на комплекта %s + Крайна дата + Приемане + Отказване + Започване на мисия + Отказване на поканата + Прекратяване на мисията + Напускане на мисията + В очакване + Приета + Отказана + Участници + Версия %s (%d) + Помощ и ЧЗВ + Разбрано! + Напомнете ми отново + Добре дошли в Хабитика + Над 1 100 000 хора се забавляват, докато вършат нещата си. Присъединете се към тях! Създайте си герой и следете задачите от истинския си живот. + Напредък в играта = напредък в живота + Отключвайте функционалностите на играта като изпълнявате задачите в истинския си живот. Печелете екипировка, любимци и още, като награда за постигането на целите си! + Общност и битки с чудовища + Приятелите Ви могат да Ви помогнат да постигнете целите си. Подкрепяйте се взаимно в живота и битките, за да израснете заедно! + Започване + Назад + Напред + Пропускане + Добре дошли в Хабитика, където напредването в играта ще подобри истинския Ви живот! Докато изпълнявате реалните си цели, ще отключвате екипировка, любимци, мисии и още. + Добре дошли + Първо, ще Ви трябва герой, който да Ви представлява в играта! Нещата, които вършите в истинския си живот, ще се отразяват на здравето, нивото и златото на героя Ви. + Чудесно! А сега да създадем няколко задачи, за да започнете да печелите опит и злато. + +Кои области от живота си искате да подобрите? + Работа + Упражнения + Здравословно състояние + Училище + Екипи + Домакинска работа + Изобретателност + Обработка на е-поща + Най-важната задача + Работен проект + 10 мин аеробни упражнения + Разтягане + Да организирам тренировките си + Да ям полезна/вредна храна + Да изчистя зъбите си с конец + Да се запиша за преглед + Учене/отлагане + Да напиша домашното си + Да завърша проекта за училище + Да проверя какво прави екипът + Да уведомя екипа за напредъка си + Да завърша екипния проект + 10 минути чистене + Да измия чиниите + Да подредя килера + Да се уча от майстор в занаята + Да работя по проекта си + Да завърша проекта си + Искате ли да помогнете на Хабитика да продължи да съществува? Можете да подкрепите разработчиците като купите диаманти!\n\nС диамантите можете да си купувате забавни неща за профила си, като: \n\n — Интересни костюми за героя си;\n — Страхотни фонове;\n — Забавни мисии, от които ще получите яйца за любимци;\n — Възможността да променяте класа си преди да достигнете ниво 100.\n\nБлагодарим Ви за това, че помагате на Хабитика да се развива. Подкрепата Ви означава много за нас! + Моите гилдии + Обществени гилдии + Гилдия + Напускане + Присъединяване + Водач + Диаманти + Копиране като задача + Изпращане на ЛС + Докладване + Изтриване + Име + Описание + Добавяне на етикет + Поверителност + Напишете съобщение + Изпр. + Срок: %s + текуща серия: %d + Задачата има краен срок + Бойно снаряжение + Костюм + Глава + Аксесоар за глава + Предмет за очи + Броня + Гръб + Тяло + Щит + Оръжие + Костюм + Екипирано + Наистина ли искате да прекратите мисията? Всички приети покани ще бъдат загубени. Притежателят на мисията ще си запази свитъка ѝ. + Покана за мисия + Наистина ли искате да започнете мисията? След като мисията започне, никой повече няма да може да се присъедини към нея. + Получихте покана за участие в мисия! + Преди 1 ден + Преди %d дни + Преди 1 минута + Преди %d минути + Преди %d часа + Преди 1 час + Днес + Предмети + Яйца + Излюпващи отвари + Храна + Мисии + Любимци + Превози + Намерихте рядък предмет в гардероба: %s! Страхотно! + Тършувате из гардероба и намирате %1$s %2$s. Какво ли прави това там? + Сборвате се с гардероба и получавате опит. Така му се пада! + Отворете гардероба, за да получите случайно избрана специална екипировка, опит или храна! Оставащи предмети: %d + Намерихте последния рядък предмет за екипиране в омагьосания гардероб. + В гардероба ще се появяват нови предмети през първата седмица на всеки месец. До тогава продължавайте да щракате за опит и храна! + Продаване (%s злато) + Излюпване с отвара + Даване на любимец + Излюпване с яйце + Поканване на групата + Хранене на %1$s %2$s с: + Използване + Хранене + Излюпване на любимец с %s + Вие излюпихте %1$s %2$s! + Затваряне + Споделяне + Вие нахранихте своя(та/то) %1$s %2$s! + %s беше закупен(а/о) + Обикновени любимци + Любимци от магически отвари + Любимци от мисии + Редки любимци + Обикновени превози + Превози от магически отвари + Превози от мисии + Редки превози + Световна мисия + Починете в странноприемницата, за да не могат да Ви наранят неизпълнените Ви ежедневни задачи! (Забележка: това не Ви защитава от получаването на щети от главатари.) + Нямате %s + Ниво %s + Ниво %1$s - %2$s + Воин + Мошеник + Магьосник + Лечител + Воините нанасят повече и по-силни „критични удари“, които на случаен принцип дават злато, опит и шанс за падане на предмет при изпълнение на задача. Те също така нанасят сериозни щети на чудовищата-главатари. Играйте като воин, ако Ви мотивират изненадващите награди, или ако искате да раздавате правосъдие в мисиите с главатари. + Магьосниците се учат лесно, тъй като придобиват опит и нива по-бързо от останалите класове. Те имат много мана за специалните си умения. Играйте като магьосник, ако обичате тактическите страни на навиците, или ако се мотивирате от вдигане на нива и отключване на специални функционалности! + Мошениците обичат да трупат богатства, печелят повече злато повече от останалите и са майстори в намирането на случайни предмети. Отличителното им умение „Невидимост“ им позволява да избегнат последствията от пропуснати ежедневни задачи. Играйте като мошеник, ако Ви мотивират наградите и постиженията, и обичате плячката и значките! + Лечителите трудно могат да бъдат наранени, и разпростират защитата си върху останалите. Пропуснатите ежедневни задачи и лошите навици не ги смущават толкова много; те винаги могат да възстановят здравето си след провал. Играйте като лечител, ако обичате да помагате на останалите в групата си, или ако искате да изиграете смъртта чрез усърдна работа! + Изберете клас + Отказване + Не Ви се занимава с класове? Искате да изберете по-късно? Откажете се от тях — ще бъдете воин без специални умения. Можете да прочетете относно класовата система по-късно в уикито, както и да включите класовете когато пожелаете. + Наистина ли искате да бъдете %s? + Избиране на класа + Назад + Наистина ли искате да се откажете? + Промяна на класа + Променете класа си и възстановете атрибутните си точки за 3 диаманта. Можете да разпределите атрибутните си точки през уеб сайта + Включване на класовата система + Промяна на класа + По е-поща + Поканете съществуващи потребители + Изпращане + Поканете приятели + Ако имате приятели, които вече използват Хабитика, поканете ги чрез потребителски идентификатор тук. + Ако приятел се присъедини към Хабитика през Вашето е-писмо, той автоматично ще бъде поканен в групата Ви! + Добавяне на покани + Потребителски ид. + Е-поща + Поканване в групата + Споделяне чрез + Достигнах ниво %s в Хабитика, като подобрих навиците си в истинския живот! + Току-що излюпих любимец — %1$s %2$s в Хабитика, като изпълнявах задачите си в истинския живот! + Току-що се сдобих с превоз — %1$s %2$s в Хабитика, като изпълнявах задачите си в истинския живот! + Отваряне в магазина + Наистина ли искате да промените класа си? Това ще Ви струва 3 диаманта. + Съобщение от %1$s + Потвърждаване + Пазар + Пътешественици във времето + Сезонен магазин + Нямате входящи съобщения. Можете да изпратите ново съобщение на потребител от екрана с неговите публични съобщения в чата! + Отключете, като поканите приятели + Нямате достатъчно злато + Няма нужда да купувате лечебна отвара + Закупено успешно: %1$s + Потвърждаване на покупката + Купуване на %1$s за %2$s %3$s + диамант + пясъчен часовник + пясъчни часовници + злато + злато + diff --git a/Habitica/res/values-de/strings.sidebar.xml b/Habitica/res/values-de/strings.sidebar.xml index 3b829eeeb..0b8d2d778 100644 --- a/Habitica/res/values-de/strings.sidebar.xml +++ b/Habitica/res/values-de/strings.sidebar.xml @@ -16,4 +16,5 @@ Neuigkeiten Einstellungen Über + Märkte diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index 650bc23d3..7dfc43820 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -53,7 +53,7 @@ Verbindungsfehler Keine Internetverbindung. Es scheint ein Problem mit dem Server zu geben. Versuch es später noch mal. - Autentifikationsfehler + Authentifikationsfehler Ungültiger Benutzername und/oder Passwort Validierungsfehler Bitte fülle alle Felder aus. @@ -166,14 +166,14 @@ Spielfortschritt = Lebensfortschritt Schalte zusätzliche Spielinhalte frei, indem Du Aufgaben im echten Leben erledigst. Verdiene Dir Ausrüstung, Haustiere und mehr als Belohnung für die Erfüllung Deiner Ziele! Werde sozial und kämpfe gegen Monster - Behalte Deine Ziele im Auge mit Hilfe Deiner Freunde. Unterstützt Euch gegenseitig im Leben und im Kampf während Ihr Euch gemeinsam verbessert! + Behalte Deine Ziele im Auge mit Hilfe Deiner Freunde. Unterstützt Euch gegenseitig im Leben und im Kampf, während Ihr Euch gemeinsam verbessert! Anfangen Zurück Weiter Überspringen Willkommen zu Habitica! Hier bedeutet Fortschritt im Spiel gleichzeitig Fortschritt im echten Leben! Während Du Ziele im echten Leben erreichst, wirst Du Ausrüstung, Haustiere, Quests und vieles mehr freischalten. Willkommen - Als erstes benötigst Du einen Avater, der Dich repräsentiert! Dinge die Du im echten Leben tust beeinflussen Deine Lebenspunkte, Dein Level und Dein Gold. + Als erstes benötigst Du einen Avatar, der Dich repräsentiert! Dinge die Du im echten Leben tust beeinflussen Deine Lebenspunkte, Dein Level und Dein Gold. Großartig! Jetzt lass uns Deine Aufgaben anlegen, damit Du anfangen kannst Erfahrung zu sammeln und Gold zu bekommen. Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? @@ -330,4 +330,15 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? Mysteriöse Zeitreisende Jahreszeitenmarkt Du hast keine Nachrichten in Deinem Posteingang. Du kannst einem anderen Benutzer eine neue Nachricht von deren öffentlichen Chatnachrichten aus senden! + Durch Einladen von Freunden freischalten + Nicht genügend Gold + Du musst keinen Heiltrank kaufen + %1$s gekauft + Kauf bestätigen + %1$s für %2$s %3$s kaufen + Edelstein + Sanduhr + Sanduhren + Gold + Gold diff --git a/Habitica/res/values-es/strings.sidebar.xml b/Habitica/res/values-es/strings.sidebar.xml index 5c050d41f..8fdcef7af 100644 --- a/Habitica/res/values-es/strings.sidebar.xml +++ b/Habitica/res/values-es/strings.sidebar.xml @@ -16,4 +16,5 @@ Noticias Ajustes Información + Tiendas diff --git a/Habitica/res/values-es/strings.xml b/Habitica/res/values-es/strings.xml index 6ed6ec16f..1a13cada1 100644 --- a/Habitica/res/values-es/strings.xml +++ b/Habitica/res/values-es/strings.xml @@ -325,4 +325,9 @@ Para empezar, ¿qué aspectos de tu vida te gustaría mejorar? Abrir en Play Store ¿Seguro que quieres cambiar de clase? Te costará 3 gemas. Mensaje de %1$s + Confirmar + Mercado + Viajeros del tiempo + Tienda estacional + No tienes ningún mensaje en la bandeja de entrada. Puedes enviar un mensaje a un usuario desde los mensajes de chat públicos que hayan enviado. diff --git a/Habitica/res/values-ja/strings.sidebar.xml b/Habitica/res/values-ja/strings.sidebar.xml index e48775131..d11938451 100644 --- a/Habitica/res/values-ja/strings.sidebar.xml +++ b/Habitica/res/values-ja/strings.sidebar.xml @@ -16,4 +16,5 @@ お知らせ 設定 Habitica について + ショップ diff --git a/Habitica/res/values-ja/strings.xml b/Habitica/res/values-ja/strings.xml index 93a890f10..b1c97b0f2 100644 --- a/Habitica/res/values-ja/strings.xml +++ b/Habitica/res/values-ja/strings.xml @@ -326,4 +326,20 @@ Play ストアで開く クラスを変更します。いいですか? 3 ジェムかかります。 %1$s からのメッセージ + 確認 + 市場 + タイムトラベラー + 期間限定ショップ + 受信箱にメッセージがありません。Habitica ユーザーあてにメッセージを送ることができます。公開チャットに投稿しているユーザーにメッセージを送ってみてはどうですか? + 友達を招待するとアンロック + ゴールドが足りません + 体力回復の薬を買う必要がありません + %1$s を買いました + 購入の確認 + %2$s %3$s で %1$s を買う + ジェム + 砂時計 + 砂時計 + ゴールド + ゴールド diff --git a/Habitica/res/values-nl/strings.xml b/Habitica/res/values-nl/strings.xml index 9aad792c3..909442ced 100644 --- a/Habitica/res/values-nl/strings.xml +++ b/Habitica/res/values-nl/strings.xml @@ -330,4 +330,15 @@ Om te beginnen, welke delen van je leven wil je verbeteren? Tijd Reizigers Seizoenswinkel Je hebt geen Inbox berichten. Je kan een gebruiker een nieuw bericht sturen vanuit hun publieke chat berichten. + Ontgrendel door vrienden uit te nodigen + Niet genoeg goud + Je hoeft geen gezondheidsdrankje te kopen + %1$s succesvol gekocht + Bevestig aankoop + Koop %1$s voor %2$s %3$s + edelsteen + zandloper + zandlopers + goud + goud diff --git a/Habitica/res/values-pt-rBR/strings.xml b/Habitica/res/values-pt-rBR/strings.xml index c3f3a8d65..4ef30acc5 100644 --- a/Habitica/res/values-pt-rBR/strings.xml +++ b/Habitica/res/values-pt-rBR/strings.xml @@ -326,4 +326,12 @@ Para começar, quais partes da sua vida você quer melhorar? Abra na Play Store Você tem certeza que quer mudar sua classe? Isso irá custar 3 gemas. Mensagem de %1$s + Confirmar + Mercado + Você não precisa comprar uma poção de vida + %1$s comprado com sucesso + Confirmar compra + gema + ouro + ouro diff --git a/Habitica/res/values-zh-rTW/strings.sidebar.xml b/Habitica/res/values-zh-rTW/strings.sidebar.xml index 91fdc8ee6..0138aa5a9 100644 --- a/Habitica/res/values-zh-rTW/strings.sidebar.xml +++ b/Habitica/res/values-zh-rTW/strings.sidebar.xml @@ -16,4 +16,5 @@ 新聞 設定 關於 + 商店 diff --git a/Habitica/res/values-zh-rTW/strings.xml b/Habitica/res/values-zh-rTW/strings.xml index 32fe2a607..d9a5c3829 100644 --- a/Habitica/res/values-zh-rTW/strings.xml +++ b/Habitica/res/values-zh-rTW/strings.xml @@ -113,7 +113,7 @@ 重啟每日任務 暫停每日任務 購買 - 解散 + 取消 隊伍 聊天 成員 @@ -322,5 +322,12 @@ 我在Habitica中通過改善我現實生活中的習慣到達了%s級! 我剛剛在Habitica中通完成我現實生活中的任務孵化了一隻寵物%1$s %2$s! 我剛剛在Habitica中通完成我現實生活中的任務得到了一匹坐騎%1$s %2$s! + 開啟Play sotre 你確定要變更職業嗎?這會花費3寶石。 + 訊息來自%1$s + 確認 + 市集 + 時光旅人 + 季節限定商店 + 你的收件匣裡面沒有任何信息。你可以利用聊天去傳送訊息給大家 diff --git a/Habitica/res/values-zh/strings.sidebar.xml b/Habitica/res/values-zh/strings.sidebar.xml index 6580fb2f5..7992a695c 100644 --- a/Habitica/res/values-zh/strings.sidebar.xml +++ b/Habitica/res/values-zh/strings.sidebar.xml @@ -16,4 +16,5 @@ 新闻 设置 关于 + 商店 diff --git a/Habitica/res/values-zh/strings.xml b/Habitica/res/values-zh/strings.xml index 6f21deddc..f6692148d 100644 --- a/Habitica/res/values-zh/strings.xml +++ b/Habitica/res/values-zh/strings.xml @@ -325,4 +325,20 @@ 在应用商店开放 你确定想要转变职业吗?这将花费3颗宝石。 从%1$s来的消息 + 确认 + 市场 + 时光旅行 + 四季商店 + 收件箱里没有消息。您可以在用户的公共聊天窗口中给他发送新消息! + 通过邀请朋友来解锁 + 没有足够的金币 + 你不需要购买生命药水 + 已购买 %1$s + 确认购买 + 为 %2$s %3$s 购买 %1$s + 宝石 + 沙漏 + 沙漏 + 金币 + 金币 diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java index efe333218..50e336499 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java @@ -98,7 +98,7 @@ public class ShopItem { if (getCurrency().equals("gold")) { return getValue() < user.getStats().getGp(); } else if (getCurrency().equals("gems")) { - return getValue() < user.getBalance(); + return getValue() < (user.getBalance()*4); } else { return false; } diff --git a/translations/store_strings-bg.xml b/translations/store_strings-bg.xml new file mode 100644 index 000000000..2f0fe195e --- /dev/null +++ b/translations/store_strings-bg.xml @@ -0,0 +1,11 @@ + + + Превърнете живота си в игра за повече мотивация и по-добра организация! + НОВОТО приложение на Хабитика! Пренаписано изцяло за по-добро преживяване и повече функционалности. + +Превърнете живота си в игра за повече мотивация и по-добра организация! С Хабитика е лесно да се забавлявате, докато изпълнявате целите си. + +Въведете навиците си, ежедневните си цели и дългосрочните си задачи, а след това си създайте герой. Изпълнявайте задачите си, за да вдигате нивото на героя си и отключвате функционалности като екипировка, любимци, умения и дори мисии! Бийте се с чудовища заедно с приятели, за да държите един другиго отговорен, и използвайте златото си за награди като екипировка, или дори свои собствени такива, като например да гледате епизод от любимия си сериал. Гъвкава, забавна и с голяма общност, Хабитика е перфектният начин да се мотивирате и да постигнете всичко, което искате. + +Версията в момента е „бета“, така че не се притеснявайте да ни изпращате отзивите си на mobile@habitica.com! А ако приложението Ви харесва, ще се радваме да оставите рецензията си. + From 729034ee242599f528a9fe4d2806f43fbfa6a3f0 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Wed, 3 Aug 2016 12:19:17 -0500 Subject: [PATCH 35/43] Added fixes for task alarm manager tests --- Habitica/AndroidManifestTesting.xml | 140 ++++++++++++++++++ Habitica/build.gradle | 2 +- .../android/habitica/HabiticaApplication.java | 10 +- .../lib/models/tasks/Task.java | 6 +- .../helpers/TaskAlarmManagerTest.java | 51 ++++--- 5 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 Habitica/AndroidManifestTesting.xml diff --git a/Habitica/AndroidManifestTesting.xml b/Habitica/AndroidManifestTesting.xml new file mode 100644 index 000000000..38f1dbc99 --- /dev/null +++ b/Habitica/AndroidManifestTesting.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 126fc3e38..2396ddc35 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -183,7 +183,7 @@ android { assets.srcDirs = ['assets'] } robolectric { - manifest.srcFile 'AndroidManifest.xml' + manifest.srcFile 'AndroidManifestTesting.xml' java.srcDir file('src/test/java/') res.srcDirs = ['res'] } 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 80871a2f9..d04f76f60 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -130,7 +130,11 @@ public class HabiticaApplication extends MultiDexApplication { setupCrashlytics(); createBillingAndCheckout(); registerActivityLifecycleCallbacks(); - Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); + + if (!BuildConfig.DEBUG) { + Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); + } + Fresco.initialize(this); checkIfNewVersion(); } @@ -178,7 +182,9 @@ public class HabiticaApplication extends MultiDexApplication { } private void setupFacebookSdk() { - FacebookSdk.sdkInitialize(getApplicationContext()); + if (!BuildConfig.DEBUG) { + FacebookSdk.sdkInitialize(getApplicationContext()); + } } private void setupCrashlytics() { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java index 8434e1df0..1fa61fb47 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -603,7 +603,7 @@ public class Task extends BaseModel { Calendar newTime = new GregorianCalendar(); newTime.setTime(oldTime); - if (this.getFrequency().equals(FREQUENCY_DAILY) && (newTime.before(today) || newTime.equals(today))) { + if (this.getFrequency().equals(FREQUENCY_DAILY) ) { Calendar startDate = new GregorianCalendar(); startDate.setTime(this.getStartDate()); @@ -611,7 +611,9 @@ public class Task extends BaseModel { long diffInMillies = today.getTimeInMillis() - startDate.getTimeInMillis(); long daySinceStart = timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS); long daysUntilNextReminder = this.getEveryX() - (daySinceStart % this.getEveryX()); - newTime.add(Calendar.DATE, (int) daysUntilNextReminder); + + today.add(Calendar.DATE, (int) daysUntilNextReminder); + newTime.setTime(today.getTime()); } else { int nextActiveDayOfTheWeek = newTime.get(Calendar.DAY_OF_WEEK); while (!this.getRepeat().getForDay(nextActiveDayOfTheWeek) || newTime.before(today) || newTime.equals(today)) { diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java index 9b2c7be36..ec08f64a2 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/TaskAlarmManagerTest.java @@ -21,12 +21,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.UUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -35,6 +37,7 @@ import static org.junit.Assert.assertNotNull; * Created by keithholliday on 7/16/16. */ +@Config(manifest = "AndroidManifestTesting.xml") @RunWith(value = RobolectricTestRunner.class) public class TaskAlarmManagerTest { private TaskAlarmManager taskAlarmManager; @@ -59,6 +62,8 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); Calendar cal = Calendar.getInstance(); cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + 1); @@ -71,14 +76,13 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); - + int intentId = remindersItem1.getId().hashCode() & 0xfffffff; Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); - PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); + intent.setAction(remindersItem1.getId()); + PendingIntent sender = PendingIntent.getBroadcast(context, intentId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; - Assert.assertNotNull(alarmId); + Assert.assertNotNull(intentId); Assert.assertEquals(true, alarmUp); } @@ -89,6 +93,8 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); Calendar cal = Calendar.getInstance(); cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + 1); @@ -101,9 +107,9 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); + int alarmId = remindersItem1.getId().hashCode() & 0xfffffff; Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); + intent.setAction(remindersItem1.getId()); PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; @@ -127,7 +133,7 @@ public class TaskAlarmManagerTest { } taskAlarmManager.setAlarmsForTask(task); - Integer newAlarmId = reminders.get(0).getAlarmId(); + int newAlarmId = reminders.get(0).getId().hashCode() & 0xfffffff; PendingIntent senderNew = PendingIntent.getBroadcast(context, newAlarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUpNew = senderNew != null; @@ -192,6 +198,8 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); //We try to set a reminder on Tuesday, but the manager will correct this to Monday Calendar cal = Calendar.getInstance(); @@ -206,13 +214,13 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); + int alarmId = reminders.get(0).getId().hashCode() & 0xfffffff; Calendar newReminderTime = Calendar.getInstance(); newReminderTime.setTime(reminders.get(0).getTime()); Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); + intent.setAction(remindersItem1.getId()); PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; @@ -240,6 +248,8 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); //We try to set a reminder for now, but by the manager will correct (because the seconds will be different) Calendar cal = Calendar.getInstance(); @@ -252,13 +262,13 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); + int alarmId = reminders.get(0).getId().hashCode() & 0xfffffff; Calendar newReminderTime = Calendar.getInstance(); newReminderTime.setTime(reminders.get(0).getTime()); Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); + intent.setAction(remindersItem1.getId()); PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; @@ -278,13 +288,18 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); //We try to set a reminder one day after the start date, but the manager will correct since the // daily is every 2 days from above Calendar cal = Calendar.getInstance(); int currentDayOfTheWeek = cal.get(Calendar.DAY_OF_WEEK); + + task.setStartDate(cal.getTime()); + cal.set(Calendar.DAY_OF_WEEK, currentDayOfTheWeek + 1); - cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + 1); + cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE)); remindersItem1.setTime(cal.getTime()); reminders.add(remindersItem1); @@ -294,13 +309,13 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); + int alarmId = reminders.get(0).getId().hashCode() & 0xfffffff; Calendar newReminderTime = Calendar.getInstance(); newReminderTime.setTime(reminders.get(0).getTime()); Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); + intent.setAction(remindersItem1.getId()); PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; @@ -321,6 +336,8 @@ public class TaskAlarmManagerTest { List reminders = new ArrayList(); RemindersItem remindersItem1 = new RemindersItem(); + UUID randomUUID = UUID.randomUUID(); + remindersItem1.setId(randomUUID.toString()); //We try to set a reminder for now, but the manager will correct since the seconds will be off Calendar cal = Calendar.getInstance(); @@ -334,13 +351,13 @@ public class TaskAlarmManagerTest { taskAlarmManager.setAlarmsForTask(task); - Integer alarmId = reminders.get(0).getAlarmId(); + int alarmId = reminders.get(0).getId().hashCode() & 0xfffffff; Calendar newReminderTime = Calendar.getInstance(); newReminderTime.setTime(reminders.get(0).getTime()); Intent intent = new Intent(context, TaskReceiver.class); - intent.setAction(remindersItem1.getAlarmId().toString()); + intent.setAction(remindersItem1.getId()); PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_NO_CREATE); boolean alarmUp = sender != null; From aad16502fdb7db38bc3dd929bef60e388ff56558 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 12:14:50 +0200 Subject: [PATCH 36/43] fix buying gem quests --- Habitica/AndroidManifest.xml | 2 +- .../habitrpg/android/habitica/ui/activities/MainActivity.java | 2 +- .../com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 57770fd05..1d5bea92c 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ 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 9cfdbde55..a6dcd5465 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 @@ -877,7 +877,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha } else { observable = apiHelper.apiService.purchaseHourglassItem(event.item.purchaseType, event.item.key); } - } else if (event.item.purchaseType.equals("quests")) { + } else if (event.item.purchaseType.equals("quests") && event.item.getCurrency().equals("gold")) { observable = apiHelper.apiService.purchaseQuest(event.item.key); } else { observable = apiHelper.apiService.purchaseItem(event.item.purchaseType, event.item.key); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java index 50e336499..d844cc194 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java @@ -96,9 +96,9 @@ public class ShopItem { public boolean canBuy(HabitRPGUser user) { if (getCurrency().equals("gold")) { - return getValue() < user.getStats().getGp(); + return getValue() <= user.getStats().getGp(); } else if (getCurrency().equals("gems")) { - return getValue() < (user.getBalance()*4); + return getValue() <= (user.getBalance()*4); } else { return false; } From 3e58f9de5d361bd47e29df643f8daca31a14614d Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 12:15:00 +0200 Subject: [PATCH 37/43] correctly set user agent --- .../src/main/java/com/habitrpg/android/habitica/APIHelper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 122b4cb6d..726d35299 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -158,6 +158,8 @@ public class APIHelper implements Action1 { logging.setLevel(HttpLoggingInterceptor.Level.BODY); } + String userAgent = System.getProperty("http.agent"); + OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(remove_data_interceptor) .addInterceptor(logging) @@ -168,6 +170,7 @@ public class APIHelper implements Action1 { .header("x-api-key", this.hostConfig.getApi()) .header("x-api-user", this.hostConfig.getUser()) .header("x-client", "habitica-android") + .header("user-agent", userAgent) .method(original.method(), original.body()) .build(); return chain.proceed(request); From 41ef950068da80e623ea7a715eb7795edbabc80d Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 12:23:41 +0200 Subject: [PATCH 38/43] Allow chat messages to be copied to clipboard commit 61d2757fe581ea1ae084e0e576f7e0e1b2e226fb Author: Phillip Thelen Date: Thu Aug 4 12:22:58 2016 +0200 add copy to clipboard string commit b73d727a2251326f7860ae7b48225eb289c66f0c Author: jjbillings Date: Wed Aug 3 08:56:06 2016 -0400 Add message into strings.xml # Conflicts: # Habitica/res/values/strings.xml commit 8546ee24e8b6a9593ae729e0084879d414a1a288 Merge: ecf1f33 93f264f Author: Jack Billings Date: Tue Aug 2 18:28:19 2016 -0400 Merge remote-tracking branch 'origin/develop' into copy-chat-message # Conflicts: # Habitica/res/values/strings.xml #Conflicts resolved... commit 93f264f0b45a9ce68017307772d187489082fb18 Merge: 81ded07 2ddc426 Author: Jack Billings Date: Tue Aug 2 18:23:35 2016 -0400 Merge pull request #2 from HabitRPG/develop Merge from main repo commit ecf1f33ed0b3cf9457723353d5f1f8fa9dabeecb Author: Jack Billings Date: Fri Jul 29 09:27:09 2016 -0400 Merge remote-tracking branch 'origin/develop' into copy-chat-message # Conflicts: # Habitica/res/values/strings.xml commit e64b3bda35aff3393c33a6e0628ea3843d517e22 Merge: f6e118d 81ded07 Author: Jack Billings Date: Fri Jul 29 09:26:35 2016 -0400 Merge remote-tracking branch 'origin/develop' into copy-chat-message # Conflicts: # Habitica/res/values/strings.xml commit 81ded077302461f4270c9d121b769315d29e2bd8 Merge: 0f70acc f5f5f00 Author: Jack Billings Date: Fri Jul 29 09:08:35 2016 -0400 Merge pull request #1 from HabitRPG/develop Update from original repo commit f6e118d162a6b91a0716e7d1bceeaebe0aec96cb Author: Jack Billings Date: Fri Jul 29 09:02:12 2016 -0400 Change Toast to SnackBar commit 8835fe418df2fb5f2e08a06fdda94f2eae9d77f3 Merge: c72a1f5 80da760 Author: Jack Billings Date: Fri Jul 29 08:59:52 2016 -0400 Change Toast to SnackBar commit c72a1f533d120cba9be838870460e2ee7a03ee9f Author: Jack Billings Date: Wed Jul 27 20:30:43 2016 -0400 Add feature to copy chat messages to clipboard commit 80da7601c48d63c92f909f4a3b4c6559bd907470 Merge: 2bf900d f0d997b Author: Phillip Thelen Date: Tue Jun 7 19:11:08 2016 +0200 Merge branch 'travis' of github.com:HabitRPG/habitrpg-android into travis # Conflicts: # .travis.yml commit 2bf900df64aa241db5feeb4820b643cd0e1fa1e8 Author: Phillip Thelen Date: Tue Jun 7 19:05:37 2016 +0200 . commit f0d997b56f37d511e66e18734716934efef3af13 Author: Phillip Thelen Date: Tue Jun 7 19:05:37 2016 +0200 . commit 62e96caf288ae6f7260d4eb73164f082db0c7016 Author: Phillip Thelen Date: Tue Jun 7 17:16:06 2016 +0200 . commit b0f640ced3c2a0e654a2b34ca2fe8307be0b7208 Author: Phillip Thelen Date: Tue Jun 7 17:12:09 2016 +0200 . commit 97d3892b0e9b259e94f1920ffe6226da05fa218c Author: Phillip Thelen Date: Tue Jun 7 16:16:04 2016 +0200 . commit 6b89f5ee013c2711fe1872e7ff657439ab61a02d Author: Phillip Thelen Date: Tue Jun 7 16:00:39 2016 +0200 set node version commit 79e2b3af80741266c8ba9dda90d6a3ad40c56d0a Author: Phillip Thelen Date: Tue Jun 7 15:44:13 2016 +0200 test commit 11a68ba8e91e219ad1db9f7cc6bac3a203cdd60f Author: Phillip Thelen Date: Tue Jun 7 15:16:23 2016 +0200 test different config commit 9c96911dc31d1ba123481eb3d291aee274973474 Author: Phillip Thelen Date: Tue Jun 7 14:52:33 2016 +0200 fix config commit 9f41579bd9289985fb98f1a46d0292f897b6b420 Author: Phillip Thelen Date: Tue Jun 7 14:48:15 2016 +0200 fix yaml --- Habitica/res/menu/chat_message.xml | 5 +++++ Habitica/res/values/strings.xml | 2 ++ .../events/commands/CopyChatMessageCommand.java | 12 ++++++++++++ .../adapter/social/ChatRecyclerViewAdapter.java | 7 +++++++ .../ui/fragments/social/ChatListFragment.java | 15 +++++++++++++++ 5 files changed, 41 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/CopyChatMessageCommand.java diff --git a/Habitica/res/menu/chat_message.xml b/Habitica/res/menu/chat_message.xml index 3f9d520ba..e9e41012e 100644 --- a/Habitica/res/menu/chat_message.xml +++ b/Habitica/res/menu/chat_message.xml @@ -9,6 +9,11 @@ android:icon="@drawable/ic_action_chat" android:title="@string/send_pm" /> + hourglasses gold gold + Message copied to Clipboard + Copy to clipboard diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/CopyChatMessageCommand.java b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/CopyChatMessageCommand.java new file mode 100644 index 000000000..575fff4f0 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/CopyChatMessageCommand.java @@ -0,0 +1,12 @@ +package com.habitrpg.android.habitica.events.commands; + +import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; + +/** + * Created by jjbillings on 7/27/16. + */ +public class CopyChatMessageCommand extends ChatMessageCommandBase { + public CopyChatMessageCommand(String groupId, ChatMessage chatMessage) { + super(groupId, chatMessage); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java index 8d82c4c01..31a39fc0d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.adapter.social; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.events.commands.CopyChatAsTodoCommand; +import com.habitrpg.android.habitica.events.commands.CopyChatMessageCommand; import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand; import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand; import com.habitrpg.android.habitica.events.commands.OpenNewPMActivityCommand; @@ -446,6 +447,12 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter Date: Thu, 4 Aug 2016 12:35:05 +0200 Subject: [PATCH 39/43] fix remindersmanager test --- .../habitrpg/android/habitica/helpers/RemindersManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/RemindersManagerTest.java b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/RemindersManagerTest.java index a8620a660..31feb3fa6 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/RemindersManagerTest.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/RemindersManagerTest.java @@ -12,7 +12,7 @@ public class RemindersManagerTest { @Test public void itCreatesRemindersItemFromDateString() { - RemindersManager remindersManager = new RemindersManager(); + RemindersManager remindersManager = new RemindersManager("habits"); // RemindersItem remindersItem = remindersManager.createReminderFromDateString("dd MMMM yyyy HH:mm:ss") From bcdf638bf0b33dd1138233fc9a4156bddad66787 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 17:06:23 +0200 Subject: [PATCH 40/43] fix opening login screen while in debug mode --- .../android/habitica/HabiticaApplication.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 d04f76f60..a6b88ca18 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -25,6 +25,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.database.DatabaseErrorHandler; @@ -182,7 +183,17 @@ public class HabiticaApplication extends MultiDexApplication { } private void setupFacebookSdk() { - if (!BuildConfig.DEBUG) { + String fbApiKey = null; + try { + ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); + Bundle bundle = ai.metaData; + fbApiKey = bundle.getString(FacebookSdk.APPLICATION_ID_PROPERTY); + } catch (PackageManager.NameNotFoundException e) { + Log.e("FB Error", "Failed to load meta-data, NameNotFound: " + e.getMessage()); + } catch (NullPointerException e) { + Log.e("FB Error", "Failed to load meta-data, NullPointer: " + e.getMessage()); + } + if (fbApiKey != null) { FacebookSdk.sdkInitialize(getApplicationContext()); } } From b1fa0e40ddd318c4aac791a998a21b055e9e2eda Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 19:27:11 +0200 Subject: [PATCH 41/43] set application id in gradle file --- Habitica/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 9d963d81c..9da4777f2 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -150,6 +150,10 @@ android { compileSdkVersion 24 buildToolsVersion "23.0.3" + defaultConfig { + applicationId "com.habitrpg.android.habitica" + } + lintOptions { abortOnError false } From 5db9a629d88f5618c09d32a92f983556ff249dd0 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 19:27:29 +0200 Subject: [PATCH 42/43] fix api tests --- Habitica/build.gradle | 18 +++++++++--------- .../habitrpg/android/habitica/APIHelper.java | 10 ++++++---- .../android/habitica/api/SocialAPITests.java | 5 +++-- .../android/habitica/api/TagAPITests.java | 2 +- .../android/habitica/api/TaskAPITests.java | 2 +- .../android/habitica/api/UserAPITests.java | 2 +- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 9da4777f2..6639214d8 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -71,11 +71,11 @@ dependencies { compile('com.mikepenz:materialdrawer:5.3.6@aar') { transitive = true } - compile 'com.android.support:appcompat-v7:24.0.0' - compile 'com.android.support:design:24.0.0' - compile 'com.android.support:gridlayout-v7:24.0.0' - compile 'com.android.support:recyclerview-v7:24.0.0' - compile 'com.android.support:preference-v14:24.0.0' + compile 'com.android.support:appcompat-v7:24.1.1' + compile 'com.android.support:design:24.1.1' + compile 'com.android.support:gridlayout-v7:24.1.1' + compile 'com.android.support:recyclerview-v7:24.1.1' + compile 'com.android.support:preference-v14:24.1.1' compile 'com.android.support:multidex:1.0.1' // Image Loading/Caching @@ -128,13 +128,13 @@ dependencies { exclude module: 'bolts-android' } //Tests - compile 'com.android.support:appcompat-v7:23.0' + compile 'com.android.support:appcompat-v7:24.1.1' testCompile "junit:junit:4.10" testCompile "org.assertj:assertj-core:1.7.0" testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' - testCompile "org.robolectric:robolectric:3.2-SNAPSHOT" - testCompile 'org.robolectric:shadows-multidex:3.0' - testCompile "org.robolectric:shadows-support-v4:3.0" + testCompile "org.robolectric:robolectric:3.1" + testCompile 'org.robolectric:shadows-multidex:3.1' + testCompile "org.robolectric:shadows-support-v4:3.1" testCompile "org.mockito:mockito-core:1.10.19" //Leak Detection diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 726d35299..464743355 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -166,12 +166,14 @@ public class APIHelper implements Action1 { .addNetworkInterceptor(chain -> { Request original = chain.request(); if (this.hostConfig.getUser() != null) { - Request request = original.newBuilder() + Request.Builder builder = original.newBuilder() .header("x-api-key", this.hostConfig.getApi()) .header("x-api-user", this.hostConfig.getUser()) - .header("x-client", "habitica-android") - .header("user-agent", userAgent) - .method(original.method(), original.body()) + .header("x-client", "habitica-android"); + if (userAgent != null) { + builder = builder.header("user-agent", userAgent); + } + Request request = builder.method(original.method(), original.body()) .build(); return chain.proceed(request); } else { diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/SocialAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/SocialAPITests.java index c5f6214c9..bf57867f3 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/api/SocialAPITests.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/SocialAPITests.java @@ -10,6 +10,7 @@ import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; +import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import android.os.Build; @@ -23,8 +24,8 @@ import rx.observers.TestSubscriber; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; -@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) -@RunWith(RobolectricGradleTestRunner.class) +@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) +@RunWith(RobolectricTestRunner.class) public class SocialAPITests extends BaseAPITests { List messagesIDs; diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/TagAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TagAPITests.java index 2e941984e..498bedba6 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/api/TagAPITests.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TagAPITests.java @@ -12,7 +12,7 @@ import android.os.Build; import rx.observers.TestSubscriber; -@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) +@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) @RunWith(RobolectricGradleTestRunner.class) public class TagAPITests extends BaseAPITests { diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java index b67faf621..82488ff96 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java @@ -22,7 +22,7 @@ import rx.observers.TestSubscriber; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) +@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) @RunWith(RobolectricGradleTestRunner.class) public class TaskAPITests extends BaseAPITests { diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java index 7b3d394a9..215872af2 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java @@ -22,7 +22,7 @@ import rx.observers.TestSubscriber; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotSame; -@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) +@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) @RunWith(RobolectricGradleTestRunner.class) public class UserAPITests extends BaseAPITests { From d18b2653f6690b99f418cef66e9d66a8d4a2bc19 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 4 Aug 2016 20:11:46 +0200 Subject: [PATCH 43/43] update translations --- Habitica/AndroidManifest.xml | 10 +++++----- Habitica/res/values-fr/strings.xml | 13 ++++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index acf754425..2c3a3d537 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ @@ -125,10 +125,10 @@ - - - - + + + + diff --git a/Habitica/res/values-fr/strings.xml b/Habitica/res/values-fr/strings.xml index d955cc841..ed038d36d 100644 --- a/Habitica/res/values-fr/strings.xml +++ b/Habitica/res/values-fr/strings.xml @@ -329,5 +329,16 @@ Pour commencer, quels aspects de votre vie souhaitez-vous améliorer ? Marché Voyageurs temporels Boutique saisonnière - Vous n\'avez pas de message dans la boite de réception. Vous pouvez envoyer un nouveau message à partir des discussions publiques de chaque personne. + Vous n\'avez pas de message dans votre boîte de réception. Vous pouvez envoyer un nouveau message à partir des messages de discussion publics de chaque personne. + Débloquer en invitant des ami•e•s + Pas assez d\'or + Vous n\'avez pas besoin d\'acheter une potion de santé + %1$s acheté avec succès + Confirmer l\'achat + Acheter %1$s for %2$s %3$s + gemme + sablier + sabliers + or + or