diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java | 93 |
1 files changed, 24 insertions, 69 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java index a9f56d317..f1b10158d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java @@ -20,13 +20,13 @@ import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; +import de.danoeh.antennapod.discovery.ItunesPodcastSearcher; +import de.danoeh.antennapod.discovery.PodcastSearchResult; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -46,15 +46,11 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import static de.danoeh.antennapod.adapter.itunes.ItunesAdapter.Podcast; - //Searches iTunes store for given string and displays results in a list public class ItunesSearchFragment extends Fragment { private static final String TAG = "ItunesSearchFragment"; - private static final String API_URL = "https://itunes.apple.com/search?media=podcast&term=%s"; - /** * Adapter responsible with the search results @@ -69,21 +65,21 @@ public class ItunesSearchFragment extends Fragment { /** * List of podcasts retreived from the search */ - private List<Podcast> searchResults; - private List<Podcast> topList; + private List<PodcastSearchResult> searchResults; + private List<PodcastSearchResult> topList; private Disposable disposable; /** * Replace adapter data with provided search results from SearchTask. * @param result List of Podcast objects containing search results */ - private void updateData(List<Podcast> result) { + private void updateData(List<PodcastSearchResult> result) { this.searchResults = result; adapter.clear(); if (result != null && result.size() > 0) { gridView.setVisibility(View.VISIBLE); txtvEmpty.setVisibility(View.GONE); - for (Podcast p : result) { + for (PodcastSearchResult p : result) { adapter.add(p); } adapter.notifyDataSetInvalidated(); @@ -117,7 +113,7 @@ public class ItunesSearchFragment extends Fragment { //Show information about the podcast when the list item is clicked gridView.setOnItemClickListener((parent, view1, position, id) -> { - Podcast podcast = searchResults.get(position); + PodcastSearchResult podcast = searchResults.get(position); if(podcast.feedUrl == null) { return; } @@ -239,7 +235,7 @@ public class ItunesSearchFragment extends Fragment { butRetry.setVisibility(View.GONE); txtvEmpty.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); - disposable = Single.create((SingleOnSubscribe<List<Podcast>>) emitter -> { + disposable = Single.create((SingleOnSubscribe<List<PodcastSearchResult>>) emitter -> { String lang = Locale.getDefault().getLanguage(); OkHttpClient client = AntennapodHttpClient.getHttpClient(); String feedString; @@ -249,7 +245,7 @@ public class ItunesSearchFragment extends Fragment { } catch (IOException e) { feedString = getTopListFeed(client, "us"); } - List<Podcast> podcasts = parseFeed(feedString); + List<PodcastSearchResult> podcasts = parseFeed(feedString); emitter.onSuccess(podcasts); } catch (IOException | JSONException e) { if (!disposable.isDisposed()) { @@ -288,15 +284,15 @@ public class ItunesSearchFragment extends Fragment { } } - private List<Podcast> parseFeed(String jsonString) throws JSONException { + private List<PodcastSearchResult> parseFeed(String jsonString) throws JSONException { JSONObject result = new JSONObject(jsonString); JSONObject feed = result.getJSONObject("feed"); JSONArray entries = feed.getJSONArray("entry"); - List<Podcast> results = new ArrayList<>(); + List<PodcastSearchResult> results = new ArrayList<>(); for (int i=0; i < entries.length(); i++) { JSONObject json = entries.getJSONObject(i); - results.add(Podcast.fromToplist(json)); + results.add(PodcastSearchResult.fromItunesToplist(json)); } return results; @@ -311,60 +307,19 @@ public class ItunesSearchFragment extends Fragment { butRetry.setVisibility(View.GONE); txtvEmpty.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); - disposable = Single.create((SingleOnSubscribe<List<Podcast>>) subscriber -> { - String encodedQuery = null; - try { - encodedQuery = URLEncoder.encode(query, "UTF-8"); - } catch (UnsupportedEncodingException e) { - // this won't ever be thrown - } - if (encodedQuery == null) { - encodedQuery = query; // failsafe - } - - String formattedUrl = String.format(API_URL, encodedQuery); - OkHttpClient client = AntennapodHttpClient.getHttpClient(); - Request.Builder httpReq = new Request.Builder() - .url(formattedUrl) - .header("User-Agent", ClientConfig.USER_AGENT); - List<Podcast> podcasts = new ArrayList<>(); - try { - Response response = client.newCall(httpReq.build()).execute(); - - if(response.isSuccessful()) { - String resultString = response.body().string(); - JSONObject result = new JSONObject(resultString); - JSONArray j = result.getJSONArray("results"); - - for (int i = 0; i < j.length(); i++) { - JSONObject podcastJson = j.getJSONObject(i); - Podcast podcast = Podcast.fromSearch(podcastJson); - podcasts.add(podcast); - } - } - else { - String prefix = getString(R.string.error_msg_prefix); - subscriber.onError(new IOException(prefix + response)); - } - } catch (IOException | JSONException e) { - subscriber.onError(e); - } - subscriber.onSuccess(podcasts); - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(podcasts -> { - progressBar.setVisibility(View.GONE); - updateData(podcasts); - }, error -> { - Log.e(TAG, Log.getStackTraceString(error)); - progressBar.setVisibility(View.GONE); - txtvError.setText(error.toString()); - txtvError.setVisibility(View.VISIBLE); - butRetry.setOnClickListener(v -> search(query)); - butRetry.setVisibility(View.VISIBLE); - }); + ItunesPodcastSearcher searcher = new ItunesPodcastSearcher(getContext()); + disposable = searcher.search(query).subscribe(podcasts -> { + progressBar.setVisibility(View.GONE); + updateData(podcasts); + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + progressBar.setVisibility(View.GONE); + txtvError.setText(error.toString()); + txtvError.setVisibility(View.VISIBLE); + butRetry.setOnClickListener(v -> search(query)); + butRetry.setVisibility(View.VISIBLE); + }); } } |