package com.marverenic.music.widget; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import androidx.annotation.ColorInt; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import android.widget.RemoteViews; import com.marverenic.music.R; import com.marverenic.music.model.Song; import com.marverenic.music.player.PlayerController; import com.marverenic.music.ui.library.LibraryActivity; import rx.Observable; import timber.log.Timber; public class CompactWidget extends BaseWidget { @Override protected void onUpdate(Context context) { PlayerController.Binding binding = mPlayerController.bind(); Observable.just(createBaseView(context)) .flatMap(views -> mPlayerController.getNowPlaying().take(1) .map(song -> setSong(context, views, song))) .flatMap(views -> mPlayerController.isPlaying().take(1) .map(isPlaying -> setPlaying(views, isPlaying))) .subscribe(views -> updateAllInstances(context, views), throwable -> Timber.e(throwable, "Failed to update widget"), () -> mPlayerController.unbind(binding)); } private RemoteViews createBaseView(Context context) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_compact); Intent launcherIntent = LibraryActivity.newNowPlayingIntent(context); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, launcherIntent, 0); views.setOnClickPendingIntent(R.id.widget_compact_container, pendingIntent); views.setOnClickPendingIntent(R.id.widget_next, getSkipNextIntent(context)); views.setOnClickPendingIntent(R.id.widget_play_pause, getPlayPauseIntent(context)); views.setOnClickPendingIntent(R.id.widget_previous, getSkipPreviousIntent(context)); @ColorInt int buttonColor = ContextCompat.getColor(context, R.color.widget_button); views.setInt(R.id.widget_next, "setColorFilter", buttonColor); views.setInt(R.id.widget_play_pause, "setColorFilter", buttonColor); views.setInt(R.id.widget_previous, "setColorFilter", buttonColor); return views; } private static RemoteViews setSong(Context context, RemoteViews views, @Nullable Song song) { if (song == null) { String defaultSongName = context.getString(R.string.nothing_playing); views.setTextViewText(R.id.widget_compact_title, defaultSongName); views.setTextViewText(R.id.widget_compact_detail, ""); } else { views.setTextViewText(R.id.widget_compact_title, song.getSongName()); views.setTextViewText(R.id.widget_compact_detail, song.getArtistName() + " – " + song.getAlbumName()); } return views; } private static RemoteViews setPlaying(RemoteViews views, boolean isPlaying) { views.setImageViewResource(R.id.widget_play_pause, (isPlaying) ? R.drawable.ic_pause_36dp : R.drawable.ic_play_arrow_36dp); return views; } }