diff options
Diffstat (limited to 'app/src')
9 files changed, 76 insertions, 34 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/storage/AutoDownloadTest.java b/app/src/androidTest/java/de/test/antennapod/storage/AutoDownloadTest.java index b89f1b9bc..41f2ec864 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/AutoDownloadTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/AutoDownloadTest.java @@ -8,6 +8,7 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.platform.app.InstrumentationRegistry; +import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.test.antennapod.EspressoTestUtils; import org.awaitility.Awaitility; import org.awaitility.core.ConditionTimeoutException; @@ -113,7 +114,11 @@ public class AutoDownloadTest { private void playEpisode(@NonNull FeedItem item) { FeedMedia media = item.getMedia(); - DBTasks.playMedia(context, media, false, true, true); + new PlaybackServiceStarter(context, media) + .callEvenIfRunning(true) + .startWhenPrepared(true) + .shouldStream(true) + .start(); Awaitility.await("episode is playing") .atMost(2000, MILLISECONDS) .until(() -> item.equals(getCurrentlyPlaying())); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java index 8d469c7a6..f49892b63 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java @@ -1,23 +1,29 @@ package de.danoeh.antennapod.adapter; import android.content.Context; -import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.TextView; - -import java.util.List; - import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.util.NetworkUtils; +import de.danoeh.antennapod.core.util.playback.RemoteMedia; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.util.DateUtils; +import de.danoeh.antennapod.core.util.playback.Playable; +import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; +import de.danoeh.antennapod.dialog.StreamingConfirmationDialog; + +import java.util.List; /** * List adapter for showing a list of FeedItems with their title and description. */ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { + private static final int MAX_LINES_COLLAPSED = 3; public FeedItemlistDescriptionAdapter(Context context, int resource, List<FeedItem> objects) { super(context, resource, objects); @@ -32,12 +38,12 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { // Inflate layout if (convertView == null) { holder = new Holder(); - LayoutInflater inflater = (LayoutInflater) getContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.itemdescription_listitem, parent, false); holder.title = convertView.findViewById(R.id.txtvTitle); holder.pubDate = convertView.findViewById(R.id.txtvPubDate); holder.description = convertView.findViewById(R.id.txtvDescription); + holder.preview = convertView.findViewById(R.id.butPreview); convertView.setTag(holder); } else { @@ -52,18 +58,34 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { .replaceAll("\\s+", " ") .trim(); holder.description.setText(description); - - final int MAX_LINES_COLLAPSED = 3; holder.description.setMaxLines(MAX_LINES_COLLAPSED); - holder.description.setOnClickListener(v -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN - && holder.description.getMaxLines() > MAX_LINES_COLLAPSED) { - holder.description.setMaxLines(MAX_LINES_COLLAPSED); - } else { - holder.description.setMaxLines(2000); - } - }); } + holder.description.setTag(Boolean.FALSE); // not expanded + holder.preview.setVisibility(View.GONE); + holder.preview.setOnClickListener(v -> { + Playable playable = new RemoteMedia(item); + if (!NetworkUtils.isStreamingAllowed()) { + new StreamingConfirmationDialog(getContext(), playable).show(); + return; + } + new PlaybackServiceStarter(getContext(), playable) + .shouldStream(true) + .startWhenPrepared(true) + .callEvenIfRunning(true) + .start(); + getContext().startActivity(PlaybackService.getPlayerActivityIntent(getContext(), playable)); + }); + convertView.setOnClickListener(v -> { + if (holder.description.getTag() == Boolean.TRUE) { + holder.description.setMaxLines(MAX_LINES_COLLAPSED); + holder.preview.setVisibility(View.GONE); + holder.description.setTag(Boolean.FALSE); + } else { + holder.description.setMaxLines(2000); + holder.preview.setVisibility(View.VISIBLE); + holder.description.setTag(Boolean.TRUE); + } + }); return convertView; } @@ -71,5 +93,6 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { TextView title; TextView pubDate; TextView description; + Button preview; } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java index 0c6924469..3a80ec998 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java @@ -6,6 +6,7 @@ import androidx.annotation.StringRes; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; public class PlayActionButton extends ItemActionButton { @@ -32,7 +33,10 @@ public class PlayActionButton extends ItemActionButton { if (media == null) { return; } - + if (!media.fileExists()) { + DBTasks.notifyMissingFeedMediaFile(context, media); + return; + } new PlaybackServiceStarter(context, media) .callEvenIfRunning(true) .startWhenPrepared(true) diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java index 38b84c453..2f943e5fb 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java @@ -8,14 +8,10 @@ import androidx.annotation.StringRes; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.DBTasks; -import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.danoeh.antennapod.dialog.StreamingConfirmationDialog; -import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE; - public class StreamActionButton extends ItemActionButton { public StreamActionButton(FeedItem item) { @@ -44,6 +40,10 @@ public class StreamActionButton extends ItemActionButton { new StreamingConfirmationDialog(context, media).show(); return; } - DBTasks.playMedia(context, media, false, true, true); + new PlaybackServiceStarter(context, media) + .callEvenIfRunning(true) + .startWhenPrepared(true) + .shouldStream(true) + .start(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/StreamingConfirmationDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/StreamingConfirmationDialog.java index 5b77fd319..81e86e217 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/StreamingConfirmationDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/StreamingConfirmationDialog.java @@ -5,17 +5,17 @@ import android.view.View; import android.widget.CheckBox; import androidx.appcompat.app.AlertDialog; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; public class StreamingConfirmationDialog { private final Context context; - private final FeedMedia media; + private final Playable playable; - public StreamingConfirmationDialog(Context context, FeedMedia media) { + public StreamingConfirmationDialog(Context context, Playable playable) { this.context = context; - this.media = media; + this.playable = playable; } public void show() { @@ -30,7 +30,7 @@ public class StreamingConfirmationDialog { if (checkDoNotShowAgain.isChecked()) { UserPreferences.setAllowMobileStreaming(true); } - new PlaybackServiceStarter(context, media) + new PlaybackServiceStarter(context, playable) .callEvenIfRunning(true) .startWhenPrepared(true) .shouldStream(true) diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesPodcastSearcher.java b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesPodcastSearcher.java index a91aae1a8..620b30177 100644 --- a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesPodcastSearcher.java +++ b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesPodcastSearcher.java @@ -43,8 +43,7 @@ public class ItunesPodcastSearcher implements PodcastSearcher { OkHttpClient client = AntennapodHttpClient.getHttpClient(); Request.Builder httpReq = new Request.Builder() - .url(formattedUrl) - .header("User-Agent", ClientConfig.USER_AGENT); + .url(formattedUrl); List<PodcastSearchResult> podcasts = new ArrayList<>(); try { Response response = client.newCall(httpReq.build()).execute(); diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java index ee318c706..eb6589b84 100644 --- a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java +++ b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java @@ -10,6 +10,7 @@ import io.reactivex.Single; import io.reactivex.SingleOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; +import okhttp3.CacheControl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -21,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.TimeUnit; public class ItunesTopListLoader { private static final String TAG = "ITunesTopListLoader"; @@ -55,8 +57,7 @@ public class ItunesTopListLoader { return Single.create((SingleOnSubscribe<String>) emitter -> { OkHttpClient client = AntennapodHttpClient.getHttpClient(); Request.Builder httpReq = new Request.Builder() - .url(podcast.feedUrl) - .header("User-Agent", ClientConfig.USER_AGENT); + .url(podcast.feedUrl); try { Response response = client.newCall(httpReq.build()).execute(); if (response.isSuccessful()) { @@ -81,7 +82,7 @@ public class ItunesTopListLoader { String url = "https://itunes.apple.com/%s/rss/toppodcasts/limit=" + limit + "/explicit=true/json"; Log.d(TAG, "Feed URL " + String.format(url, country)); Request.Builder httpReq = new Request.Builder() - .header("User-Agent", ClientConfig.USER_AGENT) + .cacheControl(new CacheControl.Builder().minFresh(1, TimeUnit.DAYS).build()) .url(String.format(url, country)); try (Response response = client.newCall(httpReq.build()).execute()) { 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 cc1868321..4f8b4e971 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java @@ -120,7 +120,7 @@ public class CoverFragment extends Fragment { @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(PlaybackPositionEvent event) { - if (controller == null) { + if (media == null) { return; } displayCoverImage(event.getPosition()); diff --git a/app/src/main/res/layout/itemdescription_listitem.xml b/app/src/main/res/layout/itemdescription_listitem.xml index 9d03e30a3..15c23c915 100644 --- a/app/src/main/res/layout/itemdescription_listitem.xml +++ b/app/src/main/res/layout/itemdescription_listitem.xml @@ -56,4 +56,14 @@ tools:text="Feed item description" tools:background="@android:color/holo_green_dark" /> + <Button + android:id="@+id/butPreview" + android:layout_below="@id/txtvDescription" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_alignParentLeft="true" + style="?android:attr/buttonBarButtonStyle" + android:text="@string/preview_episode"/> + </RelativeLayout> |