Search in sources :

Example 56 with Feed

use of de.danoeh.antennapod.model.feed.Feed in project AntennaPod by AntennaPod.

the class LocalFeedUpdaterTest method testUpdateFeed_FeedIconDefault.

/**
 * Test default feed icon if there is no matching file in the local feed media folder.
 */
@Test
public void testUpdateFeed_FeedIconDefault() {
    callUpdateFeed(LOCAL_FEED_DIR1);
    Feed feedAfter = verifySingleFeedInDatabase();
    String resourceEntryName = context.getResources().getResourceEntryName(R.raw.local_feed_default_icon);
    assertThat(feedAfter.getImageUrl(), endsWith(resourceEntryName));
}
Also used : Feed(de.danoeh.antennapod.model.feed.Feed) Test(org.junit.Test)

Example 57 with Feed

use of de.danoeh.antennapod.model.feed.Feed in project AntennaPod by AntennaPod.

the class LocalFeedUpdaterTest method verifySingleFeedInDatabaseAndItemCount.

/**
 * Verify that the database contains exactly one feed and the number of
 * items in the feed.
 *
 * @param expectedItemCount expected number of items in the feed
 */
private static void verifySingleFeedInDatabaseAndItemCount(int expectedItemCount) {
    Feed feed = verifySingleFeedInDatabase();
    List<FeedItem> feedItems = DBReader.getFeedItemList(feed);
    assertEquals(expectedItemCount, feedItems.size());
}
Also used : FeedItem(de.danoeh.antennapod.model.feed.FeedItem) Feed(de.danoeh.antennapod.model.feed.Feed)

Example 58 with Feed

use of de.danoeh.antennapod.model.feed.Feed in project AntennaPod by AntennaPod.

the class OnlineFeedViewActivity method showFeedInformation.

/**
 * Called when feed parsed successfully.
 * This method is executed on the GUI thread.
 */
private void showFeedInformation(final Feed feed, Map<String, String> alternateFeedUrls) {
    viewBinding.progressBar.setVisibility(View.GONE);
    viewBinding.feedDisplayContainer.setVisibility(View.VISIBLE);
    if (isFeedFoundBySearch) {
        int resId = R.string.no_feed_url_podcast_found_by_search;
        Snackbar.make(findViewById(android.R.id.content), resId, Snackbar.LENGTH_LONG).show();
    }
    this.feed = feed;
    this.selectedDownloadUrl = feed.getDownload_url();
    viewBinding.backgroundImage.setColorFilter(new LightingColorFilter(0xff828282, 0x000000));
    View header = View.inflate(this, R.layout.onlinefeedview_header, null);
    viewBinding.listView.addHeaderView(header);
    viewBinding.listView.setSelector(android.R.color.transparent);
    viewBinding.listView.setAdapter(new FeedItemlistDescriptionAdapter(this, 0, feed.getItems()));
    TextView description = header.findViewById(R.id.txtvDescription);
    if (StringUtils.isNotBlank(feed.getImageUrl())) {
        Glide.with(this).load(feed.getImageUrl()).apply(new RequestOptions().placeholder(R.color.light_gray).error(R.color.light_gray).diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY).fitCenter().dontAnimate()).into(viewBinding.coverImage);
        Glide.with(this).load(feed.getImageUrl()).apply(new RequestOptions().placeholder(R.color.image_readability_tint).error(R.color.image_readability_tint).diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY).transform(new FastBlurTransformation()).dontAnimate()).into(viewBinding.backgroundImage);
    }
    viewBinding.titleLabel.setText(feed.getTitle());
    viewBinding.authorLabel.setText(feed.getAuthor());
    description.setText(HtmlToPlainText.getPlainText(feed.getDescription()));
    viewBinding.subscribeButton.setOnClickListener(v -> {
        if (feedInFeedlist(feed)) {
            openFeed();
        } else {
            Feed f = new Feed(selectedDownloadUrl, null, feed.getTitle());
            f.setPreferences(feed.getPreferences());
            this.feed = f;
            DownloadService.download(this, false, DownloadRequestCreator.create(f).build());
            didPressSubscribe = true;
            handleUpdatedFeedStatus(feed);
        }
    });
    viewBinding.stopPreviewButton.setOnClickListener(v -> {
        PlaybackPreferences.writeNoMediaPlaying();
        IntentUtils.sendLocalBroadcast(this, PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
    });
    if (UserPreferences.isEnableAutodownload()) {
        SharedPreferences preferences = getSharedPreferences(PREFS, MODE_PRIVATE);
        viewBinding.autoDownloadCheckBox.setChecked(preferences.getBoolean(PREF_LAST_AUTO_DOWNLOAD, true));
    }
    final int MAX_LINES_COLLAPSED = 10;
    description.setMaxLines(MAX_LINES_COLLAPSED);
    description.setOnClickListener(v -> {
        if (description.getMaxLines() > MAX_LINES_COLLAPSED) {
            description.setMaxLines(MAX_LINES_COLLAPSED);
        } else {
            description.setMaxLines(2000);
        }
    });
    if (alternateFeedUrls.isEmpty()) {
        viewBinding.alternateUrlsSpinner.setVisibility(View.GONE);
    } else {
        viewBinding.alternateUrlsSpinner.setVisibility(View.VISIBLE);
        final List<String> alternateUrlsList = new ArrayList<>();
        final List<String> alternateUrlsTitleList = new ArrayList<>();
        alternateUrlsList.add(feed.getDownload_url());
        alternateUrlsTitleList.add(feed.getTitle());
        alternateUrlsList.addAll(alternateFeedUrls.keySet());
        for (String url : alternateFeedUrls.keySet()) {
            alternateUrlsTitleList.add(alternateFeedUrls.get(url));
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.alternate_urls_item, alternateUrlsTitleList) {

            @Override
            public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                // reusing the old view causes a visual bug on Android <= 10
                return super.getDropDownView(position, null, parent);
            }
        };
        adapter.setDropDownViewResource(R.layout.alternate_urls_dropdown_item);
        viewBinding.alternateUrlsSpinner.setAdapter(adapter);
        viewBinding.alternateUrlsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                selectedDownloadUrl = alternateUrlsList.get(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
    handleUpdatedFeedStatus(feed);
}
Also used : RequestOptions(com.bumptech.glide.request.RequestOptions) SharedPreferences(android.content.SharedPreferences) ViewGroup(android.view.ViewGroup) ArrayList(java.util.ArrayList) SpannableString(android.text.SpannableString) View(android.view.View) AdapterView(android.widget.AdapterView) TextView(android.widget.TextView) FastBlurTransformation(de.danoeh.antennapod.core.glide.FastBlurTransformation) FeedItemlistDescriptionAdapter(de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter) NonNull(androidx.annotation.NonNull) LightingColorFilter(android.graphics.LightingColorFilter) TextView(android.widget.TextView) AdapterView(android.widget.AdapterView) ArrayAdapter(android.widget.ArrayAdapter) Nullable(androidx.annotation.Nullable) Feed(de.danoeh.antennapod.model.feed.Feed)

Example 59 with Feed

use of de.danoeh.antennapod.model.feed.Feed in project AntennaPod by AntennaPod.

the class OnlineFeedViewActivity method showFeedDiscoveryDialog.

/**
 * @return true if a FeedDiscoveryDialog is shown, false otherwise (e.g., due to no feed found).
 */
private boolean showFeedDiscoveryDialog(File feedFile, String baseUrl) {
    FeedDiscoverer fd = new FeedDiscoverer();
    final Map<String, String> urlsMap;
    try {
        urlsMap = fd.findLinks(feedFile, baseUrl);
        if (urlsMap == null || urlsMap.isEmpty()) {
            return false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    if (isPaused || isFinishing()) {
        return false;
    }
    final List<String> titles = new ArrayList<>();
    final List<String> urls = new ArrayList<>(urlsMap.keySet());
    for (String url : urls) {
        titles.add(urlsMap.get(url));
    }
    if (urls.size() == 1) {
        // Skip dialog and display the item directly
        resetIntent(urls.get(0));
        startFeedDownload(urls.get(0));
        return true;
    }
    final ArrayAdapter<String> adapter = new ArrayAdapter<>(OnlineFeedViewActivity.this, R.layout.ellipsize_start_listitem, R.id.txtvTitle, titles);
    DialogInterface.OnClickListener onClickListener = (dialog, which) -> {
        String selectedUrl = urls.get(which);
        dialog.dismiss();
        resetIntent(selectedUrl);
        startFeedDownload(selectedUrl);
    };
    AlertDialog.Builder ab = new AlertDialog.Builder(OnlineFeedViewActivity.this).setTitle(R.string.feeds_label).setCancelable(true).setOnCancelListener(dialog -> finish()).setAdapter(adapter, onClickListener);
    runOnUiThread(() -> {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
        dialog = ab.show();
    });
    return true;
}
Also used : Bundle(android.os.Bundle) NonNull(androidx.annotation.NonNull) Spannable(android.text.Spannable) DownloadRequestCreator(de.danoeh.antennapod.core.service.download.DownloadRequestCreator) FeedListUpdateEvent(de.danoeh.antennapod.event.FeedListUpdateEvent) AppCompatActivity(androidx.appcompat.app.AppCompatActivity) AndroidSchedulers(io.reactivex.android.schedulers.AndroidSchedulers) StringUtils(org.apache.commons.lang3.StringUtils) UserPreferences(de.danoeh.antennapod.core.preferences.UserPreferences) FeedItemlistDescriptionAdapter(de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter) FeedPreferences(de.danoeh.antennapod.model.feed.FeedPreferences) UnsupportedFeedtypeException(de.danoeh.antennapod.parser.feed.UnsupportedFeedtypeException) Map(java.util.Map) HtmlToPlainText(de.danoeh.antennapod.core.util.syndication.HtmlToPlainText) View(android.view.View) UiThread(androidx.annotation.UiThread) Schedulers(io.reactivex.schedulers.Schedulers) AdapterView(android.widget.AdapterView) ForegroundColorSpan(android.text.style.ForegroundColorSpan) DownloadStatus(de.danoeh.antennapod.core.service.download.DownloadStatus) Log(android.util.Log) OnlinefeedviewActivityBinding(de.danoeh.antennapod.databinding.OnlinefeedviewActivityBinding) CombinedSearcher(de.danoeh.antennapod.discovery.CombinedSearcher) PlaybackService(de.danoeh.antennapod.core.service.playback.PlaybackService) NavUtils(androidx.core.app.NavUtils) IntentUtils(de.danoeh.antennapod.core.util.IntentUtils) DownloadError(de.danoeh.antennapod.core.util.DownloadError) FileNameGenerator(de.danoeh.antennapod.core.util.FileNameGenerator) FeedDiscoverer(de.danoeh.antennapod.core.util.syndication.FeedDiscoverer) ThreadMode(org.greenrobot.eventbus.ThreadMode) ViewGroup(android.view.ViewGroup) FeedHandlerResult(de.danoeh.antennapod.parser.feed.FeedHandlerResult) FeedUrlNotFoundException(de.danoeh.antennapod.core.feed.FeedUrlNotFoundException) Disposable(io.reactivex.disposables.Disposable) List(java.util.List) TextView(android.widget.TextView) Nullable(androidx.annotation.Nullable) DownloadEvent(de.danoeh.antennapod.core.event.DownloadEvent) Snackbar(com.google.android.material.snackbar.Snackbar) Context(android.content.Context) AlertDialog(androidx.appcompat.app.AlertDialog) AuthenticationDialog(de.danoeh.antennapod.dialog.AuthenticationDialog) Maybe(io.reactivex.Maybe) Dialog(android.app.Dialog) Intent(android.content.Intent) ApGlideSettings(de.danoeh.antennapod.core.glide.ApGlideSettings) MenuItem(android.view.MenuItem) ArrayList(java.util.ArrayList) HttpDownloader(de.danoeh.antennapod.core.service.download.HttpDownloader) DownloadRequest(de.danoeh.antennapod.core.service.download.DownloadRequest) FastBlurTransformation(de.danoeh.antennapod.core.glide.FastBlurTransformation) Toast(android.widget.Toast) EventBus(org.greenrobot.eventbus.EventBus) StorageUtils(de.danoeh.antennapod.core.util.StorageUtils) Observable(io.reactivex.Observable) Feed(de.danoeh.antennapod.model.feed.Feed) DialogInterface(android.content.DialogInterface) Downloader(de.danoeh.antennapod.core.service.download.Downloader) RequestOptions(com.bumptech.glide.request.RequestOptions) SpannableString(android.text.SpannableString) R(de.danoeh.antennapod.R) PodcastSearcherRegistry(de.danoeh.antennapod.discovery.PodcastSearcherRegistry) TextUtils(android.text.TextUtils) IOException(java.io.IOException) LightingColorFilter(android.graphics.LightingColorFilter) File(java.io.File) ArrayAdapter(android.widget.ArrayAdapter) PodcastSearchResult(de.danoeh.antennapod.discovery.PodcastSearchResult) Glide(com.bumptech.glide.Glide) PlaybackPreferences(de.danoeh.antennapod.core.preferences.PlaybackPreferences) Subscribe(org.greenrobot.eventbus.Subscribe) SharedPreferences(android.content.SharedPreferences) DBWriter(de.danoeh.antennapod.core.storage.DBWriter) URLChecker(de.danoeh.antennapod.core.util.URLChecker) DisposableMaybeObserver(io.reactivex.observers.DisposableMaybeObserver) DBReader(de.danoeh.antennapod.core.storage.DBReader) RemoteMedia(de.danoeh.antennapod.model.playback.RemoteMedia) PlayerStatusEvent(de.danoeh.antennapod.event.PlayerStatusEvent) DownloadService(de.danoeh.antennapod.core.service.download.DownloadService) FeedHandler(de.danoeh.antennapod.parser.feed.FeedHandler) AlertDialog(androidx.appcompat.app.AlertDialog) DialogInterface(android.content.DialogInterface) ArrayList(java.util.ArrayList) FeedDiscoverer(de.danoeh.antennapod.core.util.syndication.FeedDiscoverer) SpannableString(android.text.SpannableString) IOException(java.io.IOException) ArrayAdapter(android.widget.ArrayAdapter)

Example 60 with Feed

use of de.danoeh.antennapod.model.feed.Feed in project AntennaPod by AntennaPod.

the class OnlineFeedViewActivity method startFeedDownload.

private void startFeedDownload(String url) {
    Log.d(TAG, "Starting feed download");
    url = URLChecker.prepareURL(url);
    feed = new Feed(url, null);
    String fileUrl = new File(getExternalCacheDir(), FileNameGenerator.generateFileName(feed.getDownload_url())).toString();
    feed.setFile_url(fileUrl);
    final DownloadRequest request = new DownloadRequest(feed.getFile_url(), feed.getDownload_url(), "OnlineFeed", 0, Feed.FEEDFILETYPE_FEED, username, password, true, null, true);
    download = Observable.fromCallable(() -> {
        feeds = DBReader.getFeedList();
        downloader = new HttpDownloader(request);
        downloader.call();
        return downloader.getResult();
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(this::checkDownloadResult, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
Also used : Bundle(android.os.Bundle) NonNull(androidx.annotation.NonNull) Spannable(android.text.Spannable) DownloadRequestCreator(de.danoeh.antennapod.core.service.download.DownloadRequestCreator) FeedListUpdateEvent(de.danoeh.antennapod.event.FeedListUpdateEvent) AppCompatActivity(androidx.appcompat.app.AppCompatActivity) AndroidSchedulers(io.reactivex.android.schedulers.AndroidSchedulers) StringUtils(org.apache.commons.lang3.StringUtils) UserPreferences(de.danoeh.antennapod.core.preferences.UserPreferences) FeedItemlistDescriptionAdapter(de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter) FeedPreferences(de.danoeh.antennapod.model.feed.FeedPreferences) UnsupportedFeedtypeException(de.danoeh.antennapod.parser.feed.UnsupportedFeedtypeException) Map(java.util.Map) HtmlToPlainText(de.danoeh.antennapod.core.util.syndication.HtmlToPlainText) View(android.view.View) UiThread(androidx.annotation.UiThread) Schedulers(io.reactivex.schedulers.Schedulers) AdapterView(android.widget.AdapterView) ForegroundColorSpan(android.text.style.ForegroundColorSpan) DownloadStatus(de.danoeh.antennapod.core.service.download.DownloadStatus) Log(android.util.Log) OnlinefeedviewActivityBinding(de.danoeh.antennapod.databinding.OnlinefeedviewActivityBinding) CombinedSearcher(de.danoeh.antennapod.discovery.CombinedSearcher) PlaybackService(de.danoeh.antennapod.core.service.playback.PlaybackService) NavUtils(androidx.core.app.NavUtils) IntentUtils(de.danoeh.antennapod.core.util.IntentUtils) DownloadError(de.danoeh.antennapod.core.util.DownloadError) FileNameGenerator(de.danoeh.antennapod.core.util.FileNameGenerator) FeedDiscoverer(de.danoeh.antennapod.core.util.syndication.FeedDiscoverer) ThreadMode(org.greenrobot.eventbus.ThreadMode) ViewGroup(android.view.ViewGroup) FeedHandlerResult(de.danoeh.antennapod.parser.feed.FeedHandlerResult) FeedUrlNotFoundException(de.danoeh.antennapod.core.feed.FeedUrlNotFoundException) Disposable(io.reactivex.disposables.Disposable) List(java.util.List) TextView(android.widget.TextView) Nullable(androidx.annotation.Nullable) DownloadEvent(de.danoeh.antennapod.core.event.DownloadEvent) Snackbar(com.google.android.material.snackbar.Snackbar) Context(android.content.Context) AlertDialog(androidx.appcompat.app.AlertDialog) AuthenticationDialog(de.danoeh.antennapod.dialog.AuthenticationDialog) Maybe(io.reactivex.Maybe) Dialog(android.app.Dialog) Intent(android.content.Intent) ApGlideSettings(de.danoeh.antennapod.core.glide.ApGlideSettings) MenuItem(android.view.MenuItem) ArrayList(java.util.ArrayList) HttpDownloader(de.danoeh.antennapod.core.service.download.HttpDownloader) DownloadRequest(de.danoeh.antennapod.core.service.download.DownloadRequest) FastBlurTransformation(de.danoeh.antennapod.core.glide.FastBlurTransformation) Toast(android.widget.Toast) EventBus(org.greenrobot.eventbus.EventBus) StorageUtils(de.danoeh.antennapod.core.util.StorageUtils) Observable(io.reactivex.Observable) Feed(de.danoeh.antennapod.model.feed.Feed) DialogInterface(android.content.DialogInterface) Downloader(de.danoeh.antennapod.core.service.download.Downloader) RequestOptions(com.bumptech.glide.request.RequestOptions) SpannableString(android.text.SpannableString) R(de.danoeh.antennapod.R) PodcastSearcherRegistry(de.danoeh.antennapod.discovery.PodcastSearcherRegistry) TextUtils(android.text.TextUtils) IOException(java.io.IOException) LightingColorFilter(android.graphics.LightingColorFilter) File(java.io.File) ArrayAdapter(android.widget.ArrayAdapter) PodcastSearchResult(de.danoeh.antennapod.discovery.PodcastSearchResult) Glide(com.bumptech.glide.Glide) PlaybackPreferences(de.danoeh.antennapod.core.preferences.PlaybackPreferences) Subscribe(org.greenrobot.eventbus.Subscribe) SharedPreferences(android.content.SharedPreferences) DBWriter(de.danoeh.antennapod.core.storage.DBWriter) URLChecker(de.danoeh.antennapod.core.util.URLChecker) DisposableMaybeObserver(io.reactivex.observers.DisposableMaybeObserver) DBReader(de.danoeh.antennapod.core.storage.DBReader) RemoteMedia(de.danoeh.antennapod.model.playback.RemoteMedia) PlayerStatusEvent(de.danoeh.antennapod.event.PlayerStatusEvent) DownloadService(de.danoeh.antennapod.core.service.download.DownloadService) FeedHandler(de.danoeh.antennapod.parser.feed.FeedHandler) HttpDownloader(de.danoeh.antennapod.core.service.download.HttpDownloader) DownloadRequest(de.danoeh.antennapod.core.service.download.DownloadRequest) SpannableString(android.text.SpannableString) File(java.io.File) Feed(de.danoeh.antennapod.model.feed.Feed)

Aggregations

Feed (de.danoeh.antennapod.model.feed.Feed)125 FeedItem (de.danoeh.antennapod.model.feed.FeedItem)75 Test (org.junit.Test)61 ArrayList (java.util.ArrayList)43 Date (java.util.Date)37 File (java.io.File)31 FeedMedia (de.danoeh.antennapod.model.feed.FeedMedia)27 Cursor (android.database.Cursor)15 FeedPreferences (de.danoeh.antennapod.model.feed.FeedPreferences)12 NonNull (androidx.annotation.NonNull)10 Nullable (androidx.annotation.Nullable)8 View (android.view.View)7 DownloadStatus (de.danoeh.antennapod.core.service.download.DownloadStatus)7 Log (android.util.Log)6 R (de.danoeh.antennapod.R)6 DownloadRequest (de.danoeh.antennapod.core.service.download.DownloadRequest)6 List (java.util.List)6 ViewGroup (android.view.ViewGroup)5 AlertDialog (androidx.appcompat.app.AlertDialog)5 RequestOptions (com.bumptech.glide.request.RequestOptions)5