summaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
authorH. Lehmann <ByteHamster@users.noreply.github.com>2020-02-13 12:38:53 +0100
committerGitHub <noreply@github.com>2020-02-13 12:38:53 +0100
commitf951d6362c4728a2378bb314d77f964010691e3c (patch)
tree71b82560f026ea9eaf94e7a5812cfb2dae4c5409 /app/src/main
parent93a4e8aeea1c375e74375339353e52fac5314c5c (diff)
parentd0cc0359506b481d09f7d51b083f46ac914bb25f (diff)
downloadAntennaPod-f951d6362c4728a2378bb314d77f964010691e3c.zip
Merge pull request #3838 from ByteHamster/chapter-images
Support for chapter images
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java35
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java13
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java90
-rw-r--r--app/src/main/res/layout/simplechapter_item.xml9
4 files changed, 113 insertions, 34 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
index 3e84e090a..cb74bb169 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.adapter;
import android.content.Context;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -9,10 +10,15 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.Chapter;
+import de.danoeh.antennapod.core.feed.util.ImageResourceUtils;
+import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.util.ChapterUtils;
import de.danoeh.antennapod.core.util.Converter;
+import de.danoeh.antennapod.core.util.EmbeddedChapterImage;
import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.core.util.playback.Playable;
@@ -23,6 +29,7 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
private Playable media;
private final Callback callback;
private int currentChapterIndex = -1;
+ private boolean hasImages = false;
public ChaptersListAdapter(Context context, int textViewResourceId, Callback callback) {
super(context, textViewResourceId);
@@ -31,6 +38,15 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
public void setMedia(Playable media) {
this.media = media;
+ hasImages = false;
+ if (media.getChapters() != null) {
+ for (Chapter chapter : media.getChapters()) {
+ if (!ignoreChapter(chapter) && !TextUtils.isEmpty(chapter.getImageUrl())) {
+ hasImages = true;
+ }
+ }
+ }
+ notifyDataSetChanged();
}
@NonNull
@@ -51,6 +67,7 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
holder.title = convertView.findViewById(R.id.txtvTitle);
holder.start = convertView.findViewById(R.id.txtvStart);
holder.link = convertView.findViewById(R.id.txtvLink);
+ holder.image = convertView.findViewById(R.id.imgvCover);
holder.duration = convertView.findViewById(R.id.txtvDuration);
holder.secondaryActionButton = convertView.findViewById(R.id.secondaryActionButton);
holder.secondaryActionIcon = convertView.findViewById(R.id.secondaryActionIcon);
@@ -94,6 +111,23 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
holder.view.setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}
+ if (hasImages) {
+ holder.image.setVisibility(View.VISIBLE);
+ if (TextUtils.isEmpty(sc.getImageUrl())) {
+ Glide.with(getContext()).clear(holder.image);
+ } else {
+ Glide.with(getContext())
+ .load(EmbeddedChapterImage.getModelFor(media, position))
+ .apply(new RequestOptions()
+ .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
+ .dontAnimate()
+ .fitCenter())
+ .into(holder.image);
+ }
+ } else {
+ holder.image.setVisibility(View.GONE);
+ }
+
return convertView;
}
@@ -103,6 +137,7 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
TextView start;
TextView link;
TextView duration;
+ ImageView image;
View secondaryActionButton;
ImageView secondaryActionIcon;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java
index 386b760b1..9940ccbdd 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java
@@ -6,6 +6,7 @@ import android.util.Log;
import android.view.View;
import android.widget.ListView;
+import de.danoeh.antennapod.core.util.ChapterUtils;
import java.util.List;
import java.util.ListIterator;
@@ -104,18 +105,10 @@ public class ChaptersFragment extends ListFragment {
}
private int getCurrentChapter(Playable media) {
- if (media == null || media.getChapters() == null || media.getChapters().size() == 0 || controller == null) {
+ if (controller == null) {
return -1;
}
- int currentPosition = controller.getPosition();
-
- List<Chapter> chapters = media.getChapters();
- for (int i = 0; i < chapters.size(); i++) {
- if (chapters.get(i).getStart() > currentPosition) {
- return i - 1;
- }
- }
- return chapters.size() - 1;
+ return ChapterUtils.getCurrentChapterIndex(media, controller.getPosition());
}
private void loadMediaInfo() {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
index 5467d71a8..ead47d1ae 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
@@ -1,27 +1,34 @@
package de.danoeh.antennapod.fragment;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
+import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
-
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import com.bumptech.glide.Glide;
-
+import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.request.RequestOptions;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.glide.ApGlideSettings;
+import de.danoeh.antennapod.core.event.PlaybackPositionEvent;
import de.danoeh.antennapod.core.feed.util.ImageResourceUtils;
+import de.danoeh.antennapod.core.glide.ApGlideSettings;
+import de.danoeh.antennapod.core.util.ChapterUtils;
+import de.danoeh.antennapod.core.util.EmbeddedChapterImage;
import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackController;
import io.reactivex.Maybe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
/**
* Displays the cover and the title of a FeedItem.
@@ -36,6 +43,8 @@ public class CoverFragment extends Fragment {
private ImageView imgvCover;
private PlaybackController controller;
private Disposable disposable;
+ private int displayedChapterIndex = -2;
+ private Playable media;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -53,30 +62,26 @@ public class CoverFragment extends Fragment {
if (disposable != null) {
disposable.dispose();
}
- disposable = Maybe.create(emitter -> {
- Playable media = controller.getMedia();
- if (media != null) {
- emitter.onSuccess(media);
- } else {
- emitter.onComplete();
- }
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(media -> displayMediaInfo((Playable) media),
- error -> Log.e(TAG, Log.getStackTraceString(error)));
+ disposable = Maybe.<Playable>create(emitter -> {
+ Playable media = controller.getMedia();
+ if (media != null) {
+ emitter.onSuccess(media);
+ } else {
+ emitter.onComplete();
+ }
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(media -> {
+ this.media = media;
+ displayMediaInfo(media);
+ }, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
private void displayMediaInfo(@NonNull Playable media) {
txtvPodcastTitle.setText(media.getFeedTitle());
txtvEpisodeTitle.setText(media.getEpisodeTitle());
- Glide.with(this)
- .load(ImageResourceUtils.getImageLocation(media))
- .apply(new RequestOptions()
- .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
- .dontAnimate()
- .fitCenter())
- .into(imgvCover);
+ displayCoverImage(media.getPosition());
}
@Override
@@ -99,6 +104,7 @@ public class CoverFragment extends Fragment {
};
controller.init();
loadMediaInfo();
+ EventBus.getDefault().register(this);
}
@Override
@@ -106,6 +112,42 @@ public class CoverFragment extends Fragment {
super.onStop();
controller.release();
controller = null;
+ EventBus.getDefault().unregister(this);
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onEventMainThread(PlaybackPositionEvent event) {
+ if (controller == null) {
+ return;
+ }
+ displayCoverImage(event.getPosition());
+ }
+
+ private void displayCoverImage(int position) {
+ int chapter = ChapterUtils.getCurrentChapterIndex(media, position);
+ if (chapter != displayedChapterIndex) {
+ displayedChapterIndex = chapter;
+
+ RequestBuilder<Drawable> cover = Glide.with(this)
+ .load(ImageResourceUtils.getImageLocation(media))
+ .apply(new RequestOptions()
+ .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
+ .dontAnimate()
+ .fitCenter());
+ if (chapter == -1 || TextUtils.isEmpty(media.getChapters().get(chapter).getImageUrl())) {
+ cover.into(imgvCover);
+ } else {
+ Glide.with(this)
+ .load(EmbeddedChapterImage.getModelFor(media, chapter))
+ .apply(new RequestOptions()
+ .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
+ .dontAnimate()
+ .fitCenter())
+ .thumbnail(cover)
+ .error(cover)
+ .into(imgvCover);
+ }
+ }
}
@Override
diff --git a/app/src/main/res/layout/simplechapter_item.xml b/app/src/main/res/layout/simplechapter_item.xml
index 86927f32c..54c607d71 100644
--- a/app/src/main/res/layout/simplechapter_item.xml
+++ b/app/src/main/res/layout/simplechapter_item.xml
@@ -10,6 +10,15 @@
android:baselineAligned="false"
android:descendantFocusability="blocksDescendants">
+ <ImageView
+ android:id="@+id/imgvCover"
+ android:layout_width="@dimen/thumbnail_length_queue_item"
+ android:layout_height="@dimen/thumbnail_length_queue_item"
+ android:contentDescription="@string/cover_label"
+ android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
+ tools:src="@tools:sample/avatars"/>
+
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"