Various notification code improvements

Improve builder parameters
Reorder code and extract large icon function
service.startForeground() now is also provided with service type in android versions >= Q
This commit is contained in:
Stypox 2020-09-03 21:49:21 +02:00
parent 7766fd13fd
commit 8b3a09306b
No known key found for this signature in database
GPG key ID: 4BDF1B40A49FDD23

View file

@ -5,8 +5,10 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.pm.ServiceInfo;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.os.Build;
import android.util.Log;
import androidx.annotation.DrawableRes;
@ -69,38 +71,7 @@ public final class NotificationUtil {
/////////////////////////////////////////////////////
/**
* Updates the notification, and the button icons depending on the playback state.
* On old notifications used for changes on the remoteView
*
* @param player the player currently open, to take data from
*/
synchronized void updateNotification(final VideoPlayerImpl player) {
if (DEBUG) {
Log.d(TAG, "N_ updateNotification()");
}
if (notificationBuilder == null) {
return;
}
notificationBuilder.setContentTitle(player.getVideoTitle());
notificationBuilder.setContentText(player.getUploaderName());
final boolean scaleImageToSquareAspectRatio = player.sharedPreferences.getBoolean(
player.context.getString(R.string.scale_to_square_image_in_notifications_key),
false);
if (scaleImageToSquareAspectRatio) {
notificationBuilder.setLargeIcon(
getBitmapWithSquareAspectRatio(player.getThumbnail()));
} else {
notificationBuilder.setLargeIcon(player.getThumbnail());
}
updateActions(notificationBuilder, player);
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
/**
* Creates the notification, if it does not exist already or unless forceRecreate is true.
* Creates the notification if it does not exist already or unless forceRecreate is true.
* @param player the player currently open, to take data from
* @param forceRecreate whether to force the recreation of the notification even if it already
* exists
@ -145,41 +116,58 @@ public final class NotificationUtil {
e.printStackTrace();
}
builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(player.mediaSessionManager.getSessionToken())
.setShowCancelButton(false)
.setShowActionsInCompactView(compactSlot0, compactSlot1, compactSlot2))
.setOngoing(false)
.setContentIntent(PendingIntent.getActivity(player.context, NOTIFICATION_ID,
getIntentForNotification(player), FLAG_UPDATE_CURRENT))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentTitle(player.getVideoTitle())
.setContentText(player.getUploaderName())
.setDeleteIntent(PendingIntent.getActivity(player.context, NOTIFICATION_ID,
new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT))
.setColor(ContextCompat.getColor(player.context, R.color.gray))
.setPriority(NotificationCompat.PRIORITY_HIGH);
final boolean scaleImageToSquareAspectRatio = player.sharedPreferences.getBoolean(
player.context.getString(R.string.scale_to_square_image_in_notifications_key),
false);
if (scaleImageToSquareAspectRatio) {
builder.setLargeIcon(getBitmapWithSquareAspectRatio(player.getThumbnail()));
} else {
builder.setLargeIcon(player.getThumbnail());
}
.setContentIntent(PendingIntent.getActivity(player.context, NOTIFICATION_ID,
getIntentForNotification(player), FLAG_UPDATE_CURRENT))
.setDeleteIntent(PendingIntent.getBroadcast(player.context, NOTIFICATION_ID,
new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT));
initializeNotificationSlots(player);
updateActions(builder, player);
setLargeIcon(builder, player);
return builder;
}
/**
* Updates the notification and the button icons depending on the playback state.
* @param player the player currently open, to take data from
*/
synchronized void updateNotification(final VideoPlayerImpl player) {
if (DEBUG) {
Log.d(TAG, "N_ updateNotification()");
}
if (notificationBuilder == null) {
return;
}
notificationBuilder.setContentTitle(player.getVideoTitle());
notificationBuilder.setContentText(player.getUploaderName());
updateActions(notificationBuilder, player);
setLargeIcon(notificationBuilder, player);
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
void startForegroundServiceWithNotification(final Service service) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
service.startForeground(NOTIFICATION_ID, notificationBuilder.build(),
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK);
} else {
service.startForeground(NOTIFICATION_ID, notificationBuilder.build());
}
}
boolean hasSlotWithBuffering() {
@ -364,6 +352,18 @@ public final class NotificationUtil {
// BITMAP
/////////////////////////////////////////////////////
private void setLargeIcon(final NotificationCompat.Builder builder,
final VideoPlayerImpl player) {
final boolean scaleImageToSquareAspectRatio = player.sharedPreferences.getBoolean(
player.context.getString(R.string.scale_to_square_image_in_notifications_key),
false);
if (scaleImageToSquareAspectRatio) {
builder.setLargeIcon(getBitmapWithSquareAspectRatio(player.getThumbnail()));
} else {
builder.setLargeIcon(player.getThumbnail());
}
}
private Bitmap getBitmapWithSquareAspectRatio(final Bitmap bitmap) {
return getResizedBitmap(bitmap, bitmap.getWidth(), bitmap.getWidth());
}