summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2022-05-13 20:22:47 +0200
committerByteHamster <info@bytehamster.com>2022-05-13 20:55:52 +0200
commit5448e1f390782ebc3c810ff64e151c89ddcdbc31 (patch)
treed9084666af40bbc145e2cf8b117a0b6a971c441e /app/src
parent6e5004be22f20e3a51697909bf4d1e423252b83c (diff)
downloadAntennaPod-5448e1f390782ebc3c810ff64e151c89ddcdbc31.zip
Remove gpodder toplist
Half of the toplist no longer returns a valid podcast feed. Some of the suggested tags are just random characters and none of them is actually helpful. This does not remove search or synchronization. Just gpodder discovery.
Diffstat (limited to 'app/src')
-rw-r--r--app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java110
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java83
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java54
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java112
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java110
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java16
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java45
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java73
-rw-r--r--app/src/main/res/layout/addfeed.xml230
-rw-r--r--app/src/main/res/layout/fragment_itunes_search.xml27
-rw-r--r--app/src/main/res/layout/gpodnet_podcast_list.xml55
-rw-r--r--app/src/main/res/layout/gpodnet_podcast_listitem.xml80
-rw-r--r--app/src/main/res/layout/gpodnet_tag_listitem.xml37
14 files changed, 135 insertions, 901 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java b/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java
deleted file mode 100644
index b13af78f7..000000000
--- a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package de.test.antennapod.gpodnet;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetServiceException;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetDevice;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetTag;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static java.util.Collections.singletonList;
-
-/**
- * Test class for GpodnetService
- */
-@Ignore("Needs valid credentials to run")
-@RunWith(AndroidJUnit4.class)
-public class GPodnetServiceTest {
-
- private GpodnetService service;
-
- private static final String USER = "";
- private static final String PW = "";
- private static final String DEVICE_ID = "radio";
-
- @Before
- public void setUp() {
- service = new GpodnetService(AntennapodHttpClient.getHttpClient(),
- GpodnetService.DEFAULT_BASE_HOST, DEVICE_ID, USER, PW);
- }
-
- private void authenticate() throws GpodnetServiceException {
- service.login();
- }
-
- @Test
- public void testUploadSubscription() throws GpodnetServiceException {
- authenticate();
- ArrayList<String> l = new ArrayList<>();
- l.add("http://bitsundso.de/feed");
- service.uploadSubscriptions(DEVICE_ID, l);
- }
-
- @Test
- public void testUploadSubscription2() throws GpodnetServiceException {
- authenticate();
- ArrayList<String> l = new ArrayList<>();
- l.add("http://bitsundso.de/feed");
- l.add("http://gamesundso.de/feed");
- service.uploadSubscriptions(DEVICE_ID, l);
- }
-
- @Test
- public void testUploadChanges() throws GpodnetServiceException {
- authenticate();
- String[] URLS = {"http://bitsundso.de/feed", "http://gamesundso.de/feed", "http://cre.fm/feed/mp3/", "http://freakshow.fm/feed/m4a/"};
- List<String> subscriptions = Arrays.asList(URLS[0], URLS[1]);
- List<String> removed = singletonList(URLS[0]);
- List<String> added = Arrays.asList(URLS[2], URLS[3]);
- service.uploadSubscriptions(DEVICE_ID, subscriptions);
- service.uploadSubscriptionChanges(added, removed);
- }
-
- @Test
- public void testGetSubscriptionChanges() throws GpodnetServiceException {
- authenticate();
- service.getSubscriptionChanges(1362322610L);
- }
-
- @Test
- public void testConfigureDevices() throws GpodnetServiceException {
- authenticate();
- service.configureDevice("foo", "This is an updated caption", GpodnetDevice.DeviceType.LAPTOP);
- }
-
- @Test
- public void testGetDevices() throws GpodnetServiceException {
- authenticate();
- service.getDevices();
- }
-
- @Test
- public void testTags() throws GpodnetServiceException {
- service.getTopTags(20);
- }
-
- @Test
- public void testPodcastForTags() throws GpodnetServiceException {
- List<GpodnetTag> tags = service.getTopTags(20);
- service.getPodcastsForTag(tags.get(1),
- 10);
- }
-
- @Test
- public void testSearch() throws GpodnetServiceException {
- service.searchPodcasts("linux", 64);
- }
-
- @Test
- public void testToplist() throws GpodnetServiceException {
- service.getPodcastToplist(10);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
deleted file mode 100644
index a125515cc..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package de.danoeh.antennapod.adapter.gpodnet;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-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.net.sync.gpoddernet.model.GpodnetPodcast;
-import org.apache.commons.lang3.StringUtils;
-
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.glide.ApGlideSettings;
-
-import java.util.List;
-
-/**
- * Adapter for displaying a list of GPodnetPodcast-Objects.
- */
-public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> {
-
- public PodcastListAdapter(Context context, int resource, List<GpodnetPodcast> objects) {
- super(context, resource, objects);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Holder holder;
-
- GpodnetPodcast podcast = getItem(position);
-
- // Inflate Layout
- if (convertView == null) {
- holder = new Holder();
- LayoutInflater inflater = (LayoutInflater) getContext()
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = inflater.inflate(R.layout.gpodnet_podcast_listitem, parent, false);
- holder.image = convertView.findViewById(R.id.imgvCover);
- holder.title = convertView.findViewById(R.id.txtvTitle);
- holder.subscribers = convertView.findViewById(R.id.txtvSubscribers);
- holder.author = convertView.findViewById(R.id.txtvAuthor);
- convertView.setTag(holder);
- } else {
- holder = (Holder) convertView.getTag();
- }
-
- if (StringUtils.isNotBlank(podcast.getLogoUrl())) {
- Glide.with(convertView.getContext())
- .load(podcast.getLogoUrl())
- .apply(new RequestOptions()
- .placeholder(R.color.light_gray)
- .error(R.color.light_gray)
- .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
- .transforms(new FitCenter(),
- new RoundedCorners((int) (4 * convertView.getContext()
- .getResources().getDisplayMetrics().density)))
- .dontAnimate())
- .into(holder.image);
- }
-
- holder.title.setText(podcast.getTitle());
- holder.subscribers.setText(String.valueOf(podcast.getSubscribers()));
- holder.author.setText(podcast.getAuthor());
-
- return convertView;
- }
-
- static class Holder {
- ImageView image;
- TextView title;
- TextView subscribers;
- TextView author;
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
deleted file mode 100644
index b0441688d..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.danoeh.antennapod.adapter.gpodnet;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetTag;
-
-import java.util.List;
-
-/**
- * Adapter for displaying a list of GPodnetPodcast-Objects.
- */
-public class TagListAdapter extends ArrayAdapter<GpodnetTag> {
-
- public TagListAdapter(Context context, int resource, List<GpodnetTag> objects) {
- super(context, resource, objects);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Holder holder;
-
- GpodnetTag tag = getItem(position);
-
- // Inflate Layout
- if (convertView == null) {
- holder = new Holder();
- LayoutInflater inflater = (LayoutInflater) getContext()
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = inflater.inflate(R.layout.gpodnet_tag_listitem, parent, false);
- holder.title = convertView.findViewById(R.id.txtvTitle);
- holder.usage = convertView.findViewById(R.id.txtvUsage);
- convertView.setTag(holder);
- } else {
- holder = (Holder) convertView.getTag();
- }
-
- holder.title.setText(tag.getTitle());
- holder.usage.setText(String.valueOf(tag.getUsage()));
-
- return convertView;
- }
-
- static class Holder {
- TextView title;
- TextView usage;
- }
-}
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 d2a2e6de8..fce5b0ddc 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
@@ -35,9 +35,9 @@ import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.databinding.AddfeedBinding;
import de.danoeh.antennapod.databinding.EditTextDialogBinding;
-import de.danoeh.antennapod.fragment.gpodnet.GpodnetMainFragment;
import de.danoeh.antennapod.net.discovery.CombinedSearcher;
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 io.reactivex.Observable;
@@ -84,7 +84,7 @@ public class AddFeedFragment extends Fragment {
viewBinding.searchFyydButton.setOnClickListener(v
-> activity.loadChildFragment(OnlineSearchFragment.newInstance(FyydPodcastSearcher.class)));
viewBinding.searchGPodderButton.setOnClickListener(v
- -> activity.loadChildFragment(new GpodnetMainFragment()));
+ -> activity.loadChildFragment(OnlineSearchFragment.newInstance(GpodnetPodcastSearcher.class)));
viewBinding.searchPodcastIndexButton.setOnClickListener(v
-> activity.loadChildFragment(OnlineSearchFragment.newInstance(PodcastIndexPodcastSearcher.class)));
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
deleted file mode 100644
index fc2f1fa47..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package de.danoeh.antennapod.fragment.gpodnet;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.widget.SearchView;
-import androidx.appcompat.widget.Toolbar;
-import androidx.fragment.app.Fragment;
-import androidx.viewpager2.adapter.FragmentStateAdapter;
-import androidx.viewpager2.widget.ViewPager2;
-
-import com.google.android.material.tabs.TabLayout;
-import com.google.android.material.tabs.TabLayoutMediator;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.fragment.OnlineSearchFragment;
-import de.danoeh.antennapod.net.discovery.GpodnetPodcastSearcher;
-
-/**
- * Main navigation hub for gpodder.net podcast directory
- */
-public class GpodnetMainFragment extends Fragment {
-
- private static final int NUM_PAGES = 2;
- private static final int POS_TOPLIST = 0;
- private static final int POS_TAGS = 1;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
- View root = inflater.inflate(R.layout.pager_fragment, container, false);
- setupToolbar(root.findViewById(R.id.toolbar));
-
- ViewPager2 viewPager = root.findViewById(R.id.viewpager);
- GpodnetPagerAdapter pagerAdapter = new GpodnetPagerAdapter(this);
- viewPager.setAdapter(pagerAdapter);
-
- // Give the TabLayout the ViewPager
- TabLayout tabLayout = root.findViewById(R.id.sliding_tabs);
-
- new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
- switch (position) {
- case POS_TAGS:
- tab.setText(R.string.gpodnet_taglist_header);
- break;
- case POS_TOPLIST: // Fall-through
- default:
- tab.setText(R.string.gpodnet_toplist_header);
- break;
- }
- }).attach();
-
- return root;
- }
-
- private void setupToolbar(Toolbar toolbar) {
- toolbar.setTitle(R.string.gpodnet_main_label);
- toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
-
- toolbar.inflateMenu(R.menu.search);
- MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search);
- final SearchView sv = (SearchView) searchItem.getActionView();
- sv.setQueryHint(getString(R.string.gpodnet_search_hint));
- sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
- @Override
- public boolean onQueryTextSubmit(String query) {
- Activity activity = getActivity();
- if (activity != null) {
- searchItem.collapseActionView();
- ((MainActivity) activity).loadChildFragment(
- OnlineSearchFragment.newInstance(GpodnetPodcastSearcher.class, query));
- }
- return true;
- }
-
- @Override
- public boolean onQueryTextChange(String s) {
- return false;
- }
- });
- }
-
- public static class GpodnetPagerAdapter extends FragmentStateAdapter {
-
- GpodnetPagerAdapter(@NonNull Fragment fragment) {
- super(fragment);
- }
-
- @NonNull
- @Override
- public Fragment createFragment(int position) {
- switch (position) {
- case POS_TAGS:
- return new TagListFragment();
- case POS_TOPLIST: // Fall-through
- default:
- return new PodcastTopListFragment();
- }
- }
-
- @Override
- public int getItemCount() {
- return NUM_PAGES;
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
deleted file mode 100644
index c2c5adc9a..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package de.danoeh.antennapod.fragment.gpodnet;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.GridView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import androidx.fragment.app.Fragment;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
-import de.danoeh.antennapod.adapter.gpodnet.PodcastListAdapter;
-import de.danoeh.antennapod.core.sync.SynchronizationCredentials;
-import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetServiceException;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-import java.util.List;
-
-/**
- * Displays a list of GPodnetPodcast-Objects in a GridView
- */
-public abstract class PodcastListFragment extends Fragment {
- private static final String TAG = "PodcastListFragment";
-
- private GridView gridView;
- private ProgressBar progressBar;
- private TextView txtvError;
- private Button butRetry;
- private Disposable disposable;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false);
- gridView = root.findViewById(R.id.gridView);
- progressBar = root.findViewById(R.id.progressBar);
- txtvError = root.findViewById(R.id.txtvError);
- butRetry = root.findViewById(R.id.butRetry);
-
- gridView.setOnItemClickListener((parent, view, position, id) ->
- onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position)));
- butRetry.setOnClickListener(v -> loadData());
-
- loadData();
- return root;
- }
-
- private void onPodcastSelected(GpodnetPodcast selection) {
- Log.d(TAG, "Selected podcast: " + selection.toString());
- Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
- intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, selection.getUrl());
- intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, true);
- startActivity(intent);
- }
-
- protected abstract List<GpodnetPodcast> loadPodcastData(GpodnetService service) throws GpodnetServiceException;
-
- final void loadData() {
- if (disposable != null) {
- disposable.dispose();
- }
- gridView.setVisibility(View.GONE);
- progressBar.setVisibility(View.VISIBLE);
- txtvError.setVisibility(View.GONE);
- butRetry.setVisibility(View.GONE);
- disposable = Observable.fromCallable(
- () -> {
- GpodnetService service = new GpodnetService(AntennapodHttpClient.getHttpClient(),
- SynchronizationCredentials.getHosturl(), SynchronizationCredentials.getDeviceID(),
- SynchronizationCredentials.getUsername(), SynchronizationCredentials.getPassword());
- return loadPodcastData(service);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- podcasts -> {
- progressBar.setVisibility(View.GONE);
- butRetry.setVisibility(View.GONE);
-
- if (podcasts.size() > 0) {
- PodcastListAdapter listAdapter = new PodcastListAdapter(getContext(), 0, podcasts);
- gridView.setAdapter(listAdapter);
- listAdapter.notifyDataSetChanged();
- gridView.setVisibility(View.VISIBLE);
- txtvError.setVisibility(View.GONE);
- } else {
- gridView.setVisibility(View.GONE);
- txtvError.setText(getString(R.string.search_status_no_results));
- txtvError.setVisibility(View.VISIBLE);
- }
- }, error -> {
- gridView.setVisibility(View.GONE);
- progressBar.setVisibility(View.GONE);
- txtvError.setText(error.getMessage());
- txtvError.setVisibility(View.VISIBLE);
- butRetry.setVisibility(View.VISIBLE);
- Log.e(TAG, Log.getStackTraceString(error));
- });
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java
deleted file mode 100644
index f51ab032f..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.danoeh.antennapod.fragment.gpodnet;
-
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetServiceException;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
-
-import java.util.List;
-
-public class PodcastTopListFragment extends PodcastListFragment {
- private static final int PODCAST_COUNT = 50;
-
- @Override
- protected List<GpodnetPodcast> loadPodcastData(GpodnetService service) throws GpodnetServiceException {
- return service.getPodcastToplist(PODCAST_COUNT);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java
deleted file mode 100644
index 655cd6ed4..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package de.danoeh.antennapod.fragment.gpodnet;
-
-import android.os.Bundle;
-import androidx.annotation.NonNull;
-
-import java.util.List;
-
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetServiceException;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetTag;
-
-/**
- * Shows all podcasts from gpodder.net that belong to a specific tag.
- * Use the newInstance method of this class to create a new TagFragment.
- */
-public class TagFragment extends PodcastListFragment {
- private static final int PODCAST_COUNT = 50;
-
- private GpodnetTag tag;
-
- public static TagFragment newInstance(@NonNull GpodnetTag tag) {
- TagFragment fragment = new TagFragment();
- Bundle args = new Bundle();
- args.putParcelable("tag", tag);
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Bundle args = getArguments();
- if (args == null || args.getParcelable("tag") == null) {
- throw new IllegalArgumentException("Arguments not given");
- }
- tag = args.getParcelable("tag");
- }
-
- @Override
- protected List<GpodnetPodcast> loadPodcastData(GpodnetService service) throws GpodnetServiceException {
- return service.getPodcastsForTag(tag, PODCAST_COUNT);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java
deleted file mode 100644
index abdfab941..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package de.danoeh.antennapod.fragment.gpodnet;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-import androidx.annotation.NonNull;
-import androidx.fragment.app.ListFragment;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.adapter.gpodnet.TagListAdapter;
-import de.danoeh.antennapod.core.sync.SynchronizationCredentials;
-import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetTag;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-public class TagListFragment extends ListFragment {
- private static final int COUNT = 50;
- private static final String TAG = "TagListFragment";
- private Disposable disposable;
-
- @Override
- public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- getListView().setOnItemClickListener((parent, view1, position, id) -> {
- GpodnetTag tag = (GpodnetTag) getListAdapter().getItem(position);
- ((MainActivity) getActivity()).loadChildFragment(TagFragment.newInstance(tag));
- });
-
- startLoadTask();
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
-
- if (disposable != null) {
- disposable.dispose();
- }
- }
-
- private void startLoadTask() {
- if (disposable != null) {
- disposable.dispose();
- }
- setListShown(false);
- disposable = Observable.fromCallable(
- () -> {
- GpodnetService service = new GpodnetService(AntennapodHttpClient.getHttpClient(),
- SynchronizationCredentials.getHosturl(), SynchronizationCredentials.getDeviceID(),
- SynchronizationCredentials.getUsername(), SynchronizationCredentials.getPassword());
- return service.getTopTags(COUNT);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- tags -> {
- setListAdapter(new TagListAdapter(getContext(), android.R.layout.simple_list_item_1, tags));
- setListShown(true);
- }, error -> {
- TextView txtvError = new TextView(getActivity());
- txtvError.setText(error.getMessage());
- getListView().setEmptyView(txtvError);
- setListShown(true);
- Log.e(TAG, Log.getStackTraceString(error));
- });
- }
-}
-
diff --git a/app/src/main/res/layout/addfeed.xml b/app/src/main/res/layout/addfeed.xml
index a6e0fc9ea..8e2fb99fa 100644
--- a/app/src/main/res/layout/addfeed.xml
+++ b/app/src/main/res/layout/addfeed.xml
@@ -1,153 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?attr/actionBarSize"
- android:theme="?attr/actionBarTheme"
- app:title="@string/add_feed_label"
- app:navigationIcon="?homeAsUpIndicator"
- android:id="@+id/toolbar"/>
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?attr/actionBarSize"
+ android:theme="?attr/actionBarTheme"
+ app:title="@string/add_feed_label"
+ app:navigationIcon="?homeAsUpIndicator" />
<androidx.cardview.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:cardCornerRadius="4dp"
- app:cardElevation="4dp"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ app:cardCornerRadius="4dp"
+ app:cardElevation="4dp">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
<ImageView
- android:layout_width="40dp"
- android:layout_height="match_parent"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:contentDescription="@string/search_podcast_hint"
- app:srcCompat="@drawable/ic_search"
- android:id="@+id/searchButton"
- android:scaleType="center"/>
+ android:id="@+id/searchButton"
+ android:layout_width="40dp"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:contentDescription="@string/search_podcast_hint"
+ android:scaleType="center"
+ app:srcCompat="@drawable/ic_search" />
<EditText
- android:id="@+id/combinedFeedSearchEditText"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="text"
- android:imeOptions="actionSearch"
- android:importantForAutofill="no"
- android:layout_marginStart="0dp"
- android:layout_marginLeft="0dp"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:hint="@string/search_podcast_hint"
- android:background="@null"/>
+ android:id="@+id/combinedFeedSearchEditText"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="text"
+ android:imeOptions="actionSearch"
+ android:importantForAutofill="no"
+ android:layout_marginStart="0dp"
+ android:layout_marginLeft="0dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:hint="@string/search_podcast_hint"
+ android:background="@null" />
</LinearLayout>
+
</androidx.cardview.widget.CardView>
<ScrollView
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:scrollbars="vertical">
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:scrollbars="vertical">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:focusableInTouchMode="true"
- android:padding="16dp">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusableInTouchMode="true"
+ android:padding="16dp">
<androidx.fragment.app.FragmentContainerView
- android:id="@+id/quickFeedDiscovery"
- android:name="de.danoeh.antennapod.fragment.QuickFeedDiscoveryFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
+ android:id="@+id/quickFeedDiscovery"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:name="de.danoeh.antennapod.fragment.QuickFeedDiscoveryFragment" />
<TextView
- android:layout_width="match_parent"
- 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"/>
+ android:layout_width="match_parent"
+ 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" />
<TextView
- android:id="@+id/addViaUrlButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_feed"
- app:drawableLeftCompat="@drawable/ic_feed"
- style="@style/AddPodcastTextView"
- android:text="@string/add_podcast_by_url"/>
+ android:id="@+id/addViaUrlButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/add_podcast_by_url"
+ app:drawableStartCompat="@drawable/ic_feed"
+ app:drawableLeftCompat="@drawable/ic_feed"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/addLocalFolderButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_folder"
- app:drawableLeftCompat="@drawable/ic_folder"
- style="@style/AddPodcastTextView"
- android:text="@string/add_local_folder"/>
+ android:id="@+id/addLocalFolderButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/add_local_folder"
+ app:drawableStartCompat="@drawable/ic_folder"
+ app:drawableLeftCompat="@drawable/ic_folder"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/searchItunesButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_search"
- app:drawableLeftCompat="@drawable/ic_search"
- style="@style/AddPodcastTextView"
- android:text="@string/search_itunes_label"/>
+ android:id="@+id/searchItunesButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/search_itunes_label"
+ app:drawableStartCompat="@drawable/ic_search"
+ app:drawableLeftCompat="@drawable/ic_search"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/searchFyydButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_search"
- app:drawableLeftCompat="@drawable/ic_search"
- style="@style/AddPodcastTextView"
- android:text="@string/search_fyyd_label"/>
+ android:id="@+id/searchFyydButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/search_fyyd_label"
+ app:drawableStartCompat="@drawable/ic_search"
+ app:drawableLeftCompat="@drawable/ic_search"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/searchGPodderButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_search"
- app:drawableLeftCompat="@drawable/ic_search"
- style="@style/AddPodcastTextView"
- android:text="@string/browse_gpoddernet_label"/>
+ android:id="@+id/searchGPodderButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/gpodnet_search_hint"
+ app:drawableStartCompat="@drawable/ic_search"
+ app:drawableLeftCompat="@drawable/ic_search"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/searchPodcastIndexButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_search"
- app:drawableLeftCompat="@drawable/ic_search"
- style="@style/AddPodcastTextView"
- android:text="@string/search_podcastindex_label"/>
+ android:id="@+id/searchPodcastIndexButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/search_podcastindex_label"
+ app:drawableStartCompat="@drawable/ic_search"
+ app:drawableLeftCompat="@drawable/ic_search"
+ style="@style/AddPodcastTextView" />
<TextView
- android:id="@+id/opmlImportButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:drawableStartCompat="@drawable/ic_download"
- app:drawableLeftCompat="@drawable/ic_download"
- style="@style/AddPodcastTextView"
- android:text="@string/opml_add_podcast_label"/>
+ android:id="@+id/opmlImportButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/opml_add_podcast_label"
+ app:drawableStartCompat="@drawable/ic_download"
+ app:drawableLeftCompat="@drawable/ic_download"
+ style="@style/AddPodcastTextView" />
+
</LinearLayout>
+
</ScrollView>
+
</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_itunes_search.xml b/app/src/main/res/layout/fragment_itunes_search.xml
index 6e00bdf0d..b20016f68 100644
--- a/app/src/main/res/layout/fragment_itunes_search.xml
+++ b/app/src/main/res/layout/fragment_itunes_search.xml
@@ -1,23 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto">
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout
+ android:id="@+id/browsing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:id="@+id/browsing"
android:layout_alignParentTop="true">
+
<androidx.appcompat.widget.Toolbar
+ android:id="@+id/toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:navigationIcon="?homeAsUpIndicator"
- app:title="@string/discover"
- android:id="@+id/toolbar"/>
+ app:title="@string/discover" />
<android.widget.Spinner
android:id="@+id/spinner_country"
@@ -29,13 +32,14 @@
android:minHeight="?attr/actionBarSize"
android:spinnerMode="dropdown"
android:textAlignment="textEnd" />
+
</LinearLayout>
<GridView
- android:layout_below="@id/browsing"
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_below="@id/browsing"
android:clipToPadding="false"
android:columnWidth="400dp"
android:gravity="center"
@@ -45,7 +49,7 @@
android:paddingTop="@dimen/list_vertical_padding"
android:stretchMode="columnWidth"
android:verticalSpacing="8dp"
- tools:listitem="@layout/gpodnet_podcast_listitem" />
+ tools:listitem="@layout/itunes_podcast_listitem" />
<TextView
android:id="@android:id/empty"
@@ -62,7 +66,7 @@
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateOnly="true"
- android:visibility="gone"/>
+ android:visibility="gone" />
<TextView
android:id="@+id/txtvError"
@@ -101,5 +105,6 @@
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
- android:textAlignment="textEnd"/>
+ android:textAlignment="textEnd" />
+
</RelativeLayout>
diff --git a/app/src/main/res/layout/gpodnet_podcast_list.xml b/app/src/main/res/layout/gpodnet_podcast_list.xml
deleted file mode 100644
index a6918f8d4..000000000
--- a/app/src/main/res/layout/gpodnet_podcast_list.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <GridView
- android:id="@+id/gridView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipToPadding="false"
- android:columnWidth="400dp"
- android:gravity="center"
- android:horizontalSpacing="8dp"
- android:numColumns="auto_fit"
- android:paddingBottom="@dimen/list_vertical_padding"
- android:paddingTop="@dimen/list_vertical_padding"
- android:stretchMode="columnWidth"
- android:verticalSpacing="8dp"
- android:layout_alignParentTop="true"
- tools:listitem="@layout/gpodnet_podcast_listitem" />
-
- <ProgressBar
- android:id="@+id/progressBar"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:indeterminateOnly="true" />
-
- <TextView
- android:id="@+id/txtvError"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:layout_margin="16dp"
- android:textAlignment="center"
- android:textSize="@dimen/text_size_small"
- android:visibility="gone"
- tools:visibility="visible"
- tools:text="Error message"
- tools:background="@android:color/holo_red_light" />
-
- <Button
- android:id="@+id/butRetry"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/txtvError"
- android:layout_centerHorizontal="true"
- android:layout_margin="16dp"
- android:text="@string/retry_label"
- android:visibility="gone"
- tools:visibility="visible"
- tools:background="@android:color/holo_red_light" />
-</RelativeLayout>
diff --git a/app/src/main/res/layout/gpodnet_podcast_listitem.xml b/app/src/main/res/layout/gpodnet_podcast_listitem.xml
deleted file mode 100644
index 56d351d62..000000000
--- a/app/src/main/res/layout/gpodnet_podcast_listitem.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent" android:layout_height="wrap_content"
- android:paddingTop="8dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:paddingBottom="8dp"
- tools:background="@android:color/darker_gray">
-
- <ImageView
- android:id="@+id/imgvCover"
- android:layout_width="@dimen/thumbnail_length_itemlist"
- android:layout_height="@dimen/thumbnail_length_itemlist"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:layout_marginRight="16dp"
- android:layout_marginEnd="16dp"
- android:adjustViewBounds="true"
- android:importantForAccessibility="no"
- android:cropToPadding="true"
- android:scaleType="fitXY"
- tools:src="@tools:sample/avatars"
- tools:background="@android:color/holo_green_dark"/>
-
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_toRightOf="@id/imgvCover"
- android:layout_toEndOf="@id/imgvCover"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/txtvTitle"
- style="@style/AntennaPod.TextView.ListItemPrimaryTitle2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxLines="2"
- android:includeFontPadding="false"
- tools:text="Title"
- tools:background="@android:color/holo_green_dark"/>
-
- <TextView
- android:id="@+id/txtvAuthor"
- style="android:style/TextAppearance.Small"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="middle"
- android:maxLines="2"
- tools:text="author"
- tools:background="@android:color/holo_green_dark"/>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical">
- <ImageView
- android:layout_width="14sp"
- android:layout_height="14sp"
- app:srcCompat="@drawable/ic_feed"/>
- <TextView
- android:id="@+id/txtvSubscribers"
- style="@style/AntennaPod.TextView.ListItemSecondaryTitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:lines="1"
- tools:text="150"
- tools:background="@android:color/holo_green_dark"/>
- </LinearLayout>
-
- </LinearLayout>
-</RelativeLayout>
diff --git a/app/src/main/res/layout/gpodnet_tag_listitem.xml b/app/src/main/res/layout/gpodnet_tag_listitem.xml
deleted file mode 100644
index a377f9ba1..000000000
--- a/app/src/main/res/layout/gpodnet_tag_listitem.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- tools:background="@android:color/darker_gray">
-
- <TextView
- android:id="@+id/txtvTitle"
- style="@style/AntennaPod.TextView.ListItemPrimaryTitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
- android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
- android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
- android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
- android:lines="1"
- tools:text="Tag Title"
- tools:background="@android:color/holo_green_dark" />
-
- <TextView
- android:id="@+id/txtvUsage"
- style="@style/AntennaPod.TextView.ListItemSecondaryTitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"
- android:layout_marginRight="@dimen/listitem_threeline_horizontalpadding"
- android:layout_marginEnd="@dimen/listitem_threeline_horizontalpadding"
- android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
- android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
- tools:text="301"
- tools:background="@android:color/holo_green_dark"/>
-
-</RelativeLayout>