summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java27
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java36
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedDiscoverAdapter.java81
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java125
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java282
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java225
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java178
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java8
9 files changed, 36 insertions, 934 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
index 3c867b88c..f7bfbce7b 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
@@ -63,6 +63,7 @@ import de.danoeh.antennapod.storage.importexport.AutomaticDatabaseExportWorker;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.common.ThemeUtils;
+import de.danoeh.antennapod.ui.discovery.DiscoveryFragment;
import de.danoeh.antennapod.ui.home.HomeFragment;
import de.danoeh.antennapod.view.LockableBottomSheetBehavior;
import org.apache.commons.lang3.ArrayUtils;
@@ -87,7 +88,6 @@ public class MainActivity extends CastEnabledActivity {
public static final String EXTRA_FEED_ID = "fragment_feed_id";
public static final String EXTRA_REFRESH_ON_START = "refresh_on_start";
- public static final String EXTRA_STARTED_FROM_SEARCH = "started_from_search";
public static final String EXTRA_ADD_TO_BACK_STACK = "add_to_back_stack";
public static final String KEY_GENERATED_VIEW_ID = "generated_view_id";
@@ -347,7 +347,7 @@ public class MainActivity extends CastEnabledActivity {
return recycledViewPool;
}
- public void loadFragment(String tag, Bundle args) {
+ public Fragment createFragmentInstance(String tag, Bundle args) {
Log.d(TAG, "loadFragment(tag: " + tag + ", args: " + args + ")");
Fragment fragment;
switch (tag) {
@@ -375,19 +375,24 @@ public class MainActivity extends CastEnabledActivity {
case SubscriptionFragment.TAG:
fragment = new SubscriptionFragment();
break;
+ case DiscoveryFragment.TAG:
+ fragment = new DiscoveryFragment();
+ break;
default:
// default to home screen
fragment = new HomeFragment();
- tag = HomeFragment.TAG;
args = null;
break;
}
-
if (args != null) {
fragment.setArguments(args);
}
+ return fragment;
+ }
+
+ public void loadFragment(String tag, Bundle args) {
NavDrawerFragment.saveLastNavFragment(this, tag);
- loadFragment(fragment);
+ loadFragment(createFragmentInstance(tag, args));
}
public void loadFeedFragmentById(long feedId, Bundle args) {
@@ -399,7 +404,7 @@ public class MainActivity extends CastEnabledActivity {
loadFragment(fragment);
}
- private void loadFragment(Fragment fragment) {
+ public void loadFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
// clear back stack
for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {
@@ -591,9 +596,8 @@ public class MainActivity extends CastEnabledActivity {
long feedId = intent.getLongExtra(EXTRA_FEED_ID, 0);
Bundle args = intent.getBundleExtra(MainActivityStarter.EXTRA_FRAGMENT_ARGS);
if (feedId > 0) {
- boolean startedFromSearch = intent.getBooleanExtra(EXTRA_STARTED_FROM_SEARCH, false);
boolean addToBackStack = intent.getBooleanExtra(EXTRA_ADD_TO_BACK_STACK, false);
- if (startedFromSearch || addToBackStack) {
+ if (addToBackStack) {
loadChildFragment(FeedItemlistFragment.newInstance(feedId));
} else {
loadFeedFragmentById(feedId, args);
@@ -604,7 +608,12 @@ public class MainActivity extends CastEnabledActivity {
String tag = intent.getStringExtra(MainActivityStarter.EXTRA_FRAGMENT_TAG);
Bundle args = intent.getBundleExtra(MainActivityStarter.EXTRA_FRAGMENT_ARGS);
if (tag != null) {
- loadFragment(tag, args);
+ Fragment fragment = createFragmentInstance(tag, args);
+ if (intent.getBooleanExtra(MainActivityStarter.EXTRA_ADD_TO_BACK_STACK, false)) {
+ loadChildFragment(fragment);
+ } else {
+ loadFragment(fragment);
+ }
}
sheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
} else if (intent.getBooleanExtra(MainActivityStarter.EXTRA_OPEN_PLAYER, false)) {
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index 72c200231..3a9fc9b46 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -12,7 +12,6 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
-import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -23,13 +22,13 @@ import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.app.NavUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter;
+import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
import de.danoeh.antennapod.core.service.download.DownloadRequestCreator;
import de.danoeh.antennapod.net.discovery.FeedUrlNotFoundException;
@@ -85,6 +84,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import static de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter.ARG_FEEDURL;
+import static de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter.ARG_STARTED_FROM_SEARCH;
+import static de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter.ARG_WAS_MANUAL_URL;
+
/**
* Downloads a feed from a feed URL and parses it. Subclasses can display the
* feed object that was parsed. This activity MUST be started with a given URL
@@ -95,8 +98,6 @@ import java.util.Map;
*/
public class OnlineFeedViewActivity extends AppCompatActivity {
- public static final String ARG_FEEDURL = "arg.feedurl";
- public static final String ARG_WAS_MANUAL_URL = "manual_url";
private static final int RESULT_ERROR = 2;
private static final String TAG = "OnlineFeedViewActivity";
private static final String PREFS = "OnlineFeedViewActivityPreferences";
@@ -236,20 +237,6 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- Intent destIntent = new Intent(this, MainActivity.class);
- if (NavUtils.shouldUpRecreateTask(this, destIntent)) {
- startActivity(destIntent);
- } else {
- NavUtils.navigateUpFromSameTask(this);
- }
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
private void lookupUrlAndDownload(String url) {
download = PodcastSearcherRegistry.lookupUrl(url)
.subscribeOn(Schedulers.io())
@@ -521,13 +508,14 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
}
private void openFeed() {
- // feed.getId() is always 0, we have to retrieve the id from the feed list from
- // the database
- Intent intent = MainActivity.getIntentToOpenFeed(this, getFeedId());
- intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH,
- getIntent().getBooleanExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, false));
+ // feed.getId() is always 0, we have to retrieve the id from the feed list from the database
+ MainActivityStarter mainActivityStarter = new MainActivityStarter(this);
+ mainActivityStarter.withOpenFeed(getFeedId());
+ if (getIntent().getBooleanExtra(ARG_STARTED_FROM_SEARCH, false)) {
+ mainActivityStarter.withAddToBackStack();
+ }
finish();
- startActivity(intent);
+ startActivity(mainActivityStarter.getIntent());
}
private void handleUpdatedFeedStatus() {
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedDiscoverAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedDiscoverAdapter.java
deleted file mode 100644
index 5e2c091e9..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedDiscoverAdapter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package de.danoeh.antennapod.adapter;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.load.resource.bitmap.FitCenter;
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
-import com.bumptech.glide.request.RequestOptions;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-public class FeedDiscoverAdapter extends BaseAdapter {
-
- private final WeakReference<MainActivity> mainActivityRef;
- private final List<PodcastSearchResult> data = new ArrayList<>();
-
- public FeedDiscoverAdapter(MainActivity mainActivity) {
- this.mainActivityRef = new WeakReference<>(mainActivity);
- }
-
- public void updateData(List<PodcastSearchResult> newData) {
- data.clear();
- data.addAll(newData);
- notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return data.size();
- }
-
- @Override
- public PodcastSearchResult getItem(int position) {
- return data.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return 0;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Holder holder;
-
- if (convertView == null) {
- convertView = View.inflate(mainActivityRef.get(), R.layout.quick_feed_discovery_item, null);
- holder = new Holder();
- holder.imageView = convertView.findViewById(R.id.discovery_cover);
- convertView.setTag(holder);
- } else {
- holder = (Holder) convertView.getTag();
- }
-
-
- final PodcastSearchResult podcast = getItem(position);
- holder.imageView.setContentDescription(podcast.title);
-
- Glide.with(mainActivityRef.get())
- .load(podcast.imageUrl)
- .apply(new RequestOptions()
- .placeholder(R.color.light_gray)
- .transform(new FitCenter(), new RoundedCorners((int)
- (8 * mainActivityRef.get().getResources().getDisplayMetrics().density)))
- .dontAnimate())
- .into(holder.imageView);
-
- return convertView;
- }
-
- static class Holder {
- ImageView imageView;
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
deleted file mode 100644
index 9b514dd98..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package de.danoeh.antennapod.adapter.itunes;
-
-import android.content.Context;
-import android.widget.ArrayAdapter;
-import androidx.annotation.NonNull;
-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.load.engine.DiskCacheStrategy;
-
-import com.bumptech.glide.load.resource.bitmap.FitCenter;
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
-import com.bumptech.glide.request.RequestOptions;
-
-import java.util.List;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
-
-public class ItunesAdapter extends ArrayAdapter<PodcastSearchResult> {
- /**
- * Related Context
- */
- private final Context context;
-
- /**
- * List holding the podcasts found in the search
- */
- private final List<PodcastSearchResult> data;
-
- /**
- * Constructor.
- *
- * @param context Related context
- * @param objects Search result
- */
- public ItunesAdapter(Context context, List<PodcastSearchResult> objects) {
- super(context, 0, objects);
- this.data = objects;
- this.context = context;
- }
-
- @NonNull
- @Override
- public View getView(int position, View convertView, @NonNull ViewGroup parent) {
- //Current podcast
- PodcastSearchResult podcast = data.get(position);
-
- //ViewHolder
- PodcastViewHolder viewHolder;
-
- //Resulting view
- View view;
-
- //Handle view holder stuff
- if(convertView == null) {
- view = ((MainActivity) context).getLayoutInflater()
- .inflate(R.layout.itunes_podcast_listitem, parent, false);
- viewHolder = new PodcastViewHolder(view);
- view.setTag(viewHolder);
- } else {
- view = convertView;
- viewHolder = (PodcastViewHolder) view.getTag();
- }
-
- // Set the title
- viewHolder.titleView.setText(podcast.title);
- if (podcast.author != null && ! podcast.author.trim().isEmpty()) {
- viewHolder.authorView.setText(podcast.author);
- viewHolder.authorView.setVisibility(View.VISIBLE);
- } else if (podcast.feedUrl != null && !podcast.feedUrl.contains("itunes.apple.com")) {
- viewHolder.authorView.setText(podcast.feedUrl);
- viewHolder.authorView.setVisibility(View.VISIBLE);
- } else {
- viewHolder.authorView.setVisibility(View.GONE);
- }
-
- //Update the empty imageView with the image from the feed
- Glide.with(context)
- .load(podcast.imageUrl)
- .apply(new RequestOptions()
- .placeholder(R.color.light_gray)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .transform(new FitCenter(),
- new RoundedCorners((int) (4 * context.getResources().getDisplayMetrics().density)))
- .dontAnimate())
- .into(viewHolder.coverView);
-
- //Feed the grid view
- return view;
- }
-
- /**
- * View holder object for the GridView
- */
- static class PodcastViewHolder {
-
- /**
- * ImageView holding the Podcast image
- */
- final ImageView coverView;
-
- /**
- * TextView holding the Podcast title
- */
- final TextView titleView;
-
- final TextView authorView;
-
-
- /**
- * Constructor
- * @param view GridView cell
- */
- PodcastViewHolder(View view){
- coverView = view.findViewById(R.id.imgvCover);
- titleView = view.findViewById(R.id.txtvTitle);
- authorView = view.findViewById(R.id.txtvAuthor);
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
index 5074c5b64..1ec917176 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
@@ -25,7 +25,6 @@ import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.activity.OpmlImportActivity;
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
import de.danoeh.antennapod.model.feed.Feed;
@@ -38,6 +37,8 @@ import de.danoeh.antennapod.net.discovery.FyydPodcastSearcher;
import de.danoeh.antennapod.net.discovery.GpodnetPodcastSearcher;
import de.danoeh.antennapod.net.discovery.ItunesPodcastSearcher;
import de.danoeh.antennapod.net.discovery.PodcastIndexPodcastSearcher;
+import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
+import de.danoeh.antennapod.ui.discovery.OnlineSearchFragment;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
@@ -145,10 +146,7 @@ public class AddFeedFragment extends Fragment {
}
private void addUrl(String url) {
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, url);
- intent.putExtra(OnlineFeedViewActivity.ARG_WAS_MANUAL_URL, true);
- startActivity(intent);
+ startActivity(new OnlineFeedviewActivityStarter(getContext(), url).withManualUrl().getIntent());
}
private void performSearch() {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
deleted file mode 100644
index f7d9710d7..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
+++ /dev/null
@@ -1,282 +0,0 @@
-package de.danoeh.antennapod.fragment;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.GridView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import androidx.annotation.NonNull;
-import androidx.appcompat.widget.Toolbar;
-import androidx.fragment.app.Fragment;
-import com.google.android.material.appbar.MaterialToolbar;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.MaterialAutoCompleteTextView;
-import com.google.android.material.textfield.TextInputLayout;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
-import de.danoeh.antennapod.adapter.itunes.ItunesAdapter;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.storage.database.DBReader;
-import de.danoeh.antennapod.event.DiscoveryDefaultUpdateEvent;
-import de.danoeh.antennapod.net.discovery.ItunesTopListLoader;
-import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-import org.greenrobot.eventbus.EventBus;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * Searches iTunes store for top podcasts and displays results in a list.
- */
-public class DiscoveryFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
-
- private static final String TAG = "ItunesSearchFragment";
- private static final int NUM_OF_TOP_PODCASTS = 25;
- private SharedPreferences prefs;
-
- /**
- * Adapter responsible with the search results.
- */
- private ItunesAdapter adapter;
- private GridView gridView;
- private ProgressBar progressBar;
- private TextView txtvError;
- private Button butRetry;
- private TextView txtvEmpty;
-
- /**
- * List of podcasts retreived from the search.
- */
- private List<PodcastSearchResult> searchResults;
- private List<PodcastSearchResult> topList;
- private Disposable disposable;
- private String countryCode = "US";
- private boolean hidden;
- private boolean needsConfirm;
- private MaterialToolbar toolbar;
-
- public DiscoveryFragment() {
- // Required empty public constructor
- }
-
- /**
- * Replace adapter data with provided search results from SearchTask.
- *
- * @param result List of Podcast objects containing search results
- */
- 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 (PodcastSearchResult p : result) {
- adapter.add(p);
- }
- adapter.notifyDataSetInvalidated();
- } else {
- gridView.setVisibility(View.GONE);
- txtvEmpty.setVisibility(View.VISIBLE);
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, Context.MODE_PRIVATE);
- countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, Locale.getDefault().getCountry());
- hidden = prefs.getBoolean(ItunesTopListLoader.PREF_KEY_HIDDEN_DISCOVERY_COUNTRY, false);
- needsConfirm = prefs.getBoolean(ItunesTopListLoader.PREF_KEY_NEEDS_CONFIRM, true);
- }
-
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- gridView = root.findViewById(R.id.gridView);
- adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
- gridView.setAdapter(adapter);
-
- toolbar = root.findViewById(R.id.toolbar);
- toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
- toolbar.inflateMenu(R.menu.countries_menu);
- MenuItem discoverHideItem = toolbar.getMenu().findItem(R.id.discover_hide_item);
- discoverHideItem.setChecked(hidden);
- toolbar.setOnMenuItemClickListener(this);
-
- //Show information about the podcast when the list item is clicked
- gridView.setOnItemClickListener((parent, view1, position, id) -> {
- PodcastSearchResult podcast = searchResults.get(position);
- if (podcast.feedUrl == null) {
- return;
- }
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, podcast.feedUrl);
- startActivity(intent);
- });
-
- progressBar = root.findViewById(R.id.progressBar);
- txtvError = root.findViewById(R.id.txtvError);
- butRetry = root.findViewById(R.id.butRetry);
- txtvEmpty = root.findViewById(android.R.id.empty);
-
- loadToplist(countryCode);
- return root;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (disposable != null) {
- disposable.dispose();
- }
- adapter = null;
- }
-
- private void loadToplist(String country) {
- if (disposable != null) {
- disposable.dispose();
- }
-
- gridView.setVisibility(View.GONE);
- txtvError.setVisibility(View.GONE);
- butRetry.setVisibility(View.GONE);
- butRetry.setText(R.string.retry_label);
- txtvEmpty.setVisibility(View.GONE);
- progressBar.setVisibility(View.VISIBLE);
-
- if (hidden) {
- gridView.setVisibility(View.GONE);
- txtvError.setVisibility(View.VISIBLE);
- txtvError.setText(getResources().getString(R.string.discover_is_hidden));
- butRetry.setVisibility(View.GONE);
- txtvEmpty.setVisibility(View.GONE);
- progressBar.setVisibility(View.GONE);
- return;
- }
- //noinspection ConstantConditions
- if (BuildConfig.FLAVOR.equals("free") && needsConfirm) {
- txtvError.setVisibility(View.VISIBLE);
- txtvError.setText("");
- butRetry.setVisibility(View.VISIBLE);
- butRetry.setText(R.string.discover_confirm);
- butRetry.setOnClickListener(v -> {
- prefs.edit().putBoolean(ItunesTopListLoader.PREF_KEY_NEEDS_CONFIRM, false).apply();
- needsConfirm = false;
- loadToplist(country);
- });
- txtvEmpty.setVisibility(View.GONE);
- progressBar.setVisibility(View.GONE);
- return;
- }
-
- ItunesTopListLoader loader = new ItunesTopListLoader(getContext());
- disposable = Observable.fromCallable(() ->
- loader.loadToplist(country, NUM_OF_TOP_PODCASTS, DBReader.getFeedList()))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- podcasts -> {
- progressBar.setVisibility(View.GONE);
- topList = podcasts;
- updateData(topList);
- }, error -> {
- Log.e(TAG, Log.getStackTraceString(error));
- progressBar.setVisibility(View.GONE);
- txtvError.setText(error.getMessage());
- txtvError.setVisibility(View.VISIBLE);
- butRetry.setOnClickListener(v -> loadToplist(country));
- butRetry.setVisibility(View.VISIBLE);
- });
- }
-
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- final int itemId = item.getItemId();
- if (itemId == R.id.discover_hide_item) {
- item.setChecked(!item.isChecked());
- hidden = item.isChecked();
- prefs.edit().putBoolean(ItunesTopListLoader.PREF_KEY_HIDDEN_DISCOVERY_COUNTRY, hidden).apply();
-
- EventBus.getDefault().post(new DiscoveryDefaultUpdateEvent());
- loadToplist(countryCode);
- return true;
- } else if (itemId == R.id.discover_countries_item) {
-
- LayoutInflater inflater = getLayoutInflater();
- View selectCountryDialogView = inflater.inflate(R.layout.select_country_dialog, null);
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
- builder.setView(selectCountryDialogView);
-
- List<String> countryCodeArray = new ArrayList<>(Arrays.asList(Locale.getISOCountries()));
- Map<String, String> countryCodeNames = new HashMap<>();
- Map<String, String> countryNameCodes = new HashMap<>();
- for (String code : countryCodeArray) {
- Locale locale = new Locale("", code);
- String countryName = locale.getDisplayCountry();
- countryCodeNames.put(code, countryName);
- countryNameCodes.put(countryName, code);
- }
-
- List<String> countryNamesSort = new ArrayList<>(countryCodeNames.values());
- Collections.sort(countryNamesSort);
-
- ArrayAdapter<String> dataAdapter =
- new ArrayAdapter<>(this.getContext(), android.R.layout.simple_list_item_1, countryNamesSort);
- TextInputLayout textInput = selectCountryDialogView.findViewById(R.id.country_text_input);
- MaterialAutoCompleteTextView editText = (MaterialAutoCompleteTextView) textInput.getEditText();
- editText.setAdapter(dataAdapter);
- editText.setText(countryCodeNames.get(countryCode));
- editText.setOnClickListener(view -> {
- if (editText.getText().length() != 0) {
- editText.setText("");
- editText.postDelayed(editText::showDropDown, 100);
- }
- });
- editText.setOnFocusChangeListener((v, hasFocus) -> {
- if (hasFocus) {
- editText.setText("");
- editText.postDelayed(editText::showDropDown, 100);
- }
- });
-
- builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
- String countryName = editText.getText().toString();
- if (countryNameCodes.containsKey(countryName)) {
- countryCode = countryNameCodes.get(countryName);
- MenuItem discoverHideItem = toolbar.getMenu().findItem(R.id.discover_hide_item);
- discoverHideItem.setChecked(false);
- hidden = false;
- }
-
- prefs.edit().putBoolean(ItunesTopListLoader.PREF_KEY_HIDDEN_DISCOVERY_COUNTRY, hidden).apply();
- prefs.edit().putString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, countryCode).apply();
-
- EventBus.getDefault().post(new DiscoveryDefaultUpdateEvent());
- loadToplist(countryCode);
- });
- builder.setNegativeButton(R.string.cancel_label, null);
- builder.show();
- return true;
- }
- return false;
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
deleted file mode 100644
index 9e34c0a27..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package de.danoeh.antennapod.fragment;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.AbsListView;
-import android.widget.Button;
-import android.widget.GridView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.appcompat.widget.SearchView;
-import androidx.fragment.app.Fragment;
-
-import com.google.android.material.appbar.MaterialToolbar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
-import de.danoeh.antennapod.adapter.itunes.ItunesAdapter;
-import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
-import de.danoeh.antennapod.net.discovery.PodcastSearcher;
-import de.danoeh.antennapod.net.discovery.PodcastSearcherRegistry;
-import io.reactivex.disposables.Disposable;
-
-public class OnlineSearchFragment extends Fragment {
-
- private static final String TAG = "FyydSearchFragment";
- private static final String ARG_SEARCHER = "searcher";
- private static final String ARG_QUERY = "query";
-
- /**
- * Adapter responsible with the search results
- */
- private ItunesAdapter adapter;
- private PodcastSearcher searchProvider;
- private GridView gridView;
- private ProgressBar progressBar;
- private TextView txtvError;
- private Button butRetry;
- private TextView txtvEmpty;
-
- /**
- * List of podcasts retreived from the search
- */
- private List<PodcastSearchResult> searchResults;
- private Disposable disposable;
-
- public static OnlineSearchFragment newInstance(Class<? extends PodcastSearcher> searchProvider) {
- return newInstance(searchProvider, null);
- }
-
- public static OnlineSearchFragment newInstance(Class<? extends PodcastSearcher> searchProvider, String query) {
- OnlineSearchFragment fragment = new OnlineSearchFragment();
- Bundle arguments = new Bundle();
- arguments.putString(ARG_SEARCHER, searchProvider.getName());
- arguments.putString(ARG_QUERY, query);
- fragment.setArguments(arguments);
- return fragment;
- }
-
- /**
- * Constructor
- */
- public OnlineSearchFragment() {
- // Required empty public constructor
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- for (PodcastSearcherRegistry.SearcherInfo info : PodcastSearcherRegistry.getSearchProviders()) {
- if (info.searcher.getClass().getName().equals(getArguments().getString(ARG_SEARCHER))) {
- searchProvider = info.searcher;
- break;
- }
- }
- if (searchProvider == null) {
- throw new IllegalArgumentException("Podcast searcher not found");
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- gridView = root.findViewById(R.id.gridView);
- adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
- gridView.setAdapter(adapter);
-
- //Show information about the podcast when the list item is clicked
- gridView.setOnItemClickListener((parent, view1, position, id) -> {
- PodcastSearchResult podcast = searchResults.get(position);
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, podcast.feedUrl);
- intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, true);
- startActivity(intent);
- });
- progressBar = root.findViewById(R.id.progressBar);
- txtvError = root.findViewById(R.id.txtvError);
- butRetry = root.findViewById(R.id.butRetry);
- txtvEmpty = root.findViewById(android.R.id.empty);
- TextView txtvPoweredBy = root.findViewById(R.id.search_powered_by);
- txtvPoweredBy.setText(getString(R.string.search_powered_by, searchProvider.getName()));
- setupToolbar(root.findViewById(R.id.toolbar));
-
- gridView.setOnScrollListener(new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
- InputMethodManager imm = (InputMethodManager)
- getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
- }
- }
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- }
- });
- return root;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (disposable != null) {
- disposable.dispose();
- }
- adapter = null;
- }
-
- private void setupToolbar(MaterialToolbar toolbar) {
- toolbar.inflateMenu(R.menu.online_search);
- toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
-
- MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search);
- final SearchView sv = (SearchView) searchItem.getActionView();
- sv.setQueryHint(getString(R.string.search_podcast_hint));
- sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
- @Override
- public boolean onQueryTextSubmit(String s) {
- sv.clearFocus();
- search(s);
- return true;
- }
-
- @Override
- public boolean onQueryTextChange(String s) {
- return false;
- }
- });
- sv.setOnQueryTextFocusChangeListener((view, hasFocus) -> {
- if (hasFocus) {
- showInputMethod(view.findFocus());
- }
- });
- searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
- @Override
- public boolean onMenuItemActionExpand(MenuItem item) {
- return true;
- }
-
- @Override
- public boolean onMenuItemActionCollapse(MenuItem item) {
- getActivity().getSupportFragmentManager().popBackStack();
- return true;
- }
- });
- searchItem.expandActionView();
-
- if (getArguments().getString(ARG_QUERY, null) != null) {
- sv.setQuery(getArguments().getString(ARG_QUERY, null), true);
- }
- }
-
- private void search(String query) {
- if (disposable != null) {
- disposable.dispose();
- }
- showOnlyProgressBar();
- disposable = searchProvider.search(query).subscribe(result -> {
- searchResults = result;
- progressBar.setVisibility(View.GONE);
- adapter.clear();
- adapter.addAll(searchResults);
- adapter.notifyDataSetInvalidated();
- gridView.setVisibility(!searchResults.isEmpty() ? View.VISIBLE : View.GONE);
- txtvEmpty.setVisibility(searchResults.isEmpty() ? View.VISIBLE : View.GONE);
- txtvEmpty.setText(getString(R.string.no_results_for_query, query));
- }, 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);
- });
- }
-
- private void showOnlyProgressBar() {
- gridView.setVisibility(View.GONE);
- txtvError.setVisibility(View.GONE);
- butRetry.setVisibility(View.GONE);
- txtvEmpty.setVisibility(View.GONE);
- progressBar.setVisibility(View.VISIBLE);
- }
-
- private void showInputMethod(View view) {
- InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
- if (imm != null) {
- imm.showSoftInput(view, 0);
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java
deleted file mode 100644
index f68fc1a81..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package de.danoeh.antennapod.fragment;
-
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.DisplayMetrics;
-
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.Button;
-import android.widget.GridView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import androidx.fragment.app.Fragment;
-import de.danoeh.antennapod.BuildConfig;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
-import de.danoeh.antennapod.adapter.FeedDiscoverAdapter;
-import de.danoeh.antennapod.storage.database.DBReader;
-import de.danoeh.antennapod.event.DiscoveryDefaultUpdateEvent;
-import de.danoeh.antennapod.net.discovery.ItunesTopListLoader;
-import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
-import io.reactivex.Observable;
-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;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import static android.content.Context.MODE_PRIVATE;
-
-
-public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.OnItemClickListener {
- private static final String TAG = "FeedDiscoveryFragment";
- private static final int NUM_SUGGESTIONS = 12;
-
- private Disposable disposable;
- private FeedDiscoverAdapter adapter;
- private GridView discoverGridLayout;
- private TextView errorTextView;
- private TextView poweredByTextView;
- private LinearLayout errorView;
- private Button errorRetry;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
- View root = inflater.inflate(R.layout.quick_feed_discovery, container, false);
- View discoverMore = root.findViewById(R.id.discover_more);
- discoverMore.setOnClickListener(v ->
- ((MainActivity) getActivity()).loadChildFragment(new DiscoveryFragment()));
-
- discoverGridLayout = root.findViewById(R.id.discover_grid);
- errorView = root.findViewById(R.id.discover_error);
- errorTextView = root.findViewById(R.id.discover_error_txtV);
- errorRetry = root.findViewById(R.id.discover_error_retry_btn);
- poweredByTextView = root.findViewById(R.id.discover_powered_by_itunes);
-
- adapter = new FeedDiscoverAdapter((MainActivity) getActivity());
- discoverGridLayout.setAdapter(adapter);
- discoverGridLayout.setOnItemClickListener(this);
-
- DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
- float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
- if (screenWidthDp > 600) {
- discoverGridLayout.setNumColumns(6);
- } else {
- discoverGridLayout.setNumColumns(4);
- }
-
- // Fill with dummy elements to have a fixed height and
- // prevent the UI elements below from jumping on slow connections
- List<PodcastSearchResult> dummies = new ArrayList<>();
- for (int i = 0; i < NUM_SUGGESTIONS; i++) {
- dummies.add(PodcastSearchResult.dummy());
- }
-
- adapter.updateData(dummies);
- loadToplist();
-
- EventBus.getDefault().register(this);
- return root;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- EventBus.getDefault().unregister(this);
- if (disposable != null) {
- disposable.dispose();
- }
- }
-
- @Subscribe(threadMode = ThreadMode.MAIN)
- @SuppressWarnings("unused")
- public void onDiscoveryDefaultUpdateEvent(DiscoveryDefaultUpdateEvent event) {
- loadToplist();
- }
-
- private void loadToplist() {
- errorView.setVisibility(View.GONE);
- errorRetry.setVisibility(View.INVISIBLE);
- errorRetry.setText(R.string.retry_label);
- poweredByTextView.setVisibility(View.VISIBLE);
-
- ItunesTopListLoader loader = new ItunesTopListLoader(getContext());
- SharedPreferences prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, MODE_PRIVATE);
- String countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE,
- Locale.getDefault().getCountry());
- if (prefs.getBoolean(ItunesTopListLoader.PREF_KEY_HIDDEN_DISCOVERY_COUNTRY, false)) {
- errorTextView.setText(R.string.discover_is_hidden);
- errorView.setVisibility(View.VISIBLE);
- discoverGridLayout.setVisibility(View.GONE);
- errorRetry.setVisibility(View.GONE);
- poweredByTextView.setVisibility(View.GONE);
- return;
- }
- //noinspection ConstantConditions
- if (BuildConfig.FLAVOR.equals("free") && prefs.getBoolean(ItunesTopListLoader.PREF_KEY_NEEDS_CONFIRM, true)) {
- errorTextView.setText("");
- errorView.setVisibility(View.VISIBLE);
- discoverGridLayout.setVisibility(View.VISIBLE);
- errorRetry.setVisibility(View.VISIBLE);
- errorRetry.setText(R.string.discover_confirm);
- poweredByTextView.setVisibility(View.VISIBLE);
- errorRetry.setOnClickListener(v -> {
- prefs.edit().putBoolean(ItunesTopListLoader.PREF_KEY_NEEDS_CONFIRM, false).apply();
- loadToplist();
- });
- return;
- }
-
- disposable = Observable.fromCallable(() ->
- loader.loadToplist(countryCode, NUM_SUGGESTIONS, DBReader.getFeedList()))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- podcasts -> {
- errorView.setVisibility(View.GONE);
- if (podcasts.size() == 0) {
- errorTextView.setText(getResources().getText(R.string.search_status_no_results));
- errorView.setVisibility(View.VISIBLE);
- discoverGridLayout.setVisibility(View.INVISIBLE);
- } else {
- discoverGridLayout.setVisibility(View.VISIBLE);
- adapter.updateData(podcasts);
- }
- }, error -> {
- Log.e(TAG, Log.getStackTraceString(error));
- errorTextView.setText(error.getLocalizedMessage());
- errorView.setVisibility(View.VISIBLE);
- discoverGridLayout.setVisibility(View.INVISIBLE);
- errorRetry.setVisibility(View.VISIBLE);
- errorRetry.setOnClickListener(v -> loadToplist());
- });
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
- PodcastSearchResult podcast = adapter.getItem(position);
- if (TextUtils.isEmpty(podcast.feedUrl)) {
- return;
- }
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, podcast.feedUrl);
- startActivity(intent);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 76b53a264..73fce9f1f 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -2,7 +2,6 @@ package de.danoeh.antennapod.fragment;
import android.content.Context;
-import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -29,7 +28,6 @@ import com.leinardi.android.speeddial.SpeedDialView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
import de.danoeh.antennapod.adapter.HorizontalFeedListAdapter;
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
@@ -46,6 +44,8 @@ import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
import de.danoeh.antennapod.net.discovery.CombinedSearcher;
import de.danoeh.antennapod.storage.database.DBReader;
+import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
+import de.danoeh.antennapod.ui.discovery.OnlineSearchFragment;
import de.danoeh.antennapod.view.EmptyViewHandler;
import de.danoeh.antennapod.view.EpisodeItemListRecyclerView;
import de.danoeh.antennapod.view.LiftOnScrollListener;
@@ -425,9 +425,7 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O
in.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
String query = searchView.getQuery().toString();
if (query.matches("http[s]?://.*")) {
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, query);
- startActivity(intent);
+ startActivity(new OnlineFeedviewActivityStarter(getContext(), query).getIntent());
return;
}
((MainActivity) getActivity()).loadChildFragment(