Migrate to Glide (#1175)
* Replace Picasso library with Glide library tuskyapp#1082 * Replace Picasso library with Glide library tuskyapp#1082 * Update load emoji with glide * Update context used for Glide * Removed unused import * Replace deprecated SimpleTarget with CustomTarget * Fix crash at the view image fragment, remove override image size * Replace Single.create with Single.fromCallable * View image fragment refactor * Fix after merge * Try to load cached image first and show progress view on failure * Try to load cached image first and show progress view on failure
This commit is contained in:
parent
db51c23717
commit
76ce28980c
32 changed files with 260 additions and 322 deletions
|
@ -20,23 +20,26 @@ import android.graphics.Canvas;
|
|||
import android.graphics.Paint;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.SpannedString;
|
||||
import android.text.style.ReplacementSpan;
|
||||
import android.view.View;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.request.target.CustomTarget;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
import com.bumptech.glide.request.transition.Transition;
|
||||
import com.keylesspalace.tusky.entity.Emoji;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.Target;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class CustomEmojiHelper {
|
||||
|
||||
/**
|
||||
|
@ -55,13 +58,13 @@ public class CustomEmojiHelper {
|
|||
CharSequence pattern = new StringBuilder(":").append(emoji.getShortcode()).append(':');
|
||||
Matcher matcher = Pattern.compile(pattern.toString()).matcher(text);
|
||||
while (matcher.find()) {
|
||||
// We keep a span as a Picasso target, because Picasso keeps weak reference to
|
||||
// the target so an anonymous class would likely be garbage collected.
|
||||
EmojiSpan span = new EmojiSpan(view);
|
||||
builder.setSpan(span, matcher.start(), matcher.end(), 0);
|
||||
Picasso.with(view.getContext())
|
||||
Glide.with(view)
|
||||
.asBitmap()
|
||||
.load(emoji.getUrl())
|
||||
.into(span);
|
||||
.into(span.getTarget());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,7 +79,7 @@ public class CustomEmojiHelper {
|
|||
}
|
||||
|
||||
|
||||
public static class EmojiSpan extends ReplacementSpan implements Target {
|
||||
public static class EmojiSpan extends ReplacementSpan {
|
||||
|
||||
private @Nullable Drawable imageDrawable;
|
||||
private WeakReference<View> viewWeakReference;
|
||||
|
@ -118,20 +121,23 @@ public class CustomEmojiHelper {
|
|||
canvas.restore();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
|
||||
View view = viewWeakReference.get();
|
||||
if(view != null) {
|
||||
imageDrawable = new BitmapDrawable(view.getContext().getResources(), bitmap);
|
||||
view.invalidate();
|
||||
}
|
||||
Target<Bitmap> getTarget(){
|
||||
return new CustomTarget<Bitmap>() {
|
||||
@Override
|
||||
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
|
||||
View view = viewWeakReference.get();
|
||||
if (view != null) {
|
||||
imageDrawable = new BitmapDrawable(view.getContext().getResources(), resource);
|
||||
view.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadCleared(@Nullable Drawable placeholder) {
|
||||
//Do nothing on load cleared
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBitmapFailed(Drawable errorDrawable) {}
|
||||
|
||||
@Override
|
||||
public void onPrepareLoad(Drawable placeHolderDrawable) {}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -16,10 +16,8 @@
|
|||
package com.keylesspalace.tusky.util
|
||||
|
||||
import android.graphics.Matrix
|
||||
import android.widget.ImageView
|
||||
|
||||
import com.keylesspalace.tusky.entity.Attachment.Focus
|
||||
import com.squareup.picasso.Callback
|
||||
|
||||
/**
|
||||
* Calculates the image matrix needed to maintain the correct cropping for image views based on
|
||||
|
@ -88,10 +86,10 @@ object FocalPointUtil {
|
|||
*/
|
||||
fun calculateScaling(viewWidth: Float, viewHeight: Float,
|
||||
imageWidth: Float, imageHeight: Float): Float {
|
||||
if (isVerticalCrop(viewWidth, viewHeight, imageWidth, imageHeight)) {
|
||||
return viewWidth / imageWidth
|
||||
return if (isVerticalCrop(viewWidth, viewHeight, imageWidth, imageHeight)) {
|
||||
viewWidth / imageWidth
|
||||
} else { // horizontal crop:
|
||||
return viewHeight / imageHeight
|
||||
viewHeight / imageHeight
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,9 @@ import androidx.core.content.ContextCompat;
|
|||
import androidx.core.text.BidiFormatter;
|
||||
import android.util.Log;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
||||
import com.bumptech.glide.request.FutureTarget;
|
||||
import com.evernote.android.job.JobManager;
|
||||
import com.evernote.android.job.JobRequest;
|
||||
import com.keylesspalace.tusky.BuildConfig;
|
||||
|
@ -48,17 +51,15 @@ import com.keylesspalace.tusky.entity.Notification;
|
|||
import com.keylesspalace.tusky.entity.Status;
|
||||
import com.keylesspalace.tusky.receiver.NotificationClearBroadcastReceiver;
|
||||
import com.keylesspalace.tusky.receiver.SendStatusBroadcastReceiver;
|
||||
import com.keylesspalace.tusky.view.RoundedTransformation;
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class NotificationHelper {
|
||||
|
||||
|
@ -169,11 +170,14 @@ public class NotificationHelper {
|
|||
//load the avatar synchronously
|
||||
Bitmap accountAvatar;
|
||||
try {
|
||||
accountAvatar = Picasso.with(context)
|
||||
FutureTarget<Bitmap> target = Glide.with(context)
|
||||
.asBitmap()
|
||||
.load(body.getAccount().getAvatar())
|
||||
.transform(new RoundedTransformation(20))
|
||||
.get();
|
||||
} catch (IOException e) {
|
||||
.transform(new RoundedCorners(20))
|
||||
.submit();
|
||||
|
||||
accountAvatar = target.get();
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
Log.d(TAG, "error loading account avatar", e);
|
||||
accountAvatar = BitmapFactory.decodeResource(context.getResources(), R.drawable.avatar_default);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue