I am retrieving the notification from firebase cloud messaging into my android app. but the problem is when my app is opened or in running state in that case only my app is retrieving the notification. if I am not using my app or my app is not opened and I send any push notification that notification is not retrieving inside my app.
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
mFirestore = FirebaseFirestore.getInstance();
if (remoteMessage.getData() != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
sendNotificationAPI26(remoteMessage);
else
sendNotification(remoteMessage);
}
}
private void sendNotification(RemoteMessage remoteMessage) {
isNotificationMatching = false;
Intent intent = new Intent(this, Dashboard.class);
intent.putExtra("notificationFragment", "showNotifications");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final Map<String, String> data = remoteMessage.getData();
String title = data.get("title");
String description = data.get("description");
String url = data.get("url");
String code = data.get("code");
String actual_price = data.get("actual_price");
String deal_price = data.get("deal_price");
String key = data.get("key");
final String id = data.get("id");
mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if (document.getData().get("id").equals(id)) {
isNotificationMatching = true;
break;
}
}
if (!isNotificationMatching) {
postDataToFirebaseServer(data);
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.app_logo)
.setContentText(title)
.setAutoCancel(true)
.setSound(defaultSoundUri);
builder.setContentIntent(pendingIntent);
NotificationManager noti = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
noti.notify(new Random().nextInt(), builder.build());
}
private void postDataToFirebaseServer(Map<String, String> data) {
Map<String,Object> postDataMap = new HashMap<>();
postDataMap.put("title", data.get("title"));
postDataMap.put("description", data.get("description"));
postDataMap.put("url", data.get("url"));
postDataMap.put("id", data.get("id"));
postDataMap.put("code", data.get("code"));
postDataMap.put("actual_price", data.get("actual_price"));
postDataMap.put("deal_price", data.get("deal_price"));
postDataMap.put("key", data.get("key"));
postDataMap.put("timestamp", FieldValue.serverTimestamp());
mFirestore.collection("notifications").add(postDataMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
// Toast.makeText(getA.this, "Success", Toast.LENGTH_SHORT);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String error = e.getMessage();
// Toast.makeText(Testing.this, "Failed", Toast.LENGTH_SHORT);
}
});
}
private void sendNotificationAPI26(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, Dashboard.class);
intent.putExtra("notificationFragment", "showNotifications");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final Map<String, String> data = remoteMessage.getData();
String title = data.get("title");
String description = data.get("description");
String url = data.get("url");
String code = data.get("code");
String actual_price = data.get("actual_price");
String deal_price = data.get("deal_price");
String key = data.get("key");
final String id = data.get("id");
mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if (document.getData().get("id").equals(id)) {
isNotificationMatching = true;
break;
}
}
if (!isNotificationMatching) {
postDataToFirebaseServer(data);
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
NotificationHelper helper;
Notification.Builder builder;
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
helper = new NotificationHelper(this);
builder = helper.getLootBoxNotification(title, description, url, id, code, actual_price, deal_price, key, defaultSoundUri);
helper.getManager().notify(new Random().nextInt(), builder.build());
builder.setContentIntent(pendingIntent);
}
}
I want when my app is closed or not in running state at that time any push notification is sent that will also retrieve inside the application.