package com.jdroid.android.firebase.fcm; import com.google.firebase.messaging.RemoteMessage; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.context.SecurityContext; import com.jdroid.android.firebase.fcm.notification.NotificationFcmMessage; import com.jdroid.android.utils.AndroidUtils; import com.jdroid.android.utils.AppUtils; import com.jdroid.java.collections.Lists; import com.jdroid.java.utils.LoggerUtils; import com.jdroid.java.utils.NumberUtils; import org.slf4j.Logger; import java.util.List; public abstract class AbstractFcmMessageResolver implements FcmMessageResolver { private final static Logger LOGGER = LoggerUtils.getLogger(AbstractFcmMessageResolver.class); public static final String MESSAGE_KEY_EXTRA = "messageKey"; public static final String USER_ID_KEY = "userIdKey"; public static final String MIN_DEVICE_OS_VERSION_KEY = "minDeviceOsVersion"; public static final String MIN_APP_VERSION_CODE_KEY = "minAppVersionCode"; private List<FcmMessage> fcmMessages; public AbstractFcmMessageResolver(List<FcmMessage> fcmMessages) { this.fcmMessages = fcmMessages; if (includeNotificationFcmMessage()) { this.fcmMessages.add(createNotificationFcmMessage()); } } public AbstractFcmMessageResolver(FcmMessage... fcmMessages) { this(Lists.newArrayList(fcmMessages)); } protected Boolean includeNotificationFcmMessage() { return true; } protected NotificationFcmMessage createNotificationFcmMessage() { return new NotificationFcmMessage(); } @Override public FcmMessage resolve(RemoteMessage remoteMessage) { String messageKey = remoteMessage.getData().get(getMessageKeyExtraName()); LOGGER.debug("FCM message received. / Message Key: " + messageKey); Long minAppVersionCode = NumberUtils.getLong(remoteMessage.getData().get(MIN_APP_VERSION_CODE_KEY), 0L); if (AppUtils.getVersionCode() >= minAppVersionCode) { Long minDeviceOsVersion = NumberUtils.getLong(remoteMessage.getData().get(MIN_DEVICE_OS_VERSION_KEY), 0L); if (AndroidUtils.getApiLevel() >= minDeviceOsVersion) { for (FcmMessage each : fcmMessages) { if (each.getMessageKey().equalsIgnoreCase(messageKey)) { Long userId = NumberUtils.getLong(remoteMessage.getData().get(USER_ID_KEY)); // We should ignore messages received for previously logged users if ((userId != null) && (!SecurityContext.get().isAuthenticated() || !SecurityContext.get().getUser().getId().equals(userId))) { LOGGER.warn("The FCM message is ignored because it was sent to another user: " + userId); onNotAuthenticatedUser(userId); return null; } return each; } } AbstractApplication.get().getExceptionHandler().logWarningException("The FCM message key [" + messageKey + "] is unknown"); } else { LOGGER.debug("Ignoring FCM message [" + messageKey + "]. minDeviceOsVersion: " + minDeviceOsVersion); } } else { LOGGER.debug("Ignoring FCM message [" + messageKey + "]. minAppVersionCode: " + minAppVersionCode); } return null; } protected String getMessageKeyExtraName() { return MESSAGE_KEY_EXTRA; } protected abstract void onNotAuthenticatedUser(Long userId); }