avoid full updates

This commit is contained in:
pca006132 2025-11-03 14:46:10 +08:00
parent b335ddec01
commit be9eec625a
3 changed files with 108 additions and 65 deletions

View file

@ -7,6 +7,7 @@ import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.RemoteViews;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
@ -36,7 +37,7 @@ public final class WidgetUpdateManager {
String title,
String artist,
String album,
Bitmap art,
Optional<Bitmap> art,
boolean playing,
boolean shuffleEnabled,
int repeatMode,
@ -54,13 +55,47 @@ public final class WidgetUpdateManager {
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(ctx, title, artist, album, art, playing,
android.widget.RemoteViews rv = choosePopulate(ctx, title, artist, album, art.orElse(null), playing,
timing.elapsedText, timing.totalText, timing.progress, shuffleEnabled, repeatMode, id);
WidgetProvider.attachIntents(ctx, rv, id, songLink, albumLink, artistLink);
mgr.updateAppWidget(id, rv);
}
}
public static void updateProgress(Context ctx,
long positionMs,
long durationMs) {
final TimingInfo timing = createTimingInfo(positionMs, durationMs);
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
for (int id : ids) {
LayoutSize size = resolveLayoutSize(ctx, id);
int layoutRes = 0;
switch (size) {
case MEDIUM:
layoutRes = R.layout.widget_layout_medium;
break;
case LARGE:
layoutRes = R.layout.widget_layout_large_short;
break;
case EXPANDED:
layoutRes = R.layout.widget_layout_large;
break;
case COMPACT:
default:
layoutRes = R.layout.widget_layout_compact;
break;
}
RemoteViews rv = new RemoteViews(ctx.getPackageName(), layoutRes);
int safeProgress = Math.max(0, Math.min(timing.progress, WidgetViewsFactory.PROGRESS_MAX));
rv.setTextViewText(R.id.time_elapsed, timing.elapsedText);
rv.setTextViewText(R.id.time_total, timing.totalText);
rv.setProgressBar(R.id.progress, WidgetViewsFactory.PROGRESS_MAX, safeProgress, false);
mgr.updateAppWidget(id, rv);
}
}
public static void pushNow(Context ctx) {
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
@ -72,43 +107,6 @@ public final class WidgetUpdateManager {
}
public static void updateFromState(Context ctx,
String title,
String artist,
String album,
Optional<Optional<Bitmap>> coverArt,
boolean playing,
boolean shuffleEnabled,
int repeatMode,
long positionMs,
long durationMs,
String songLink,
String albumLink,
String artistLink) {
final Context appCtx = ctx.getApplicationContext();
final String t = TextUtils.isEmpty(title) ? appCtx.getString(R.string.widget_not_playing) : title;
final String a = TextUtils.isEmpty(artist) ? appCtx.getString(R.string.widget_placeholder_subtitle) : artist;
final String alb = !TextUtils.isEmpty(album) ? album : "";
final boolean p = playing;
final boolean sh = shuffleEnabled;
final int rep = repeatMode;
final TimingInfo timing = createTimingInfo(positionMs, durationMs);
final String songLinkFinal = songLink;
final String albumLinkFinal = albumLink;
final String artistLinkFinal = artistLink;
AppWidgetManager mgr = AppWidgetManager.getInstance(appCtx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(appCtx, WidgetProvider4x1.class));
Bitmap resource = coverArt.filter(Optional::isPresent).map(Optional::get).orElse(null);
for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(appCtx, t, a, alb, resource, p,
timing.elapsedText, timing.totalText, timing.progress, sh, rep, id);
WidgetProvider.attachIntents(appCtx, rv, id, songLinkFinal, albumLinkFinal, artistLinkFinal);
mgr.updateAppWidget(id, rv);
}
}
public static void updateFromState(Context ctx,
String title,
String artist,
@ -131,19 +129,19 @@ public final class WidgetUpdateManager {
new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
updateFromState(ctx, title, artist, album, Optional.of(Optional.of(resource)),
updateFromState(ctx, title, artist, album, Optional.of(resource),
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink);
}
@Override
public void onLoadCleared(Drawable placeholder) {
updateFromState(ctx, title, artist, album, Optional.of(Optional.empty()),
updateFromState(ctx, title, artist, album, Optional.empty(),
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink);
}
}
);
} else {
updateFromState(ctx, title, artist, album, Optional.of(Optional.empty()),
updateFromState(ctx, title, artist, album, Optional.empty(),
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink);
}
}