diff options
Diffstat (limited to 'StoneIsland/plugins/cordova-plugin-firebase/src/android/FirebasePluginMessagingService.java')
| -rwxr-xr-x | StoneIsland/plugins/cordova-plugin-firebase/src/android/FirebasePluginMessagingService.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/StoneIsland/plugins/cordova-plugin-firebase/src/android/FirebasePluginMessagingService.java b/StoneIsland/plugins/cordova-plugin-firebase/src/android/FirebasePluginMessagingService.java new file mode 100755 index 00000000..a42ce60e --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-firebase/src/android/FirebasePluginMessagingService.java @@ -0,0 +1,127 @@ +package org.apache.cordova.firebase; + +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.os.Bundle; +import android.support.v4.app.NotificationCompat; +import android.util.Log; +import android.app.Notification; +import android.text.TextUtils; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; + +import java.util.Map; +import java.util.Random; + +public class FirebasePluginMessagingService extends FirebaseMessagingService { + + private static final String TAG = "FirebasePlugin"; + + /** + * Called when message is received. + * + * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. + */ + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + // [START_EXCLUDE] + // There are two types of messages data messages and notification messages. Data messages are handled + // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type + // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app + // is in the foreground. When the app is in the background an automatically generated notification is displayed. + // When the user taps on the notification they are returned to the app. Messages containing both notification + // and data payloads are treated as notification messages. The Firebase console always sends notification + // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options + // [END_EXCLUDE] + + // TODO(developer): Handle FCM messages here. + // Not getting messages here? See why this may be: https://goo.gl/39bRNJ + String title; + String text; + String id; + if (remoteMessage.getNotification() != null) { + title = remoteMessage.getNotification().getTitle(); + text = remoteMessage.getNotification().getBody(); + id = remoteMessage.getMessageId(); + } else { + title = remoteMessage.getData().get("title"); + text = remoteMessage.getData().get("text"); + id = remoteMessage.getData().get("id"); + } + + if(TextUtils.isEmpty(id)){ + Random rand = new Random(); + int n = rand.nextInt(50) + 1; + id = Integer.toString(n); + } + + Log.d(TAG, "From: " + remoteMessage.getFrom()); + Log.d(TAG, "Notification Message id: " + id); + Log.d(TAG, "Notification Message Title: " + title); + Log.d(TAG, "Notification Message Body/Text: " + text); + + // TODO: Add option to developer to configure if show notification when app on foreground + if (!TextUtils.isEmpty(text) || !TextUtils.isEmpty(title) || (!remoteMessage.getData().isEmpty())) { + boolean showNotification = (FirebasePlugin.inBackground() || !FirebasePlugin.hasNotificationsCallback()) && (!TextUtils.isEmpty(text) || !TextUtils.isEmpty(title)); + sendNotification(id, title, text, remoteMessage.getData(), showNotification); + } + } + + private void sendNotification(String id, String title, String messageBody, Map<String, String> data, boolean showNotification) { + Bundle bundle = new Bundle(); + for (String key : data.keySet()) { + bundle.putString(key, data.get(key)); + } + if (showNotification) { + Intent intent = new Intent(this, OnNotificationOpenReceiver.class); + intent.putExtras(bundle); + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id.hashCode(), intent, + PendingIntent.FLAG_UPDATE_CURRENT); + + Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) + .setContentTitle(title) + .setContentText(messageBody) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody)) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setContentIntent(pendingIntent); + + int resID = getResources().getIdentifier("notification_icon", "drawable", getPackageName()); + if (resID != 0) { + notificationBuilder.setSmallIcon(resID); + } else { + notificationBuilder.setSmallIcon(getApplicationInfo().icon); + } + + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) + { + int accentID = getResources().getIdentifier("accent", "color", getPackageName()); + notificationBuilder.setColor(getResources().getColor(accentID, null)); + } + + Notification notification = notificationBuilder.build(); + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ + int iconID = android.R.id.icon; + int notiID = getResources().getIdentifier("notification_big", "drawable", getPackageName()); + if (notification.contentView != null) { + notification.contentView.setImageViewResource(iconID, notiID); + } + } + NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + notificationManager.notify(id.hashCode(), notification); + } else { + bundle.putBoolean("tap", false); + bundle.putString("title", title); + bundle.putString("body", messageBody); + FirebasePlugin.sendNotification(bundle); + } + } +} |
