Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Receive Parse notification using custom broadcastreceiver

Am using parse notification in my app. Am receiving notification alert using GcmBroadcastReceiver. But am seeing lot of notification receiving to my app. I thought to update notification in status bar so i used custom receiver. When receiving notification through GcmBroadcastReceiver, my custom broadcastreceiver called. So in my status bar having both gcm and custom notifications. I want custom notification only. How to solve this problem?

Manifest code:

    <receiver android:name="com.parse.ParseBroadcastReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <!-- IMPORTANT: Change "com.parse.tutorials.pushnotifications" to match your app's package name. -->
            <category android:name="com.packagename" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.packagename.IncomingReceiver"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>

            <action android:name="com.packagename.UPDATE_STATUS" />
        </intent-filter>
    </receiver>

Application class:

Parse.initialize(this, "app id", "client id");

Incomingreceiver class:

 public class IncomingReceiver extends BroadcastReceiver {
    private static final int NOTIFICATION_ID = 1;
    public static int numMessages = 0;


    @Override
    public void onReceive(Context context, Intent intent) {


        try {
            String action = intent.getAction();
            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
            if (action.equalsIgnoreCase("com.packagename.UPDATE_STATUS")) {
                String title = "appname";

                if (json.has("header"))
                    title = json.getString("header");

                generateNotification(context, title, json,contenttext);
            }
        } catch (JSONException e) {
            Log.d("jsonexc", "JSONException: " + e.getMessage());
        }
    }

    private void generateNotification(Context context, String title, JSONObject json, String contenttext) {
        Intent intent = new Intent(context, NewActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);

        NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.app_icon).setContentTitle(title).setContentText("contenttext").setNumber(++numMessages);

        mBuilder.setContentIntent(contentIntent);
        mNotifM.notify(NOTIFICATION_ID, mBuilder.build());

    }
} 
like image 991
Gayathiri Avatar asked Nov 11 '14 07:11

Gayathiri


3 Answers

Replace it

<receiver
        android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
</receiver>

to your:

 <receiver
        android:name=".MyReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>

and create class:

public class MyReceiver extends ParsePushBroadcastReceiver {

    protected void onPushReceive(Context mContext, Intent intent) {
    //enter your custom here generateNotification();
    }

}
like image 53
NickUnuchek Avatar answered Oct 19 '22 02:10

NickUnuchek


Just remove super.onPushReceive(context, intent); from your custom receiver to receive a single custom notification.

like image 33
Rahul Avatar answered Oct 19 '22 01:10

Rahul


I simply added my custom PushReceiver with same package name as ParsePushReceiver

package com.parse;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;

import com.squareup.otto.EventBus;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Locale;
import java.util.Random;

public class ParsePushReceiver extends ParsePushBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        byte var5 = -1;
        switch (intentAction.hashCode()) {
            case -824874927:
                if (intentAction.equals("com.parse.push.intent.DELETE")) {
                    var5 = 1;
                }
                break;
            case -269490979:
                if (intentAction.equals("com.parse.push.intent.RECEIVE")) {
                    var5 = 0;
                }
                break;
            case 374898288:
                if (intentAction.equals("com.parse.push.intent.OPEN")) {
                    var5 = 2;
                }
        }

        switch (var5) {
            case 0:
                onPushReceive(context, intent);
                break;
            case 1:
                super.onPushDismiss(context, intent);
                break;
            case 2:
                super.onPushOpen(context, intent);
        }
    }

    @Override
    protected void onPushReceive(Context context, Intent intent) {

        try {
            JSONObject pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));

            String action;
            action = pushData.optString("action", null);

            if (action != null) {
                Bundle notification = intent.getExtras();
                Intent broadcastIntent = new Intent();
                broadcastIntent.putExtras(notification);
                broadcastIntent.setAction(action);
                broadcastIntent.setPackage(context.getPackageName());
                context.sendBroadcast(broadcastIntent);
            }

            if (pushData.has(Push.PUSH_TYPE)) {
                String type = pushData.getString(Push.PUSH_TYPE);
                switch (PushType.fromString(type)) {
                    case chat:
                    case booked:
                    case rate:
                    case unknown:
                        break;
                }
            } else {
                sendGlobalNoti(context, intent, null);
            }
        } catch (JSONException var7) {
            PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var7);
        }
    }

    private void sendChattingNoti(Context context, Intent intent, PushType pushType) {

        JSONObject pushData = this.getPushData(intent);
        if (((User) ParseUser.getCurrentUser()).getChattingNotiEnabled()
                && pushData != null
                && pushData.has("title")) {
            NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context);

            String title = pushData.optString("title", context.getString(R.string.app_name));
            String message = pushData.optString("alert", "Notification received.");

            switch (pushType) {
                case booked:
                    message = context.getString(R.string.lesson_booked_message);
                    break;
                case lessonConfirmed:
                    message = context.getString(R.string.lesson_confirmed);
                    break;
                case lessonCanceled:
                    message = context.getString(R.string.lesson_canceled);
                    break;
            }

            builder.setContentTitle(title);
            builder.setContentText(message);
            builder.setTicker(title + ": " + message);
            builder.setAutoCancel(true);
            builder.setOnlyAlertOnce(false);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_notification));
            builder.setSmallIcon(R.drawable.ic_notification);

            Intent chatIntent = new Intent(Keys.IntentKeys.ACTION_SHOW_CHAT);
            chatIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            chatIntent.addCategory(Intent.CATEGORY_DEFAULT);
            String chatId = pushData.optString(Push.PUSH_CHAT_ID, null);
            if (chatId != null)
                chatIntent.putExtra(Keys.EXTRA_CHAT_ID, chatId);

            PendingIntent pending = PendingIntent.getActivity(context, 0, chatIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pending);

            Notification noti = builder.build();
            noti.defaults |= Notification.DEFAULT_VIBRATE;
            noti.defaults |= Notification.DEFAULT_SOUND;
            noti.defaults |= Notification.DEFAULT_LIGHTS;
            nm.notify(pushType.ordinal(), noti);
        }
    }

    private void sendGlobalNoti(Context context, Intent intent, String defaultAlert) {
        // Global Notification
        if (((User) ParseUser.getCurrentUser()).getGlobalNotiEnabled()) {
            Notification notification = getNotification(context, intent, defaultAlert);
            if (notification != null)
                ParseNotificationManager.getInstance().showNotification(context, notification);
        }
    }

    protected Notification getNotification(Context context, Intent intent, String defaultAlert) {
        JSONObject pushData = this.getPushData(intent);
        if (pushData != null && (pushData.has("alert") || pushData.has("title"))) {
            String title = pushData.optString("title", ManifestInfo.getDisplayName(context));
            String alert = pushData.optString("alert", defaultAlert == null ? "Notification received." : defaultAlert);
            String tickerText = String.format(Locale.getDefault(), "%s: %s", new Object[]{title, alert});
            Bundle extras = intent.getExtras();
            Random random = new Random();
            int contentIntentRequestCode = random.nextInt();
            int deleteIntentRequestCode = random.nextInt();
            String packageName = context.getPackageName();
            Intent contentIntent = new Intent("com.parse.push.intent.OPEN");
            contentIntent.putExtras(extras);
            contentIntent.setPackage(packageName);
            Intent deleteIntent = new Intent("com.parse.push.intent.DELETE");
            deleteIntent.putExtras(extras);
            deleteIntent.setPackage(packageName);
            PendingIntent pContentIntent = PendingIntent.getBroadcast(context, contentIntentRequestCode, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            PendingIntent pDeleteIntent = PendingIntent.getBroadcast(context, deleteIntentRequestCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationCompat.Builder parseBuilder = new NotificationCompat.Builder(context);
            parseBuilder.setContentTitle(title).setContentText(alert).setTicker(tickerText).setSmallIcon(this.getSmallIconId(context, intent)).setLargeIcon(this.getLargeIcon(context, intent)).setContentIntent(pContentIntent).setDeleteIntent(pDeleteIntent).setAutoCancel(true).setDefaults(-1);
            if (alert != null && alert.length() > 38) {
                parseBuilder.setStyle((new NotificationCompat.Builder.BigTextStyle()).bigText(alert));
            }

            return parseBuilder.build();
        } else {
            return null;
        }
    }

    private JSONObject getPushData(Intent intent) {
        try {
            return new JSONObject(intent.getStringExtra("com.parse.Data"));
        } catch (JSONException var3) {
            PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var3);
            return null;
        }
    }
}
like image 20
The Finest Artist Avatar answered Oct 19 '22 01:10

The Finest Artist