Zeus
Zeus

Reputation: 6566

Notification with buttons does not handle events

I have the following service which shows the notification in my application, it shows up fine so far, but it does not handle the click events some how. How do I handle these?

Requirement: I'd like this notification to be present as long as the video is playing. I'm hoping this is the way to do it.

public class CustomNotifications extends Service implements
        INotificationService {

    private static CustomNotifications instance;

    private Context ctx;
    private NotificationManager mNotificationManager;

    private String start = "play";
    private String stop = "stop";

    private VideoCastManager mCastManager;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (null != intent) {
            String action = intent.getAction();
            if (action != null) {
                if (action.equals(start)) {

                } else if (action.equals(stop)) {

                }
            }
        }
        return 1;
    }

    public void startNofication(Activity activity, String text) {
        ctx = this.getApplicationContext();
        Intent resultIntent = new Intent(this, FullscreenActivity.class);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this,
                0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this).setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Media Cast").setTicker(text)
                .setAutoCancel(false).setOngoing(true)
                .setContentIntent(resultPendingIntent);

        RemoteViews contentView = new RemoteViews(ctx.getPackageName(),
                com.me.app.mediacast.R.layout.notification_layout);

        contentView.setTextViewText(
                com.me.app.mediacast.R.id.notifcation_label, text);
        contentView.setImageViewResource(
                com.me.app.mediacast.R.id.notification_button,
                R.drawable.ic_av_play_dark);
        // set the button listeners
        setListeners(contentView);

        mBuilder.setContent(contentView);

        int mNotificationId = 001;
        // NotificationManager mNotifyMgr = (NotificationManager) activity
        // .getSystemService(activity.NOTIFICATION_SERVICE);
        // mNotifyMgr.notify(mNotificationId, mBuilder.build());
        startForeground(mNotificationId, mBuilder.build());
    }

    private void setListeners(RemoteViews contentView) {
        Intent radio = new Intent(start);
        radio.setPackage(getPackageName());
        PendingIntent pRadio = PendingIntent.getActivity(this, 0, radio, 0);
        contentView.setOnClickPendingIntent(
                com.me.app.mediacast.R.id.notification_button, pRadio);
    }

    @Override
    public boolean stopService() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean startService(String text) {
        startNofication((Activity) ContentHelper.getCurrentActivity(), text);
        return true;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            mCastManager = VideoCastManager.getInstance();
        } catch (CastException e) {
            e.printStackTrace();
        }
        mCastManager.setNottificationService(this);
        mCastManager.startNotificationService();
    }
}

the following is the layout xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black" >

    <TextView
        android:id="@+id/notifcation_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/btn1" />

    <TextView
        android:id="@+id/notifcation_subtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/notifcation_label" />

    <ImageButton
        android:id="@+id/notification_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_margin="10dp"
        android:layout_marginRight="19dp" />

</RelativeLayout>

I'm just trying to get this click even handles so, I can show the button toggle to pause or play depending on the status of the application.

Thanks in advance for looking this.

Upvotes: 5

Views: 848

Answers (1)

Zeus
Zeus

Reputation: 6566

I have solved it using the following in a 'service'. Also dont forget to add intent filters in the manifest file.

    Intent resultIntent = new Intent(this, FullscreenActivity.class);
    resultIntent.setAction(Intent.ACTION_MAIN);
    resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    PendingIntent pintent = PendingIntent.getActivity(ctx, 0, resultIntent,
            0);
    PendingIntent pendingIntent = null;
    Intent intent = null;
    // Inflate a remote view with a layout which you want to display in the
    // notification bar.
    if (mRemoteViews == null) {
        mRemoteViews = new RemoteViews(getPackageName(),
                R.layout.custom_notification);
    }

    /**
     * add handlers to the buttons
     * 
     */
    Uri uri = info.getMetadata().getImages().get(0).getUrl();
    Bitmap bmp = null;
    if (uri != null) {
        URL url;
        try {
            url = new URL(uri.toString());
            bmp = BitmapFactory.decodeStream(url.openStream());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    if (bmp != null) {
        mRemoteViews.setImageViewBitmap(R.id.iconView, bmp);
    }
    if (isPlaying) {
        mRemoteViews.setImageViewResource(R.id.playPauseView,
                R.drawable.ic_av_pause_sm_dark);
    } else {
        mRemoteViews.setImageViewResource(R.id.playPauseView,
                R.drawable.ic_av_play_sm_dark);
    }
    mRemoteViews.setTextViewText(R.id.titleView, info.getMetadata()
            .getString(MediaMetadata.KEY_TITLE));
    intent = new Intent(play);
    pendingIntent = PendingIntent.getService(getApplicationContext(),
            REQUEST_CODE_STOP, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    mRemoteViews.setOnClickPendingIntent(R.id.playPauseView, pendingIntent);

    Intent destroy = new Intent(stop);
    PendingIntent pendingIntent1 = PendingIntent.getService(
            getApplicationContext(), REQUEST_CODE_STOP, destroy,
            PendingIntent.FLAG_UPDATE_CURRENT);

    mRemoteViews.setOnClickPendingIntent(R.id.removeView, pendingIntent1);

    /**
     * 
     * 
     */
    // Create the notification instance.
    mNotification = new NotificationCompat.Builder(getApplicationContext())
            .setSmallIcon(R.drawable.ic_launcher).setOngoing(true)
            .setWhen(System.currentTimeMillis()).setContent(mRemoteViews)
            .setContentIntent(pintent).build();

    mNotifiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    mNotifiManager.notify(NOTIFICATION_ID, mNotification);

AndroidManifest

    <intent-filter>
        <action android:name="com.me.app.mediacast.PLAY" />
        <action android:name="com.me.app.mediacast.PAUSE" />
        <action android:name="com.me.app.mediacast.STOP" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

Upvotes: 1

Related Questions