package de.danoeh.antennapod.fragment; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; 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 com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.glide.ApGlideSettings; 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; /** * Displays the cover and the title of a FeedItem. */ public class CoverFragment extends Fragment { private static final String TAG = "CoverFragment"; private View root; private TextView txtvPodcastTitle; private TextView txtvEpisodeTitle; private ImageView imgvCover; private PlaybackController controller; private Disposable disposable; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setRetainInstance(true); root = inflater.inflate(R.layout.cover_fragment, container, false); txtvPodcastTitle = root.findViewById(R.id.txtvPodcastTitle); txtvEpisodeTitle = root.findViewById(R.id.txtvEpisodeTitle); imgvCover = root.findViewById(R.id.imgvCover); imgvCover.setOnClickListener(v -> onPlayPause()); return root; } private void loadMediaInfo() { 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))); } private void displayMediaInfo(@NonNull Playable media) { txtvPodcastTitle.setText(media.getFeedTitle()); txtvEpisodeTitle.setText(media.getEpisodeTitle()); Glide.with(this) .load(media.getImageLocation()) .apply(new RequestOptions() .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) .dontAnimate() .fitCenter()) .into(imgvCover); } @Override public void onDestroy() { super.onDestroy(); // prevent memory leaks root = null; } @Override public void onStart() { super.onStart(); controller = new PlaybackController(getActivity(), false) { @Override public boolean loadMediaInfo() { CoverFragment.this.loadMediaInfo(); return true; } }; controller.init(); loadMediaInfo(); } @Override public void onStop() { super.onStop(); controller.release(); controller = null; } @Override public void onDestroyView() { super.onDestroyView(); if (disposable != null) { disposable.dispose(); } } void onPlayPause() { if (controller == null) { return; } controller.playPause(); } }