summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java76
-rw-r--r--app/src/main/res/layout/search_fragment.xml3
2 files changed, 74 insertions, 5 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 307ef0af1..30822e5c5 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -24,6 +24,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.chip.Chip;
+import com.google.android.material.snackbar.Snackbar;
+import com.leinardi.android.speeddial.SpeedDialView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
@@ -31,11 +33,13 @@ import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
import de.danoeh.antennapod.adapter.HorizontalFeedListAdapter;
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
+import de.danoeh.antennapod.databinding.MultiSelectSpeedDialBinding;
import de.danoeh.antennapod.event.EpisodeDownloadEvent;
import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
import de.danoeh.antennapod.event.PlayerStatusEvent;
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
+import de.danoeh.antennapod.fragment.actions.EpisodeMultiSelectActionHandler;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.storage.FeedSearcher;
@@ -63,7 +67,7 @@ import de.danoeh.antennapod.event.FeedListUpdateEvent;
/**
* Performs a search operation on all feeds or one specific feed and displays the search result.
*/
-public class SearchFragment extends Fragment {
+public class SearchFragment extends Fragment implements EpisodeItemListAdapter.OnSelectModeListener {
private static final String TAG = "SearchFragment";
private static final String ARG_QUERY = "query";
private static final String ARG_FEED = "feed";
@@ -81,6 +85,9 @@ public class SearchFragment extends Fragment {
private SearchView searchView;
private Handler automaticSearchDebouncer;
private long lastQueryChange = 0;
+ private MultiSelectSpeedDialBinding speedDialBinding;
+ private boolean isOtherViewInFoucus = false;
+
/**
* Create a new SearchFragment that searches all feeds.
@@ -133,8 +140,8 @@ public class SearchFragment extends Fragment {
@Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.search_fragment, container, false);
setupToolbar(layout.findViewById(R.id.toolbar));
+ speedDialBinding = MultiSelectSpeedDialBinding.bind(layout);
progressBar = layout.findViewById(R.id.progressBar);
-
recyclerView = layout.findViewById(R.id.recyclerView);
recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool());
registerForContextMenu(recyclerView);
@@ -142,9 +149,13 @@ public class SearchFragment extends Fragment {
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
+ if (!inActionMode()) {
+ menu.findItem(R.id.multi_select).setVisible(true);
+ }
MenuItemUtils.setOnClickListeners(menu, SearchFragment.this::onContextItemSelected);
}
};
+ adapter.setOnSelectModeListener(this);
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new LiftOnScrollListener(layout.findViewById(R.id.appbar)));
@@ -180,7 +191,7 @@ public class SearchFragment extends Fragment {
search();
}
searchView.setOnQueryTextFocusChangeListener((view, hasFocus) -> {
- if (hasFocus) {
+ if (hasFocus && !isOtherViewInFoucus) {
showInputMethod(view.findFocus());
}
});
@@ -195,6 +206,30 @@ public class SearchFragment extends Fragment {
}
}
});
+ speedDialBinding.fabSD.setOverlayLayout(speedDialBinding.fabSDOverlay);
+ speedDialBinding.fabSD.inflate(R.menu.episodes_apply_action_speeddial);
+ speedDialBinding.fabSD.setOnChangeListener(new SpeedDialView.OnChangeListener() {
+ @Override
+ public boolean onMainActionSelected() {
+ return false;
+ }
+
+ @Override
+ public void onToggleChanged(boolean open) {
+ if (open && adapter.getSelectedCount() == 0) {
+ ((MainActivity) getActivity())
+ .showSnackbarAbovePlayer(R.string.no_items_selected, Snackbar.LENGTH_SHORT);
+ speedDialBinding.fabSD.close();
+ }
+ }
+ });
+ speedDialBinding.fabSD.setOnActionSelectedListener(actionItem -> {
+ new EpisodeMultiSelectActionHandler((MainActivity) getActivity(), actionItem.getId())
+ .handleAction(adapter.getSelectedItems());
+ adapter.endSelectMode();
+ return true;
+ });
+
return layout;
}
@@ -260,8 +295,13 @@ public class SearchFragment extends Fragment {
return true;
}
FeedItem selectedItem = adapter.getLongPressedItem();
- if (selectedItem != null && FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem)) {
- return true;
+ if (selectedItem != null) {
+ if (adapter.onContextItemSelected(item)) {
+ return true;
+ }
+ if (FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem)) {
+ return true;
+ }
}
return super.onContextItemSelected(item);
}
@@ -393,4 +433,30 @@ public class SearchFragment extends Fragment {
((MainActivity) getActivity()).loadChildFragment(
OnlineSearchFragment.newInstance(CombinedSearcher.class, query));
}
+
+ @Override
+ public void onStartSelectMode() {
+ searchViewFocusOff();
+ speedDialBinding.fabSD.removeActionItemById(R.id.remove_from_inbox_batch);
+ speedDialBinding.fabSD.removeActionItemById(R.id.remove_from_queue_batch);
+ speedDialBinding.fabSD.removeActionItemById(R.id.delete_batch);
+ speedDialBinding.fabSD.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onEndSelectMode() {
+ speedDialBinding.fabSD.close();
+ speedDialBinding.fabSD.setVisibility(View.GONE);
+ searchViewFocusOn();
+ }
+
+ private void searchViewFocusOff() {
+ isOtherViewInFoucus = true;
+ searchView.clearFocus();
+ }
+
+ private void searchViewFocusOn() {
+ isOtherViewInFoucus = false;
+ searchView.requestFocus();
+ }
}
diff --git a/app/src/main/res/layout/search_fragment.xml b/app/src/main/res/layout/search_fragment.xml
index ff5de0f9f..17f679cc3 100644
--- a/app/src/main/res/layout/search_fragment.xml
+++ b/app/src/main/res/layout/search_fragment.xml
@@ -61,4 +61,7 @@
android:paddingTop="12dp"
android:paddingHorizontal="@dimen/additional_horizontal_spacing" />
+ <include
+ layout="@layout/multi_select_speed_dial" />
+
</RelativeLayout>