From 0ae885255919d1aa202acecacc6380164b572eec Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Wed, 13 Nov 2019 20:16:57 +0100 Subject: Switched from gestures to ViewPager --- .../antennapod/fragment/ItemPagerFragment.java | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java new file mode 100644 index 000000000..5b91b4a9f --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -0,0 +1,88 @@ +package de.danoeh.antennapod.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; +import de.danoeh.antennapod.R; + +/** + * Displays information about a list of FeedItems. + */ +public class ItemPagerFragment extends Fragment { + private static final String ARG_FEEDITEMS = "feeditems"; + private static final String ARG_FEEDITEM_POS = "feeditem_pos"; + + /** + * Creates a new instance of an ItemPagerFragment. + * + * @param feeditem The ID of the FeedItem that should be displayed. + * @return The ItemFragment instance + */ + public static ItemPagerFragment newInstance(long feeditem) { + return newInstance(new long[] { feeditem }, 0); + } + + /** + * Creates a new instance of an ItemPagerFragment. + * + * @param feeditems The IDs of the FeedItems that belong to the same list + * @param feedItemPos The position of the FeedItem that is currently shown + * @return The ItemFragment instance + */ + public static ItemPagerFragment newInstance(long[] feeditems, int feedItemPos) { + ItemPagerFragment fragment = new ItemPagerFragment(); + Bundle args = new Bundle(); + args.putLongArray(ARG_FEEDITEMS, feeditems); + args.putInt(ARG_FEEDITEM_POS, feedItemPos); + fragment.setArguments(args); + return fragment; + } + + private long[] feedItems; + private int feedItemPos; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + feedItems = getArguments().getLongArray(ARG_FEEDITEMS); + feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + View layout = inflater.inflate(R.layout.feeditem_pager_fragment, container, false); + + ViewPager pager = layout.findViewById(R.id.pager); + pager.setAdapter(new ItemPagerAdapter()); + pager.setCurrentItem(feedItemPos); + + return layout; + } + + private class ItemPagerAdapter extends FragmentStatePagerAdapter { + + ItemPagerAdapter() { + super(getFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); + } + + @NonNull + @Override + public Fragment getItem(int position) { + return ItemFragment.newInstance(feedItems[position]); + } + + @Override + public int getCount() { + return feedItems.length; + } + } +} -- cgit v1.2.3 From 2b3b5567354549cc8c8ecbad43195c7cb5f0a613 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 15 Nov 2019 10:32:50 +0100 Subject: Moved actionbar menu to ItemPagerFragment ViewPager keeps multiple fragments in background and therefore, the menu was shown multiple times. --- .../antennapod/fragment/ItemPagerFragment.java | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java index 5b91b4a9f..e6cdc5e26 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -2,6 +2,9 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -10,6 +13,16 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.CastEnabledActivity; +import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.util.Flavors; +import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; /** * Displays information about a list of FeedItems. @@ -46,10 +59,13 @@ public class ItemPagerFragment extends Fragment { private long[] feedItems; private int feedItemPos; + private FeedItem item; + private Disposable disposable; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setHasOptionsMenu(true); feedItems = getArguments().getLongArray(ARG_FEEDITEMS); feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS); @@ -63,11 +79,92 @@ public class ItemPagerFragment extends Fragment { ViewPager pager = layout.findViewById(R.id.pager); pager.setAdapter(new ItemPagerAdapter()); + pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + loadItem(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); pager.setCurrentItem(feedItemPos); return layout; } + @Override + public void onDestroyView() { + super.onDestroyView(); + if (disposable != null) { + disposable.dispose(); + } + } + + private void loadItem(int position) { + if (disposable != null) { + disposable.dispose(); + } + + disposable = Observable.fromCallable(() -> DBReader.getFeedItem(position)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + item = result; + getActivity().invalidateOptionsMenu(); + }, Throwable::printStackTrace); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (!isAdded() || item == null) { + return; + } + super.onCreateOptionsMenu(menu, inflater); + if (Flavors.FLAVOR == Flavors.PLAY) { + ((CastEnabledActivity) getActivity()).requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); + } + inflater.inflate(R.menu.feeditem_options, menu); + + FeedItemMenuHandler.MenuInterface popupMenuInterface = (id, visible) -> { + MenuItem item = menu.findItem(id); + if (item != null) { + item.setVisible(visible); + } + }; + + if (item.hasMedia()) { + FeedItemMenuHandler.onPrepareMenu(popupMenuInterface, item); + } else { + // these are already available via button1 and button2 + FeedItemMenuHandler.onPrepareMenu(popupMenuInterface, item, + R.id.mark_read_item, R.id.visit_website_item); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + switch (menuItem.getItemId()) { + case R.id.open_podcast: + openPodcast(); + return true; + default: + return FeedItemMenuHandler.onMenuItemClicked(this, menuItem.getItemId(), item); + } + } + + private void openPodcast() { + Fragment fragment = FeedItemlistFragment.newInstance(item.getFeedId()); + ((MainActivity) getActivity()).loadChildFragment(fragment); + } + private class ItemPagerAdapter extends FragmentStatePagerAdapter { ItemPagerAdapter() { -- cgit v1.2.3 From adcce2b94fce20fa1ad32cd63ce40786ad5f90b1 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 15 Nov 2019 16:46:26 +0100 Subject: Fixed displaying wrong menu --- .../java/de/danoeh/antennapod/fragment/ItemPagerFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java index e6cdc5e26..98cb93e7a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -79,6 +79,8 @@ public class ItemPagerFragment extends Fragment { ViewPager pager = layout.findViewById(R.id.pager); pager.setAdapter(new ItemPagerAdapter()); + pager.setCurrentItem(feedItemPos); + loadItem(feedItems[feedItemPos]); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { @@ -87,7 +89,7 @@ public class ItemPagerFragment extends Fragment { @Override public void onPageSelected(int position) { - loadItem(position); + loadItem(feedItems[position]); } @Override @@ -95,7 +97,6 @@ public class ItemPagerFragment extends Fragment { } }); - pager.setCurrentItem(feedItemPos); return layout; } @@ -108,12 +109,12 @@ public class ItemPagerFragment extends Fragment { } } - private void loadItem(int position) { + private void loadItem(long itemId) { if (disposable != null) { disposable.dispose(); } - disposable = Observable.fromCallable(() -> DBReader.getFeedItem(position)) + disposable = Observable.fromCallable(() -> DBReader.getFeedItem(itemId)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { -- cgit v1.2.3 From c9e67ce506dd9c68749e255f2ae9dbf9c6c9ac41 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 15 Nov 2019 17:08:00 +0100 Subject: Fixed empty adapter in some cases --- .../main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java index 98cb93e7a..74530e424 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -9,6 +9,7 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; @@ -78,6 +79,12 @@ public class ItemPagerFragment extends Fragment { View layout = inflater.inflate(R.layout.feeditem_pager_fragment, container, false); ViewPager pager = layout.findViewById(R.id.pager); + // FragmentStatePagerAdapter documentation: + // > When using FragmentStatePagerAdapter the host ViewPager must have a valid ID set. + // When opening multiple ItemPagerFragments by clicking "item" -> "visit podcast" -> "item" -> etc, + // the ID is no longer unique and FragmentStatePagerAdapter does not display any pages. + int newId = ViewCompat.generateViewId(); + pager.setId(newId); pager.setAdapter(new ItemPagerAdapter()); pager.setCurrentItem(feedItemPos); loadItem(feedItems[feedItemPos]); -- cgit v1.2.3