Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Notification with buttons does not handle events

Tags:

android

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.

like image 508
Zeus Avatar asked Nov 11 '22 00:11

Zeus


1 Answers

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>
like image 111
Zeus Avatar answered Nov 15 '22 06:11

Zeus