diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java index 0784cb078..d0b2cb4b4 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -23,12 +23,9 @@ import java.io.IOException; import static androidx.test.InstrumentationRegistry.getInstrumentation; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.replaceText; import static androidx.test.espresso.action.ViewActions.scrollTo; -import static androidx.test.espresso.action.ViewActions.typeText; import static androidx.test.espresso.contrib.ActivityResultMatchers.hasResultCode; -import static androidx.test.espresso.intent.Intents.intended; -import static androidx.test.espresso.intent.Intents.times; -import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; @@ -77,7 +74,8 @@ public class MainActivityTest { final Feed feed = uiTestUtils.hostedFeeds.get(0); openNavDrawer(); onView(withText(R.string.add_feed_label)).perform(click()); - onView(withId(R.id.etxtFeedurl)).perform(scrollTo(), typeText(feed.getDownload_url())); + onView(withId(R.id.btn_add_via_url)).perform(scrollTo(), click()); + onView(withId(R.id.text)).perform(replaceText(feed.getDownload_url())); onView(withText(R.string.confirm_label)).perform(scrollTo(), click()); Espresso.closeSoftKeyboard(); onView(withText(R.string.subscribe_label)).perform(click()); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java index aa4389057..973e4da2b 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java @@ -116,7 +116,7 @@ public class NavigationDrawerTest { openNavDrawer(); onView(withId(R.id.nav_list)).perform(swipeUp()); onDrawerItem(withText(R.string.add_feed_label)).perform(click()); - onView(isRoot()).perform(waitForView(withId(R.id.txtvFeedurl), 1000)); + onView(isRoot()).perform(waitForView(withId(R.id.btn_add_via_url), 1000)); assertEquals(activity.getString(R.string.add_feed_label), activity.getSupportActionBar().getTitle()); // podcasts 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 7cdcce36f..3ba6be3d9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java @@ -2,20 +2,19 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.Fragment; -import android.view.ContextMenu; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.EditText; - +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.OnlineFeedViewActivity; @@ -23,16 +22,11 @@ import de.danoeh.antennapod.activity.OpmlImportActivity; import de.danoeh.antennapod.fragment.gpodnet.GpodnetMainFragment; /** - * Provides actions for adding new podcast subscriptions + * Provides actions for adding new podcast subscriptions. */ public class AddFeedFragment extends Fragment { public static final String TAG = "AddFeedFragment"; - - /** - * Preset value for url text field. - */ - private static final String ARG_FEED_URL = "feedurl"; private static final int REQUEST_CODE_CHOOSE_OPML_IMPORT_PATH = 1; private EditText combinedFeedSearchBox; @@ -45,8 +39,20 @@ public class AddFeedFragment extends Fragment { activity = (MainActivity) getActivity(); ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); - setupAdvancedSearchButtons(root); - setupSeachBox(root); + root.findViewById(R.id.btn_search_itunes).setOnClickListener(v + -> activity.loadChildFragment(new ItunesSearchFragment())); + root.findViewById(R.id.btn_search_fyyd).setOnClickListener(v + -> activity.loadChildFragment(new FyydSearchFragment())); + root.findViewById(R.id.btn_search_gpodder).setOnClickListener(v + -> activity.loadChildFragment(new GpodnetMainFragment())); + + combinedFeedSearchBox = root.findViewById(R.id.combinedFeedSearchBox); + combinedFeedSearchBox.setOnEditorActionListener((v, actionId, event) -> { + performSearch(); + return true; + }); + root.findViewById(R.id.btn_add_via_url).setOnClickListener(v + -> showAddViaUrlDialog()); View butOpmlImport = root.findViewById(R.id.btn_opml_import); butOpmlImport.setOnClickListener(v -> { @@ -63,54 +69,20 @@ public class AddFeedFragment extends Fragment { return root; } - private void setupSeachBox(View root) { - final EditText etxtFeedurl = root.findViewById(R.id.etxtFeedurl); - - Bundle args = getArguments(); - if (args != null && args.getString(ARG_FEED_URL) != null) { - etxtFeedurl.setText(args.getString(ARG_FEED_URL)); - } - - Button butConfirmAddUrl = root.findViewById(R.id.butConfirm); - butConfirmAddUrl.setOnClickListener(v -> { - addUrl(etxtFeedurl.getText().toString()); - }); - - combinedFeedSearchBox = root.findViewById(R.id.combinedFeedSearchBox); - combinedFeedSearchBox.setOnEditorActionListener((v, actionId, event) -> { - performSearch(); - return true; - }); + private void showAddViaUrlDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.add_podcast_by_url); + View content = View.inflate(getContext(), R.layout.edit_text_dialog, null); + EditText editText = content.findViewById(R.id.text); + editText.setHint(R.string.add_podcast_by_url_hint); + ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + editText.setText(clipboard.getText()); + builder.setView(content); + builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> addUrl(editText.getText().toString())); + builder.setNegativeButton(R.string.cancel_label, null); + builder.show(); } - private void setupAdvancedSearchButtons(View root) { - View butAdvancedSearch = root.findViewById(R.id.advanced_search); - registerForContextMenu(butAdvancedSearch); - butAdvancedSearch.setOnClickListener(v -> butAdvancedSearch.showContextMenu()); - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - getActivity().getMenuInflater().inflate(R.menu.advanced_search, menu); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.search_fyyd: - activity.loadChildFragment(new FyydSearchFragment()); - return true; - case R.id.search_gpodder: - activity.loadChildFragment(new GpodnetMainFragment()); - return true; - case R.id.search_itunes: - activity.loadChildFragment(new ItunesSearchFragment()); - return true; - } - return false; - } - - private void addUrl(String url) { Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class); intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, url); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java index 7e217cde4..d8d0f41c5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java @@ -2,6 +2,7 @@ package de.danoeh.antennapod.fragment; import android.content.Intent; import android.os.Bundle; +import android.util.DisplayMetrics; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import android.util.Log; @@ -26,11 +27,12 @@ import java.util.List; public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.OnItemClickListener { private static final String TAG = "FeedDiscoveryFragment"; + private static final int NUM_SUGGESTIONS = 12; private ProgressBar progressBar; private Disposable disposable; private FeedDiscoverAdapter adapter; - private GridView subscriptionGridLayout; + private GridView discoverGridLayout; private TextView errorTextView; @Override @@ -41,24 +43,31 @@ public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView. discoverMore.setOnClickListener(v -> ((MainActivity) getActivity()).loadChildFragment(new ItunesSearchFragment())); - subscriptionGridLayout = root.findViewById(R.id.discover_grid); + discoverGridLayout = root.findViewById(R.id.discover_grid); progressBar = root.findViewById(R.id.discover_progress_bar); errorTextView = root.findViewById(R.id.discover_error); adapter = new FeedDiscoverAdapter((MainActivity) getActivity()); - subscriptionGridLayout.setAdapter(adapter); - subscriptionGridLayout.setOnItemClickListener(this); + 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 dummies = new ArrayList<>(); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < NUM_SUGGESTIONS; i++) { dummies.add(PodcastSearchResult.dummy()); } + adapter.updateData(dummies); - loadToplist(); - return root; } @@ -72,22 +81,22 @@ public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView. private void loadToplist() { progressBar.setVisibility(View.VISIBLE); - subscriptionGridLayout.setVisibility(View.INVISIBLE); + discoverGridLayout.setVisibility(View.INVISIBLE); errorTextView.setVisibility(View.GONE); ItunesTopListLoader loader = new ItunesTopListLoader(getContext()); - disposable = loader.loadToplist(8) + disposable = loader.loadToplist(NUM_SUGGESTIONS) .subscribe(podcasts -> { errorTextView.setVisibility(View.GONE); progressBar.setVisibility(View.GONE); - subscriptionGridLayout.setVisibility(View.VISIBLE); + discoverGridLayout.setVisibility(View.VISIBLE); adapter.updateData(podcasts); }, error -> { Log.e(TAG, Log.getStackTraceString(error)); errorTextView.setText(error.getLocalizedMessage()); errorTextView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); - subscriptionGridLayout.setVisibility(View.INVISIBLE); + discoverGridLayout.setVisibility(View.INVISIBLE); }); } diff --git a/app/src/main/res/layout/addfeed.xml b/app/src/main/res/layout/addfeed.xml index 8b26332ed..3b9c0ffb4 100644 --- a/app/src/main/res/layout/addfeed.xml +++ b/app/src/main/res/layout/addfeed.xml @@ -13,6 +13,50 @@ app:title="@string/add_feed_label" android:id="@+id/toolbar"/> + + + + + + + + + + + - - - - - - - - - - - - + android:padding="16dp"> + android:layout_height="wrap_content"/> - + android:text="@string/advanced" + android:textSize="18sp" + android:layout_marginTop="16dp" + android:layout_marginBottom="8dp" + android:textColor="?android:attr/textColorPrimary"/> - - - - - - -