From dd366a8337fc6b2bfb6b6510cbc5f3cb44cfbeea Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 30 Jun 2016 17:02:26 -0500 Subject: [PATCH] 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);