package com.jdroid.android.firebase.fcm.notification;
import com.google.firebase.messaging.RemoteMessage;
import com.jdroid.android.application.AbstractApplication;
import com.jdroid.android.firebase.fcm.FcmMessage;
import com.jdroid.android.notification.NotificationBuilder;
import com.jdroid.android.notification.NotificationUtils;
import com.jdroid.java.date.DateUtils;
import com.jdroid.java.exception.UnexpectedException;
import com.jdroid.java.utils.IdGenerator;
import com.jdroid.java.utils.NumberUtils;
import com.jdroid.java.utils.StringUtils;
public class NotificationFcmMessage implements FcmMessage {
public static final String CONTENT_TITLE = "contentTitle";
public static final String CONTENT_TEXT = "contentText";
public static final String SOUND_ENABLED = "soundEnabled";
public static final String VIBRATION_ENABLED = "vibrationEnabled";
public static final String LIGHT_ENABLED = "lightEnabled";
public static final String URL = "url";
public static final String LARGE_ICON_URL = "largeIconUrl";
public static final String MESSAGE_KEY = "notificationFcmMessage";
@Override
public void handle(RemoteMessage remoteMessage) {
NotificationBuilder builder = new NotificationBuilder(getMessageKey());
initContentTitle(remoteMessage, builder);
initContentText(remoteMessage, builder);
initSmallIcon(remoteMessage, builder);
initLargeIcon(remoteMessage, builder);
initSound(remoteMessage, builder);
initVibration(remoteMessage, builder);
initLight(remoteMessage, builder);
initContentIntent(remoteMessage, builder);
builder.setPublicVisibility();
builder.setWhen(DateUtils.nowMillis());
configureBuilder(remoteMessage, builder);
NotificationUtils.sendNotification(IdGenerator.getIntId(), builder);
}
protected void initContentTitle(RemoteMessage remoteMessage, NotificationBuilder builder) {
String contentTitle = null;
if (remoteMessage.getNotification() != null) {
contentTitle = remoteMessage.getNotification().getTitle();
}
if (StringUtils.isEmpty(contentTitle)) {
contentTitle = remoteMessage.getData().get(CONTENT_TITLE);
}
if (StringUtils.isNotEmpty(contentTitle)) {
builder.setContentTitle(contentTitle);
} else {
throw new UnexpectedException("Missing " + CONTENT_TITLE + " extra for " + getMessageKey());
}
}
protected void initContentText(RemoteMessage remoteMessage, NotificationBuilder builder) {
String contentText = null;
if (remoteMessage.getNotification() != null) {
contentText = remoteMessage.getNotification().getBody();
}
if (StringUtils.isEmpty(contentText)) {
contentText = remoteMessage.getData().get(CONTENT_TEXT);
}
if (StringUtils.isNotEmpty(contentText)) {
builder.setContentText(contentText);
} else {
throw new UnexpectedException("Missing " + CONTENT_TEXT + " extra for " + getMessageKey());
}
}
protected void initSound(RemoteMessage remoteMessage, NotificationBuilder builder) {
if (NumberUtils.getBoolean(remoteMessage.getData().get(SOUND_ENABLED), false)) {
builder.setDefaultSound();
}
}
protected void initVibration(RemoteMessage remoteMessage, NotificationBuilder builder) {
if (NumberUtils.getBoolean(remoteMessage.getData().get(VIBRATION_ENABLED), false)) {
builder.setDefaultVibration();
}
}
protected void initLight(RemoteMessage remoteMessage, NotificationBuilder builder) {
if (NumberUtils.getBoolean(remoteMessage.getData().get(LIGHT_ENABLED), false)) {
builder.setWhiteLight();
}
}
protected void initContentIntent(RemoteMessage remoteMessage, NotificationBuilder builder) {
String url = null;
if (remoteMessage.getNotification() != null) {
url = remoteMessage.getNotification().getClickAction();
}
if (StringUtils.isEmpty(url)) {
url = remoteMessage.getData().get(URL);
}
if (StringUtils.isNotEmpty(url)) {
builder.setSingleTopUrl(url);
} else {
throw new UnexpectedException("Missing " + URL + " extra for " + getMessageKey());
}
}
protected void initSmallIcon(RemoteMessage remoteMessage, NotificationBuilder builder) {
builder.setSmallIcon(AbstractApplication.get().getNotificationIconResId());
}
protected void initLargeIcon(RemoteMessage remoteMessage, NotificationBuilder builder) {
String largeIconUrl = remoteMessage.getData().get(LARGE_ICON_URL);
builder.setLargeIcon(largeIconUrl);
}
protected void configureBuilder(RemoteMessage remoteMessage, NotificationBuilder notificationBuilder) {
// Do Nothing
}
@Override
public String getMessageKey() {
return MESSAGE_KEY;
}
}