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