Hot questions for Using Glide in android notifications

Top 10 Java Open Source / Glide / android notifications

Question:

I have been trying to show a .gif image inside my custom notification using Glide library. I am only able to show static image on the notification panel.

    RemoteViews collapsedView = new RemoteViews(getPackageName(), R.layout.notification_collapsed);
    RemoteViews expandedView = new RemoteViews(getPackageName(), R.layout.notification_expanded);

    collapsedView.setTextViewText(R.id.text_view_collapsed_1,"Hello World!");


    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_launcher_background)
            .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
            .setCustomContentView(collapsedView)
            .setCustomBigContentView(expandedView);

    final Notification notification = mBuilder.build();


    notificationManager.notify(NOTIFICATION_ID,notification);

    notificationTarget = new NotificationTarget(
            getApplicationContext(),
            R.id.image_view_expanded,
            expandedView,
            notification,
            NOTIFICATION_ID
            );

    Glide.with(MainActivity.this)
            .asBitmap()
            .load(R.drawable.giphy)
            .into(notificationTarget);

The drawable is a .gif file. When the notification pops up it shows a static image as I am using .asBitmap(). I tried using

Glide.with(MainActivity.this)
            .asGif()
            .load(R.drawable.giphy)
            .into(notificationTarget);

but i am getting an error "Cannot resolve method 'into(NotificationTarget)'". I have looked around for solutions but i was unable to find one. So how can I show a GIF file with glide in android's notification panel? Is it possible?


Answer:

Android doesn't support GIF and Videos in notification because notification is built using RemoteViews and RemoteViews doesn't support GIF or Videos.

Also, Glide maintainer answered a similar question here. I am quoting the answer.

It doesn't look like RemoteViews supports setting a Drawable? https://developer.android.com/reference/android/widget/RemoteViews.html.

If there's a way to set an animated drawable in a notification in general, you can probably find a way to do it with a custom Target in Glide.

Question:

I'm creating a simple notification with playback buttons for my audio player. But I have trouble setting the bitmap image for .setLargeIcon(). I'm trying to set it using glide. The thing is this image changes as user skips to next song, so this is pretty much a dynamic view. The image sometimes appears (for a split second), when I change the song or pause it. I'll be glad if you guys could help me!

Code:

Build notification:

    private void buildNotifications(PlaybackStatus playbackStatus){

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){

        createChannel();
    }



    int notificationAction = android.R.drawable.ic_media_pause;//needs to be initialized
    PendingIntent play_pauseAction = null;

    //Build a new notification according to the current state of the MediaPlayer
    if (playbackStatus == PlaybackStatus.PLAYING) {
        notificationAction = android.R.drawable.ic_media_pause;
        //create the pause action
        play_pauseAction = playbackAction(1);
    } else if (playbackStatus == PlaybackStatus.PAUSED) {
        notificationAction = android.R.drawable.ic_media_play;
        //create the play action
        play_pauseAction = playbackAction(0);
    }



   final NotificationCompat.Builder notiB = new NotificationCompat.Builder(this,CHANNEL_ID);
    notiB.setShowWhen(false);
    notiB.setStyle(new MediaStyle()
            .setMediaSession(mediaSession.getSessionToken())
            .setShowActionsInCompactView(0,1,2));
    notiB.setSmallIcon(R.drawable.play_song);
    Glide.with(this).asBitmap().load(songInfoModelService.getAlbumIDArtwork()).into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {

            notiB.setLargeIcon(resource);
        }
    });
    notiB.setContentTitle(songInfoModelService.getSongName());
    notiB.setContentText(songInfoModelService.getArtistName());
    notiB.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3));
    notiB.addAction(notificationAction, "pause", play_pauseAction);
    notiB.addAction(android.R.drawable.ic_media_next, "next", playbackAction(2));

    notification = notiB.build();
    notificationManager.notify(NOTIFICATION_ID,notification);


}

Answer:

This will not work synchronously . Glide.with(this).asBitmap().load() is an Asynchronous request so it will execute on separate thread regardless of your current thread . So in this case notiB.setLargeIcon(resource) never will get called synchronously.

Solution can be Show the notification inside onResourceReady(). Once you download the Bitmap then build the Notification .