Added reciever for responding to local noitfication actions

This commit is contained in:
Keith Holliday 2016-06-30 17:02:26 -05:00
parent 9329def499
commit dd366a8337
6 changed files with 114 additions and 14 deletions

View file

@ -122,6 +122,13 @@
<receiver android:process=":remote" android:name=".NotificationPublisher" />
<receiver android:process=":remote" android:name=".receivers.TaskReceiver"></receiver>
<receiver android:name=".receivers.LocalNotificationActionReceiver">
<intent-filter>
<action android:name="@string/accept_party_invite"/>
<action android:name="@string/reject_party_invite"/>
</intent-filter>
</receiver>
<receiver android:name=".receivers.TaskAlarmBootReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED"/>

View file

@ -374,4 +374,9 @@ To start, which parts of your life do you want to improve?</string>
<string name="hourglasses">hourglasses</string>
<string name="gold_singular">gold</string>
<string name="gems_plural">gold</string>
<!-- Local notification actions -->
<string name="accept_party_invite">ACCEPT_PARTY_INVITE</string>
<string name="reject_party_invite">ACCEPT_PARTY_INVITE</string>
</resources>

View file

@ -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);
}

View file

@ -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());
}
}

View file

@ -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 -> {});
}
}
}

View file

@ -205,6 +205,9 @@ public interface ApiService {
@POST("groups/{gid}/invite")
Observable<Void> inviteToGroup(@Path("gid") String groupId, @Body Map<String, Object> inviteData);
@POST("groups/{gid}/reject-invite")
Observable<Void> rejectGroupInvite(@Path("gid") String groupId);
@POST("groups/{gid}/quests/accept")
Observable<Void> acceptQuest(@Path("gid") String groupId);