diff options
author | H. Lehmann <ByteHamster@users.noreply.github.com> | 2020-02-13 12:38:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-13 12:38:53 +0100 |
commit | f951d6362c4728a2378bb314d77f964010691e3c (patch) | |
tree | 71b82560f026ea9eaf94e7a5812cfb2dae4c5409 /app/src/main | |
parent | 93a4e8aeea1c375e74375339353e52fac5314c5c (diff) | |
parent | d0cc0359506b481d09f7d51b083f46ac914bb25f (diff) | |
download | AntennaPod-f951d6362c4728a2378bb314d77f964010691e3c.zip |
Merge pull request #3838 from ByteHamster/chapter-images
Support for chapter images
Diffstat (limited to 'app/src/main')
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" |