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")