Merge pull request #8677 from Stypox/fix-picasso-target
Keep strong references to Picasso notification icon loading targets
This commit is contained in:
commit
ce6f3ca5df
|
@ -4,6 +4,8 @@ import android.app.NotificationManager
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
@ -11,6 +13,8 @@ import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.squareup.picasso.Picasso
|
||||||
|
import com.squareup.picasso.Target
|
||||||
import org.schabi.newpipe.R
|
import org.schabi.newpipe.R
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem
|
||||||
import org.schabi.newpipe.local.feed.service.FeedUpdateInfo
|
import org.schabi.newpipe.local.feed.service.FeedUpdateInfo
|
||||||
|
@ -27,6 +31,8 @@ class NotificationHelper(val context: Context) {
|
||||||
Context.NOTIFICATION_SERVICE
|
Context.NOTIFICATION_SERVICE
|
||||||
) as NotificationManager
|
) as NotificationManager
|
||||||
|
|
||||||
|
private val iconLoadingTargets = ArrayList<Target>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a notification about new streams from a single channel.
|
* Show a notification about new streams from a single channel.
|
||||||
* Opening the notification will open the corresponding channel page.
|
* Opening the notification will open the corresponding channel page.
|
||||||
|
@ -77,10 +83,29 @@ class NotificationHelper(val context: Context) {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
PicassoHelper.loadNotificationIcon(data.avatarUrl) { bitmap ->
|
// a Target is like a listener for image loading events
|
||||||
bitmap?.let { builder.setLargeIcon(it) } // set only if != null
|
val target = object : Target {
|
||||||
manager.notify(data.pseudoId, builder.build())
|
override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
|
||||||
|
builder.setLargeIcon(bitmap) // set only if there is actually one
|
||||||
|
manager.notify(data.pseudoId, builder.build())
|
||||||
|
iconLoadingTargets.remove(this) // allow it to be garbage-collected
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) {
|
||||||
|
manager.notify(data.pseudoId, builder.build())
|
||||||
|
iconLoadingTargets.remove(this) // allow it to be garbage-collected
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPrepareLoad(placeHolderDrawable: Drawable) {
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add the target to the list to hold a strong reference and prevent it from being garbage
|
||||||
|
// collected, since Picasso only holds weak references to targets
|
||||||
|
iconLoadingTargets.add(target)
|
||||||
|
|
||||||
|
PicassoHelper.loadNotificationIcon(data.avatarUrl).into(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -5,7 +5,6 @@ import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -14,7 +13,6 @@ import com.squareup.picasso.LruCache;
|
||||||
import com.squareup.picasso.OkHttp3Downloader;
|
import com.squareup.picasso.OkHttp3Downloader;
|
||||||
import com.squareup.picasso.Picasso;
|
import com.squareup.picasso.Picasso;
|
||||||
import com.squareup.picasso.RequestCreator;
|
import com.squareup.picasso.RequestCreator;
|
||||||
import com.squareup.picasso.Target;
|
|
||||||
import com.squareup.picasso.Transformation;
|
import com.squareup.picasso.Transformation;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
@ -22,7 +20,6 @@ import org.schabi.newpipe.R;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
|
@ -120,6 +117,10 @@ public final class PicassoHelper {
|
||||||
return picassoInstance.load(url);
|
return picassoInstance.load(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RequestCreator loadNotificationIcon(final String url) {
|
||||||
|
return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) {
|
public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) {
|
||||||
// scale down the notification thumbnail for performance
|
// scale down the notification thumbnail for performance
|
||||||
|
@ -170,27 +171,6 @@ public final class PicassoHelper {
|
||||||
return picassoCache.get(imageUrl + "\n");
|
return picassoCache.get(imageUrl + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void loadNotificationIcon(final String url,
|
|
||||||
final Consumer<Bitmap> bitmapConsumer) {
|
|
||||||
loadImageDefault(url, R.drawable.ic_newpipe_triangle_white)
|
|
||||||
.into(new Target() {
|
|
||||||
@Override
|
|
||||||
public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) {
|
|
||||||
bitmapConsumer.accept(bitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBitmapFailed(final Exception e, final Drawable errorDrawable) {
|
|
||||||
bitmapConsumer.accept(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPrepareLoad(final Drawable placeHolderDrawable) {
|
|
||||||
// Nothing to do
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static RequestCreator loadImageDefault(final String url, final int placeholderResId) {
|
private static RequestCreator loadImageDefault(final String url, final int placeholderResId) {
|
||||||
return loadImageDefault(url, placeholderResId, true);
|
return loadImageDefault(url, placeholderResId, true);
|
||||||
|
|
Loading…
Reference in New Issue