content: package de.danoeh.antennapod.ui.screen;
  
  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.annotation.Nullable;
  import androidx.core.util.Pair;
  
  import de.danoeh.antennapod.R;
  import de.danoeh.antennapod.storage.database.DBReader;
  import de.danoeh.antennapod.ui.AllEpisodesFilterDialog;
  import de.danoeh.antennapod.ui.screen.feed.ItemSortDialog;
  import de.danoeh.antennapod.event.FeedListUpdateEvent;
  import de.danoeh.antennapod.model.feed.FeedItem;
  import de.danoeh.antennapod.model.feed.FeedItemFilter;
  import de.danoeh.antennapod.model.feed.SortOrder;
  import de.danoeh.antennapod.storage.preferences.UserPreferences;
  import de.danoeh.antennapod.ui.episodeslist.EpisodesListFragment;
  import org.apache.commons.lang3.StringUtils;
  import org.greenrobot.eventbus.EventBus;
  import org.greenrobot.eventbus.Subscribe;
  
  import java.util.ArrayList;
  import java.util.HashSet;
  import java.util.List;
  
  /**
   * Shows all episodes (possibly filtered by user).
   */
  public class AllEpisodesFragment extends EpisodesListFragment {
      public static final String TAG = "EpisodesFragment";
      public static final String PREF_NAME = "PrefAllEpisodesFragment";
      private static Pair<Integer, Integer> scrollPosition = null;
  
      @NonNull
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          final View root = super.onCreateView(inflater, container, savedInstanceState);
          toolbar.inflateMenu(R.menu.episodes);
          toolbar.setTitle(R.string.episodes_label);
          updateToolbar();
          updateFilterUi();
          txtvInformation.setOnClickListener(
                  v -> AllEpisodesFilterDialog.newInstance(getFilter()).show(getChildFragmentManager(), null));
  
          boolean largePadding = displayUpArrow || !UserPreferences.isBottomNavigationEnabled();
          int paddingHorizontal = (int) (getResources().getDisplayMetrics().density * (largePadding ? 60 : 16));
          int paddingVertical = (int) (getResources().getDisplayMetrics().density * 4);
          txtvInformation.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
          return root;
      }
  
      @NonNull
      @Override
      protected List<FeedItem> loadData() {
          return DBReader.getEpisodes(0, page * EPISODES_PER_PAGE, getFilter(),
                  UserPreferences.getAllEpisodesSortOrder());
      }
  
      @NonNull
      @Override
      protected List<FeedItem> loadMoreData(int page) {
          return DBReader.getEpisodes((page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE, getFilter(),
                  UserPreferences.getAllEpisodesSortOrder());
      }
  
      @Override
      protected int loadTotalItemCount() {
          return DBReader.getTotalEpisodeCount(getFilter());
      }
  
      @Override
      protected FeedItemFilter getFilter() {
          FeedItemFilter filter = new FeedItemFilter(UserPreferences.getPrefFilterAllEpisodes());
          if (filter.showIsFavorite) {
              return new FeedItemFilter(filter, FeedItemFilter.INCLUDE_NOT_SUBSCRIBED);
          } else {
              return filter;
          }
      }
  
      @Override
      protected String getFragmentTag() {
          return TAG;
      }
  
      @Override
      public void onPause() {
          super.onPause();
          scrollPosition = recyclerView.getScrollPosition();
      }
  
      @Override
      protected void onItemsFirstLoaded() {
          recyclerView.restoreScrollPosition(scrollPosition);
      }
  
      @Override
      public boolean onMenuItemClick(MenuItem item) {
          if (super.onMenuItemClick(item)) {
              return true;
          }
          if (item.getItemId() == R.id.filter_items) {
              AllEpisodesFilterDialog.newInstance(getFilter()).show(getChildFragmentManager(), null);
              return true;
          } else if (item.getItemId() == R.id.action_favorites) {
              ArrayList<String> filter = new ArrayList<>(getFilter().getValuesList());
              if (filter.contains(FeedItemFilter.IS_FAVORITE)) {
                  filter.remove(FeedItemFilter.IS_FAVORITE);
                  filter.remove(FeedItemFilter.INCLUDE_NOT_SUBSCRIBED);
              } else {
                  filter.add(FeedItemFilter.IS_FAVORITE);
              }
              onFilterChanged(new AllEpisodesFilterDialog.AllEpisodesFilterChangedEvent(new HashSet<>(filter)));
              return true;
          } else if (item.getItemId() == R.id.episodes_sort) {
              new AllEpisodesSortDialog().show(getChildFragmentManager().beginTransaction(), "SortDialog");
              return true;
          }
          return false;
      }
  
      @Subscribe
      public void onFilterChanged(AllEpisodesFilterDialog.AllEpisodesFilterChangedEvent event) {
          UserPreferences.setPrefFilterAllEpisodes(StringUtils.join(event.filterValues, ","));
          updateFilterUi();
          page = 1;
          loadItems();
      }
  
      private void updateFilterUi() {
          swipeActions.setFilter(getFilter());
          if (getFilter().getValues().length == 0) {
              txtvInformation.setVisibility(View.GONE);
              emptyView.setMessage(R.string.no_all_episodes_label);
          } else if (listAdapter.inActionMode()) {
              txtvInformation.setVisibility(View.INVISIBLE);
          } else {
              txtvInformation.setVisibility(View.VISIBLE);
              emptyView.setMessage(R.string.no_all_episodes_filtered_label);
          }
          toolbar.getMenu().findItem(R.id.action_favorites).setIcon(
                  getFilter().showIsFavorite ? R.drawable.ic_star : R.drawable.ic_star_border);
      }
  
      @Override
      public void onStartSelectMode() {
          super.onStartSelectMode();
          updateFilterUi();
      }
  
      @Override
      public void onEndSelectMode() {
          super.onEndSelectMode();
          updateFilterUi();
      }
  
      public static class AllEpisodesSortDialog extends ItemSortDialog {
          @Override
          public void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              sortOrder = UserPreferences.getAllEpisodesSortOrder();
          }
  
          @Override
          protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) {
              if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG) {
                  super.onAddItem(title, ascending, descending, ascendingIsDefault);
              }
          }
  
          @Override
          protected void onSelectionChanged() {
              super.onSelectionChanged();
              UserPreferences.setAllEpisodesSortOrder(sortOrder);
              EventBus.getDefault().post(new FeedListUpdateEvent(0));
          }
      }
  }
  