summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-17 17:22:45 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-17 17:22:45 +0300
commit10ae5ad31910949dd771ea28a7448454f2e3d64c (patch)
treef338e6ff84644fd9c2ad4aa2102d76a615cb3710
parent4be33b1faf3ae819c7323af36bbebfe4d72e66c1 (diff)
experimental - switch to glide 4
-rwxr-xr-xorg.fox.ttrss/build.gradle7
-rwxr-xr-xorg.fox.ttrss/src/main/AndroidManifest.xml3
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java9
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java8
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java149
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java22
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryModel.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java44
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java168
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/glide/ProgressTarget.java110
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/glide/WrappingTarget.java54
-rwxr-xr-xorg.fox.ttrss/src/main/res/layout/headlines_row.xml2
-rwxr-xr-xorg.fox.ttrss/src/main/res/layout/headlines_row_unread.xml2
13 files changed, 48 insertions, 532 deletions
diff --git a/org.fox.ttrss/build.gradle b/org.fox.ttrss/build.gradle
index f042c029..6712a1c3 100755
--- a/org.fox.ttrss/build.gradle
+++ b/org.fox.ttrss/build.gradle
@@ -136,13 +136,10 @@ def getVersion() {
dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.12.5'
- implementation('com.github.bumptech.glide:okhttp3-integration:1.5.0') {
- exclude group: 'glide-parent'
- }
implementation 'org.jsoup:jsoup:1.11.3'
implementation 'com.bogdwellers:pinchtozoom:0.1'
- implementation 'com.github.bumptech.glide:glide:3.8.0'
- implementation files('libs/glide-transformations-2.0.2.jar')
+ implementation 'com.github.bumptech.glide:glide:4.11.0'
+ implementation 'jp.wasabeef:glide-transformations:4.3.0'
implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'androidx.activity:activity:1.10.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml
index 3388d515..f2a209f9 100755
--- a/org.fox.ttrss/src/main/AndroidManifest.xml
+++ b/org.fox.ttrss/src/main/AndroidManifest.xml
@@ -21,9 +21,6 @@
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config" >
- <meta-data android:name="org.fox.ttrss.glide.OkHttpProgressGlideModule"
- android:value="GlideModule" />
-
<meta-data android:name="android.max_aspect" android:value="2.1" />
<activity
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
index 17d0c75a..49dca6dd 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
@@ -1,6 +1,5 @@
package org.fox.ttrss;
-import static org.fox.ttrss.glide.OkHttpProgressGlideModule.createInterceptor;
import android.content.Context;
import android.content.SharedPreferences;
@@ -18,8 +17,6 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import org.fox.ttrss.glide.OkHttpProgressGlideModule;
-
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
@@ -146,7 +143,7 @@ public class ApiCommon {
Request request = requestBuilder.build();
- OkHttpProgressGlideModule.ResponseProgressListener listener = new OkHttpProgressGlideModule.ResponseProgressListener() {
+ /* OkHttpProgressGlideModule.ResponseProgressListener listener = new OkHttpProgressGlideModule.ResponseProgressListener() {
@Override
public void update(HttpUrl url, long bytesRead, long contentLength) {
// Log.d(TAG, "[progress] " + url + " " + bytesRead + " of " + contentLength);
@@ -154,7 +151,7 @@ public class ApiCommon {
if (contentLength > 0)
caller.notifyProgress((int) (bytesRead * 100f / contentLength));
}
- };
+ }; */
/* lets shamelessly hijack OkHttpProgressGlideModule */
@@ -162,7 +159,7 @@ public class ApiCommon {
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
- .addNetworkInterceptor(createInterceptor(listener))
+// .addNetworkInterceptor(createInterceptor(listener))
.build();
Response response = client.newCall(request).execute();
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
index 97e356c4..749d1131 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
@@ -27,6 +27,8 @@ import android.view.View;
import android.widget.CheckBox;
import androidx.activity.EdgeToEdge;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.browser.customtabs.CustomTabsCallback;
@@ -40,8 +42,8 @@ import androidx.preference.PreferenceManager;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.transition.Transition;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
@@ -348,13 +350,13 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
protected void shareImageFromUri(String url) {
Glide.with(this)
- .load(url)
.asBitmap()
+ .load(url)
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(new SimpleTarget<Bitmap>() {
@Override
- public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
+ public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
Log.d(TAG, "image resource ready: " + resource);
if (resource != null) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
index afd70b08..eaa997f4 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
@@ -66,8 +66,6 @@ public class GalleryActivity extends CommonActivity {
@Override
public Fragment createFragment(int position) {
- //Log.d(TAG, "getItem: " + position + " " + m_urls.get(position));
-
GalleryEntry item = getItem(position);
switch (item.type) {
@@ -88,151 +86,6 @@ public class GalleryActivity extends CommonActivity {
}
}
- private static class MediaProgressResult {
- GalleryEntry item;
- int position;
- int count;
-
- public MediaProgressResult(GalleryEntry item, int position, int count) {
- this.item = item;
- this.position = position;
- this.count = count;
- }
- }
-
- private class MediaCheckTask extends AsyncTask<List<GalleryEntry>, MediaProgressResult, List<GalleryEntry>> {
-
- private final List<GalleryEntry> m_checkedItems = new ArrayList<>();
-
- @Override
- protected List<GalleryEntry> doInBackground(List<GalleryEntry>... params) {
-
- ArrayList<GalleryEntry> items = new ArrayList<>(params[0]);
- int position = 0;
-
- for (GalleryEntry item : items) {
- if (!isCancelled()) {
- ++position;
-
- Log.d(TAG, "checking: " + item.url + " " + item.coverUrl);
-
- if (item.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE) {
- try {
- Bitmap bmp = Glide.with(GalleryActivity.this)
- .load(item.url)
- .asBitmap()
- .skipMemoryCache(false)
- .diskCacheStrategy(DiskCacheStrategy.ALL)
- //.dontTransform()
- .into(HeadlinesFragment.FLAVOR_IMG_MIN_SIZE, HeadlinesFragment.FLAVOR_IMG_MIN_SIZE)
- .get();
-
- if (bmp.getWidth() >= HeadlinesFragment.FLAVOR_IMG_MIN_SIZE && bmp.getHeight() >= HeadlinesFragment.FLAVOR_IMG_MIN_SIZE) {
- m_checkedItems.add(item);
- publishProgress(new MediaProgressResult(item, position, items.size()));
- }
-
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- } catch (OutOfMemoryError e) {
- e.printStackTrace();
- }
-
- } else {
- m_checkedItems.add(item);
- publishProgress(new MediaProgressResult(item, position, items.size()));
- }
- }
- }
-
- return m_checkedItems;
- }
- }
-
- /*
- boolean collectGalleryContents(String imgSrcFirst, Document doc, List<GalleryEntry> uncheckedItems ) {
- Elements elems = doc.select("img,video");
-
- boolean firstFound = false;
-
- for (Element elem : elems) {
-
- GalleryEntry item = new GalleryEntry();
-
- if ("video".equalsIgnoreCase(elem.tagName())) {
- String cover = elem.attr("poster");
-
- Element source = elem.select("source").first();
-
- if (source != null) {
- String src = source.attr("src");
-
- if (!src.isEmpty()) {
- //Log.d(TAG, "vid/src=" + src);
-
- if (src.startsWith("//")) {
- src = "https:" + src;
- }
-
- if (imgSrcFirst.equals(src))
- firstFound = true;
-
- try {
- Uri checkUri = Uri.parse(src);
-
- if (!"data".equalsIgnoreCase(checkUri.getScheme())) {
- item.url = src;
- item.coverUrl = cover;
- item.type = GalleryEntry.GalleryEntryType.TYPE_VIDEO;
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- } else {
- String src = elem.attr("src");
-
- if (!src.isEmpty()) {
- if (src.startsWith("//")) {
- src = "https:" + src;
- }
-
- if (imgSrcFirst.equals(src))
- firstFound = true;
-
- Log.d(TAG, "img/fir=" + imgSrcFirst + ";");
- Log.d(TAG, "img/src=" + src + "; ff=" + firstFound);
-
- try {
- Uri checkUri = Uri.parse(src);
-
- if (!"data".equalsIgnoreCase(checkUri.getScheme())) {
- item.url = src;
- item.type = GalleryEntry.GalleryEntryType.TYPE_IMAGE;
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- if ((firstFound || imgSrcFirst.isEmpty()) && item.url != null) {
- if (m_items.isEmpty())
- m_items.add(item);
- else
- uncheckedItems.add(item);
- }
- }
-
- return firstFound;
- } */
-
public void onSaveInstanceState(Bundle out) {
super.onSaveInstanceState(out);
@@ -242,7 +95,7 @@ public class GalleryActivity extends CommonActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
- ActivityCompat.postponeEnterTransition(this);
+ // ActivityCompat.postponeEnterTransition(this);
// we use that before parent onCreate so let's init locally
m_prefs = PreferenceManager
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
index 8f9d5783..d5206518 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
@@ -1,5 +1,6 @@
package org.fox.ttrss;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
@@ -8,15 +9,17 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
+import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.view.ViewCompat;
import com.bogdwellers.pinchtozoom.ImageMatrixTouchHandler;
import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.load.resource.drawable.GlideDrawable;
+import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
-import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
+import com.bumptech.glide.request.target.DrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
public class GalleryImageFragment extends GalleryBaseFragment {
@@ -56,33 +59,34 @@ public class GalleryImageFragment extends GalleryBaseFragment {
final ProgressBar progressBar = view.findViewById(R.id.flavor_image_progress);
final View errorMessage = view.findViewById(R.id.flavor_image_error);
- final GlideDrawableImageViewTarget glideImage = new GlideDrawableImageViewTarget(imgView);
+ // final GlideDrawableImageViewTarget glideImage = new GlideDrawableImageViewTarget(imgView);
- Glide.with(getContext())
+ Glide.with(m_activity)
.load(m_url)
- //.dontAnimate()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.skipMemoryCache(false)
- .listener(new RequestListener<String, GlideDrawable>() {
+ .listener(new RequestListener<Drawable>() {
@Override
- public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
progressBar.setVisibility(View.GONE);
errorMessage.setVisibility(View.VISIBLE);
ActivityCompat.startPostponedEnterTransition(m_activity);
+
return false;
}
@Override
- public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
+ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
progressBar.setVisibility(View.GONE);
errorMessage.setVisibility(View.GONE);
ActivityCompat.startPostponedEnterTransition(m_activity);
+
return false;
}
})
- .into(glideImage);
+ .into(new DrawableImageViewTarget(imgView));
return view;
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryModel.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryModel.java
index 5b550015..8458fc33 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryModel.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryModel.java
@@ -126,8 +126,8 @@ public class GalleryModel extends AndroidViewModel {
try {
Bitmap bmp = Glide.with(getApplication().getApplicationContext())
- .load(src)
.asBitmap()
+ .load(src)
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(HeadlinesFragment.FLAVOR_IMG_MIN_SIZE, HeadlinesFragment.FLAVOR_IMG_MIN_SIZE)
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
index 8c24a14a..a1ee92c7 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
@@ -45,6 +45,7 @@ import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.TextView;
+import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
import androidx.core.content.ContextCompat;
@@ -60,16 +61,16 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.load.resource.drawable.GlideDrawable;
+import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
-import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
+import com.bumptech.glide.request.target.DrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
-import org.fox.ttrss.glide.ProgressTarget;
import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
import org.fox.ttrss.types.Attachment;
@@ -615,7 +616,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
public View flavorImageOverflow;
public TextureView flavorVideoView;
public MaterialButton attachmentsView;
- public ProgressTarget<String, GlideDrawable> flavorProgressTarget;
+ //public ProgressTarget<String, GlideDrawable> flavorProgressTarget;
int articleId;
public TextView linkHost;
@@ -657,10 +658,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
attachmentsView = v.findViewById(R.id.attachments);
linkHost = v.findViewById(R.id.link_host);
- if (flavorImageView != null && flavorImageLoadingBar != null) {
+ /* if (flavorImageView != null && flavorImageLoadingBar != null) {
flavorProgressTarget = new FlavorProgressTarget<>(new GlideDrawableImageViewTarget(flavorImageView), flavorImageLoadingBar);
- }
-
+ } */
}
public void clearAnimation() {
@@ -668,7 +668,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
}
}
- private static class FlavorProgressTarget<Z> extends ProgressTarget<String, Z> {
+ /* private static class FlavorProgressTarget<Z> extends ProgressTarget<String, Z> {
private final ProgressBar progress;
public FlavorProgressTarget(Target<Z> target, ProgressBar progress) {
super(target);
@@ -693,7 +693,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
@Override protected void onDelivered() {
progress.setVisibility(View.INVISIBLE);
}
- }
+ } */
private class ArticleListAdapter extends ListAdapter<Article, ArticleViewHolder> {
public static final int VIEW_NORMAL = 0;
@@ -1014,7 +1014,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
holder.flavorVideoView.setVisibility(View.GONE);
holder.flavorImageHolder.setVisibility(View.GONE);
- Glide.clear(holder.flavorImageView);
+ Glide.with(m_activity).clear(holder.flavorImageView);
// this is needed if our flavor image goes behind base listview element
holder.headlineHeader.setOnClickListener(v -> {
@@ -1083,18 +1083,17 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
}
}
- holder.flavorProgressTarget.setModel(article.flavorImageUri);
+ // holder.flavorProgressTarget.setModel(article.flavorImageUri);
try {
- Glide.with(getContext())
+ Glide.with(m_activity)
.load(article.flavorImageUri)
- //.dontTransform()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.skipMemoryCache(false)
- .listener(new RequestListener<String, GlideDrawable>() {
+ .listener(new RequestListener<Drawable>() {
@Override
- public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
holder.flavorImageLoadingBar.setVisibility(View.GONE);
holder.flavorImageView.setVisibility(View.GONE);
@@ -1103,7 +1102,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
}
@Override
- public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
+ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
holder.flavorImageLoadingBar.setVisibility(View.GONE);
@@ -1124,7 +1123,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
}
}
})
- .into(holder.flavorProgressTarget);
+ .into(new DrawableImageViewTarget(holder.flavorImageView));
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
@@ -1338,22 +1337,21 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
holder.textImage.setImageDrawable(textDrawable);
} else {
- Glide.with(getContext())
+ Glide.with(m_activity)
.load(article.flavorImageUri)
.placeholder(textDrawable)
.thumbnail(0.5f)
- .bitmapTransform(new CropCircleTransformation(getActivity()))
+ .transform(new CropCircleTransformation())
.diskCacheStrategy(DiskCacheStrategy.ALL)
.skipMemoryCache(false)
- .listener(new RequestListener<String, GlideDrawable>() {
+ .listener(new RequestListener<Drawable>() {
@Override
- public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
- public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
-
+ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return resource.getIntrinsicWidth() < THUMB_IMG_MIN_SIZE || resource.getIntrinsicHeight() < THUMB_IMG_MIN_SIZE;
}
})
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java
deleted file mode 100644
index bb868f8e..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.fox.ttrss.glide;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.GlideBuilder;
-import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
-import com.bumptech.glide.load.model.GlideUrl;
-import com.bumptech.glide.module.GlideModule;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import okhttp3.HttpUrl;
-import okhttp3.Interceptor;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-import okhttp3.ResponseBody;
-import okio.Buffer;
-import okio.BufferedSource;
-import okio.ForwardingSource;
-import okio.Okio;
-import okio.Source;
-
-public class OkHttpProgressGlideModule implements GlideModule {
- @Override public void applyOptions(Context context, GlideBuilder builder) {
-
- }
- @Override public void registerComponents(Context context, Glide glide) {
- OkHttpClient client = new OkHttpClient.Builder()
- .addNetworkInterceptor(createInterceptor(new DispatchingProgressListener()))
- .build();
- glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
- }
-
- public static Interceptor createInterceptor(final ResponseProgressListener listener) {
- return chain -> {
- Request request = chain.request();
- Response response = chain.proceed(request);
- return response.newBuilder()
- .body(new OkHttpProgressResponseBody(request.url(), response.body(), listener))
- .build();
- };
- }
-
- public interface UIProgressListener {
- void onProgress(long bytesRead, long expectedLength);
- /**
- * Control how often the listener needs an update. 0% and 100% will always be dispatched.
- * @return in percentage (0.2 = call {@link #onProgress} around every 0.2 percent of progress)
- */
- float getGranualityPercentage();
- }
-
- public static void forget(String url) {
- DispatchingProgressListener.forget(url);
- }
- public static void expect(String url, UIProgressListener listener) {
- DispatchingProgressListener.expect(url, listener);
- }
-
- public interface ResponseProgressListener {
- void update(HttpUrl url, long bytesRead, long contentLength);
- }
-
- private static class DispatchingProgressListener implements ResponseProgressListener {
- private static final Map<String, UIProgressListener> LISTENERS = new HashMap<>();
- private static final Map<String, Long> PROGRESSES = new HashMap<>();
-
- private final Handler handler;
- DispatchingProgressListener() {
- this.handler = new Handler(Looper.getMainLooper());
- }
-
- static void forget(String url) {
- LISTENERS.remove(url);
- PROGRESSES.remove(url);
- }
- static void expect(String url, UIProgressListener listener) {
- LISTENERS.put(url, listener);
- }
-
- @Override public void update(HttpUrl url, final long bytesRead, final long contentLength) {
- //System.out.printf("%s: %d/%d = %.2f%%%n", url, bytesRead, contentLength, (100f * bytesRead) / contentLength);
-
- String key = url.toString();
- final UIProgressListener listener = LISTENERS.get(key);
-
- if (listener == null) {
- return;
- }
- if (contentLength <= bytesRead) {
- forget(key);
- }
- if (needsDispatch(key, bytesRead, contentLength, listener.getGranualityPercentage())) {
- handler.post(() -> listener.onProgress(bytesRead, contentLength));
- }
- }
-
- private boolean needsDispatch(String key, long current, long total, float granularity) {
- if (granularity == 0 || current == 0 || total == current) {
- return true;
- }
- float percent = 100f * current / total;
- long currentProgress = (long)(percent / granularity);
- Long lastProgress = PROGRESSES.get(key);
- if (lastProgress == null || currentProgress != lastProgress) {
- PROGRESSES.put(key, currentProgress);
- return true;
- } else {
- return false;
- }
- }
- }
-
- public static class OkHttpProgressResponseBody extends ResponseBody {
- private final HttpUrl url;
- private final ResponseBody responseBody;
- private final ResponseProgressListener progressListener;
- private BufferedSource bufferedSource;
-
- public OkHttpProgressResponseBody(HttpUrl url, ResponseBody responseBody,
- ResponseProgressListener progressListener) {
-
- this.url = url;
- this.responseBody = responseBody;
- this.progressListener = progressListener;
- }
-
- @Override public MediaType contentType() {
- return responseBody.contentType();
- }
-
- @Override public long contentLength() {
- return responseBody.contentLength();
- }
-
- @Override public BufferedSource source() {
- if (bufferedSource == null) {
- bufferedSource = Okio.buffer(source(responseBody.source()));
- }
- return bufferedSource;
- }
-
- private Source source(Source source) {
- return new ForwardingSource(source) {
- long totalBytesRead = 0L;
- @Override public long read(Buffer sink, long byteCount) throws IOException {
- long bytesRead = super.read(sink, byteCount);
- long fullLength = responseBody.contentLength();
- if (bytesRead == -1) { // this source is exhausted
- totalBytesRead = fullLength;
- } else {
- totalBytesRead += bytesRead;
- }
- progressListener.update(url, totalBytesRead, fullLength);
- return bytesRead;
- }
- };
- }
- }
-} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/ProgressTarget.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/ProgressTarget.java
deleted file mode 100644
index 977d1954..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/ProgressTarget.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.fox.ttrss.glide;
-
-
-import android.graphics.drawable.Drawable;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.request.animation.GlideAnimation;
-import com.bumptech.glide.request.target.Target;
-
-public abstract class ProgressTarget<T, Z> extends WrappingTarget<Z> implements OkHttpProgressGlideModule.UIProgressListener {
- private T model;
- private boolean ignoreProgress = true;
- public ProgressTarget(Target<Z> target) {
- this(null, target);
- }
- public ProgressTarget(T model, Target<Z> target) {
- super(target);
- this.model = model;
- }
-
- public final T getModel() {
- return model;
- }
- public final void setModel(T model) {
- Glide.clear(this); // indirectly calls cleanup
- this.model = model;
- }
- /**
- * Convert a model into an Url string that is used to match up the OkHttp requests. For explicit
- * {@link com.bumptech.glide.load.model.GlideUrl GlideUrl} loads this needs to return
- * {@link com.bumptech.glide.load.model.GlideUrl#toStringUrl toStringUrl}. For custom models do the same as your
- * {@link com.bumptech.glide.load.model.stream.BaseGlideUrlLoader BaseGlideUrlLoader} does.
- * @param model return the representation of the given model, DO NOT use {@link #getModel()} inside this method.
- * @return a stable Url representation of the model, otherwise the progress reporting won't work
- */
- protected String toUrlString(T model) {
- return String.valueOf(model);
- }
-
- @Override public float getGranualityPercentage() {
- return 1.0f;
- }
-
- @Override public void onProgress(long bytesRead, long expectedLength) {
- if (ignoreProgress) {
- return;
- }
- if (expectedLength == Long.MAX_VALUE) {
- onConnecting();
- } else if (bytesRead == expectedLength) {
- onDownloaded();
- } else {
- onDownloading(bytesRead, expectedLength);
- }
- }
-
- /**
- * Called when the Glide load has started.
- * At this time it is not known if the Glide will even go and use the network to fetch the image.
- */
- protected abstract void onConnecting();
- /**
- * Called when there's any progress on the download; not called when loading from cache.
- * At this time we know how many bytes have been transferred through the wire.
- */
- protected abstract void onDownloading(long bytesRead, long expectedLength);
- /**
- * Called when the bytes downloaded reach the length reported by the server; not called when loading from cache.
- * At this time it is fairly certain, that Glide either finished reading the stream.
- * This means that the image was either already decoded or saved the network stream to cache.
- * In the latter case there's more work to do: decode the image from cache and transform.
- * These cannot be listened to for progress so it's unsure how fast they'll be, best to show indeterminate progress.
- */
- protected abstract void onDownloaded();
- /**
- * Called when the Glide load has finished either by successfully loading the image or failing to load or cancelled.
- * In any case the best is to hide/reset any progress displays.
- */
- protected abstract void onDelivered();
-
- private void start() {
- OkHttpProgressGlideModule.expect(toUrlString(model), this);
- ignoreProgress = false;
- onProgress(0, Long.MAX_VALUE);
- }
- private void cleanup() {
- ignoreProgress = true;
- T model = this.model; // save in case it gets modified
- onDelivered();
- OkHttpProgressGlideModule.forget(toUrlString(model));
- this.model = null;
- }
-
- @Override public void onLoadStarted(Drawable placeholder) {
- super.onLoadStarted(placeholder);
- start();
- }
- @Override public void onResourceReady(Z resource, GlideAnimation<? super Z> animation) {
- cleanup();
- super.onResourceReady(resource, animation);
- }
- @Override public void onLoadFailed(Exception e, Drawable errorDrawable) {
- cleanup();
- super.onLoadFailed(e, errorDrawable);
- }
- @Override public void onLoadCleared(Drawable placeholder) {
- cleanup();
- super.onLoadCleared(placeholder);
- }
-} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/WrappingTarget.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/WrappingTarget.java
deleted file mode 100755
index 235acc3c..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/WrappingTarget.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.fox.ttrss.glide;
-
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-
-import com.bumptech.glide.request.Request;
-import com.bumptech.glide.request.animation.GlideAnimation;
-import com.bumptech.glide.request.target.SizeReadyCallback;
-import com.bumptech.glide.request.target.Target;
-
-public class WrappingTarget<Z> implements Target<Z> {
- protected final @NonNull Target<? super Z> target;
- public WrappingTarget(@NonNull Target<? super Z> target) {
- this.target = target;
- }
- public @NonNull Target<? super Z> getWrappedTarget() {
- return target;
- }
- @Override public void getSize(SizeReadyCallback cb) {
- target.getSize(cb);
- }
-
- @Override public void onLoadStarted(Drawable placeholder) {
- target.onLoadStarted(placeholder);
- }
- @Override public void onLoadFailed(Exception e, Drawable errorDrawable) {
- target.onLoadFailed(e, errorDrawable);
- }
- @SuppressWarnings("unchecked")
- @Override public void onResourceReady(Z resource, GlideAnimation<? super Z> glideAnimation) {
- target.onResourceReady(resource, (GlideAnimation)glideAnimation);
- }
- @Override public void onLoadCleared(Drawable placeholder) {
- target.onLoadCleared(placeholder);
- }
-
- @Override public Request getRequest() {
- return target.getRequest();
- }
- @Override public void setRequest(Request request) {
- target.setRequest(request);
- }
-
- @Override public void onStart() {
- target.onStart();
- }
- @Override public void onStop() {
- target.onStop();
- }
- @Override public void onDestroy() {
- target.onDestroy();
- }
-} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row.xml b/org.fox.ttrss/src/main/res/layout/headlines_row.xml
index 3c0ecb20..d77ad6cc 100755
--- a/org.fox.ttrss/src/main/res/layout/headlines_row.xml
+++ b/org.fox.ttrss/src/main/res/layout/headlines_row.xml
@@ -123,7 +123,7 @@
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:cropToPadding="true"
- android:scaleType="centerCrop"
+ android:scaleType="fitCenter"
tools:src="@drawable/ic_launcher_background"
android:visibility="visible" />
diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml
index 7cae0fb1..7e5f7b48 100755
--- a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml
+++ b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml
@@ -124,7 +124,7 @@
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:cropToPadding="true"
- android:scaleType="centerCrop"
+ android:scaleType="fitCenter"
tools:src="@drawable/ic_launcher_background"
android:visibility="visible" />