diff options
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" /> |