summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java168
1 files changed, 92 insertions, 76 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
index 9fcdc6f02..b720f1167 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -7,41 +7,44 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.widget.ProgressBar;
-import androidx.annotation.NonNull;
-import androidx.annotation.StringRes;
-import androidx.appcompat.widget.Toolbar;
-import androidx.fragment.app.Fragment;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
import android.util.Log;
-import android.view.ContextMenu;
import android.view.LayoutInflater;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.GridView;
+import android.widget.ProgressBar;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.joanzapata.iconify.Iconify;
+import com.leinardi.android.speeddial.SpeedDialView;
+
+import de.danoeh.antennapod.dialog.TagSettingsDialog;
+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 java.util.concurrent.Callable;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.adapter.SubscriptionsAdapter;
+import de.danoeh.antennapod.adapter.SubscriptionsRecyclerAdapter;
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
import de.danoeh.antennapod.core.event.DownloadEvent;
import de.danoeh.antennapod.core.event.FeedListUpdateEvent;
import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent;
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
-import de.danoeh.antennapod.dialog.TagSettingsDialog;
-import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadService;
import de.danoeh.antennapod.core.storage.DBReader;
@@ -49,24 +52,24 @@ import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.DownloadRequester;
import de.danoeh.antennapod.core.storage.NavDrawerData;
import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
-import de.danoeh.antennapod.dialog.RemoveFeedDialog;
-import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
import de.danoeh.antennapod.dialog.FeedSortDialog;
+import de.danoeh.antennapod.dialog.RemoveFeedDialog;
import de.danoeh.antennapod.dialog.RenameFeedDialog;
+import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
+import de.danoeh.antennapod.fragment.actions.FeedMultiSelectActionHandler;
+import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.view.EmptyViewHandler;
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;
/**
* Fragment for displaying feed subscriptions
*/
-public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
-
+public class SubscriptionFragment extends Fragment
+ implements Toolbar.OnMenuItemClickListener,
+ SubscriptionsRecyclerAdapter.OnSelectModeListener {
public static final String TAG = "SubscriptionFragment";
private static final String PREFS = "SubscriptionFragment";
private static final String PREF_NUM_COLUMNS = "columns";
@@ -80,23 +83,24 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
R.id.subscription_num_columns_4,
R.id.subscription_num_columns_5};
- private GridView subscriptionGridLayout;
- private List<NavDrawerData.DrawerItem> listItems;
- private SubscriptionsAdapter subscriptionAdapter;
+ private RecyclerView subscriptionRecycler;
+ private SubscriptionsRecyclerAdapter subscriptionAdapter;
private FloatingActionButton subscriptionAddButton;
private ProgressBar progressBar;
private EmptyViewHandler emptyView;
private TextView feedsFilteredMsg;
private Toolbar toolbar;
private String displayedFolder = null;
-
- private Feed selectedFeed = null;
private boolean isUpdatingFeeds = false;
private boolean displayUpArrow;
private Disposable disposable;
private SharedPreferences prefs;
+ private SpeedDialView speedDialView;
+
+ private List<NavDrawerData.DrawerItem> listItems;
+
public static SubscriptionFragment newInstance(String folderTitle) {
SubscriptionFragment fragment = new SubscriptionFragment();
Bundle args = new Bundle();
@@ -139,9 +143,15 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
}
}
- subscriptionGridLayout = root.findViewById(R.id.subscriptions_grid);
- subscriptionGridLayout.setNumColumns(prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns()));
- registerForContextMenu(subscriptionGridLayout);
+ subscriptionRecycler = root.findViewById(R.id.subscriptions_grid);
+ GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),
+ prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns()),
+ RecyclerView.VERTICAL,
+ false);
+ subscriptionRecycler.setLayoutManager(gridLayoutManager);
+ subscriptionRecycler.addItemDecoration(new SubscriptionsRecyclerAdapter.GridDividerItemDecorator());
+ gridLayoutManager.setSpanCount(prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns()));
+ registerForContextMenu(subscriptionRecycler);
subscriptionAddButton = root.findViewById(R.id.subscriptions_add);
progressBar = root.findViewById(R.id.progLoading);
@@ -155,6 +165,25 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false),
getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms));
});
+
+ speedDialView = root.findViewById(R.id.fabSD);
+ speedDialView.inflate(R.menu.nav_feed_action_speeddial);
+ speedDialView.setOnChangeListener(new SpeedDialView.OnChangeListener() {
+ @Override
+ public boolean onMainActionSelected() {
+ return false;
+ }
+
+ @Override
+ public void onToggleChanged(boolean isOpen) {
+ }
+ });
+ speedDialView.setOnActionSelectedListener(actionItem -> {
+ new FeedMultiSelectActionHandler((MainActivity) getActivity(), subscriptionAdapter.getSelectedItems())
+ .handleAction(actionItem.getId());
+ return true;
+ });
+
return root;
}
@@ -204,7 +233,9 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
}
private void setColumnNumber(int columns) {
- subscriptionGridLayout.setNumColumns(columns);
+ GridLayoutManager gridLayoutManager = (GridLayoutManager) subscriptionRecycler.getLayoutManager();
+ gridLayoutManager.setSpanCount(columns);
+ subscriptionAdapter.notifyDataSetChanged();
prefs.edit().putInt(PREF_NUM_COLUMNS, columns).apply();
refreshToolbarState();
}
@@ -214,18 +245,16 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
emptyView.setIcon(R.drawable.ic_folder);
emptyView.setTitle(R.string.no_subscriptions_head_label);
emptyView.setMessage(R.string.no_subscriptions_label);
- emptyView.attachToListView(subscriptionGridLayout);
+ emptyView.attachToRecyclerView(subscriptionRecycler);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
-
- subscriptionAdapter = new SubscriptionsAdapter((MainActivity) getActivity(), itemAccess);
- subscriptionGridLayout.setAdapter(subscriptionAdapter);
- subscriptionGridLayout.setOnItemClickListener(subscriptionAdapter);
+ subscriptionAdapter = new SubscriptionsRecyclerAdapter((MainActivity) getActivity());
+ subscriptionAdapter.setOnSelectModeListener(this);
+ subscriptionRecycler.setAdapter(subscriptionAdapter);
setupEmptyView();
-
subscriptionAddButton.setOnClickListener(view -> {
if (getActivity() instanceof MainActivity) {
((MainActivity) getActivity()).loadChildFragment(new AddFeedFragment());
@@ -247,6 +276,10 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
if (disposable != null) {
disposable.dispose();
}
+
+ if (subscriptionAdapter != null) {
+ subscriptionAdapter.endSelectMode();
+ }
}
private void loadSubscriptions() {
@@ -271,6 +304,7 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
.subscribe(
result -> {
listItems = result;
+ subscriptionAdapter.setItems(result);
subscriptionAdapter.notifyDataSetChanged();
emptyView.updateVisibility();
progressBar.setVisibility(View.GONE); // Keep hidden to avoid flickering while refreshing
@@ -293,33 +327,12 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
}
@Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
- if (menuInfo == null) {
- return;
- }
- AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo;
- int position = adapterInfo.position;
-
- NavDrawerData.DrawerItem selectedObject = (NavDrawerData.DrawerItem) subscriptionAdapter.getItem(position);
-
- if (selectedObject.type == NavDrawerData.DrawerItem.Type.FEED) {
- MenuInflater inflater = requireActivity().getMenuInflater();
- inflater.inflate(R.menu.nav_feed_context, menu);
- selectedFeed = ((NavDrawerData.FeedDrawerItem) selectedObject).feed;
- }
- menu.setHeaderTitle(selectedObject.getTitle());
- }
-
- @Override
public boolean onContextItemSelected(MenuItem item) {
- if (selectedFeed == null) {
+ Feed feed = subscriptionAdapter.getSelectedFeed();
+ if (feed == null) {
return false;
}
-
- Feed feed = selectedFeed;
- selectedFeed = null;
- final int itemId = item.getItemId();
+ int itemId = item.getItemId();
if (itemId == R.id.remove_all_new_flags_item) {
displayConfirmationDialog(
R.string.remove_all_new_flags_label,
@@ -335,6 +348,9 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
} else if (itemId == R.id.remove_item) {
RemoveFeedDialog.show(getContext(), feed, null);
return true;
+ } else if (itemId == R.id.multi_select) {
+ speedDialView.setVisibility(View.VISIBLE);
+ return subscriptionAdapter.onContextItemSelected(item);
}
return super.onContextItemSelected(item);
}
@@ -376,23 +392,23 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker =
() -> DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds();
- private final SubscriptionsAdapter.ItemAccess itemAccess = new SubscriptionsAdapter.ItemAccess() {
- @Override
- public int getCount() {
- if (listItems != null) {
- return listItems.size();
- } else {
- return 0;
- }
- }
+ @Override
+ public void onEndSelectMode() {
+ speedDialView.close();
+ speedDialView.setVisibility(View.GONE);
+ subscriptionAdapter.setItems(listItems);
+ subscriptionAdapter.notifyDataSetChanged();
+ }
- @Override
- public NavDrawerData.DrawerItem getItem(int position) {
- if (listItems != null && 0 <= position && position < listItems.size()) {
- return listItems.get(position);
- } else {
- return null;
+ @Override
+ public void onStartSelectMode() {
+ List<NavDrawerData.DrawerItem> feedsOnly = new ArrayList<>();
+ for (NavDrawerData.DrawerItem item : listItems) {
+ if (item.type == NavDrawerData.DrawerItem.Type.FEED) {
+ feedsOnly.add(item);
}
}
- };
+ subscriptionAdapter.setItems(feedsOnly);
+ subscriptionAdapter.notifyDataSetChanged();
+ }
}