Skip to content
Snippets Groups Projects
Commit 0db90ade authored by Geoffrey Métais's avatar Geoffrey Métais
Browse files

Implement EventsHandler in browsers fragments

parent 6ace7a42
No related branches found
No related tags found
No related merge requests found
......@@ -44,14 +44,13 @@ import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.databinding.BrowserItemSeparatorBinding;
import org.videolan.vlc.databinding.DirectoryViewItemBinding;
import org.videolan.vlc.gui.helpers.UiTools;
import org.videolan.vlc.media.MediaUtils;
import org.videolan.vlc.util.MediaItemFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import static org.videolan.medialibrary.media.MediaLibraryItem.FLAG_SELECTED;
import static org.videolan.medialibrary.media.MediaLibraryItem.TYPE_MEDIA;
public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.ViewHolder> implements Filterable {
......@@ -71,8 +70,6 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.
private int mTop = 0;
private int mMediaCount = 0;
private ItemFilter mFilter = new ItemFilter();
private boolean mActionMode;
private List<Integer> mSelectedItems = new LinkedList<>();
BaseBrowserAdapter(BaseBrowserFragment fragment){
this.fragment = fragment;
......@@ -109,10 +106,11 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.
public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
if (payloads.isEmpty())
onBindViewHolder(holder, position);
else {
else if (payloads.get(0) instanceof CharSequence){
((MediaViewHolder) holder).binding.text.setVisibility(View.VISIBLE);
((MediaViewHolder) holder).binding.text.setText((CharSequence) payloads.get(0));
}
} else if (payloads.get(0) instanceof MediaWrapper)
((MediaViewHolder)holder).setViewBackground(holder.itemView.hasFocus(), ((MediaWrapper)payloads.get(0)).hasStateFlags(FLAG_SELECTED));
}
private void onBindMediaViewHolder(final MediaViewHolder vh, int position) {
......@@ -123,7 +121,7 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.
vh.binding.setProtocol(getProtocol(media));
vh.binding.setCover(getIcon(media));
vh.setContextMenuListener();
vh.setViewBackground(vh.itemView.hasFocus(), mSelectedItems.contains(position));
vh.setViewBackground(vh.itemView.hasFocus(), media.hasStateFlags(FLAG_SELECTED));
}
@Override
......@@ -185,46 +183,16 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.
}
public void onClick(View v){
if (mActionMode) {
MediaWrapper mediaWrapper = (MediaWrapper) getItem(getLayoutPosition());
if (mediaWrapper.getType() == MediaWrapper.TYPE_AUDIO ||
mediaWrapper.getType() == MediaWrapper.TYPE_VIDEO ||
mediaWrapper.getType() == MediaWrapper.TYPE_DIR) {
setSelected();
fragment.invalidateActionMode();
}
} else
openMediaFromView(this, v);
fragment.onClick(v, getAdapterPosition(), binding.getItem());
}
public void onMoreClick(View v) {
fragment.openContextMenu(getLayoutPosition());
fragment.onCtxClick(v, getAdapterPosition(), binding.getItem());
}
@Override
public boolean onLongClick(View v) {
int position = getLayoutPosition();
MediaWrapper mediaWrapper = (MediaWrapper) getItem(position);
if (mediaWrapper.getType() == MediaWrapper.TYPE_AUDIO ||
mediaWrapper.getType() == MediaWrapper.TYPE_VIDEO ||
mediaWrapper.getType() == MediaWrapper.TYPE_DIR) {
if (mActionMode)
return false;
setSelected();
fragment.startActionMode();
} else
fragment.mRecyclerView.openContextMenu(position);
return true;
}
private void setSelected() {
Integer position = getLayoutPosition();
boolean selected = !mSelectedItems.contains(position);
if (selected)
mSelectedItems.add(position);
else
mSelectedItems.remove(position);
setViewBackground(itemView.hasFocus(), mSelectedItems.contains(position));
return fragment.onLongClick(v, getAdapterPosition(), binding.getItem());
}
private void setViewBackground(boolean focus, boolean selected) {
......@@ -367,38 +335,11 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<BaseBrowserAdapter.
protected void checkBoxAction(View v, String path){}
protected void openMediaFromView(MediaViewHolder holder, View v) {
final MediaWrapper mw = (MediaWrapper) getItem(holder.getAdapterPosition());
if (mw == null)
return;
mw.removeFlags(MediaWrapper.MEDIA_FORCE_AUDIO);
if (mw.getType() == MediaWrapper.TYPE_DIR)
fragment.browse(mw, holder.getAdapterPosition(), true);
else
MediaUtils.openMedia(v.getContext(), mw);
}
void setActionMode(boolean actionMode) {
mActionMode = actionMode;
if (!actionMode) {
LinkedList<Integer> positions = new LinkedList<>(mSelectedItems);
mSelectedItems.clear();
for (Integer position : positions)
notifyItemChanged(position);
}
}
List<Integer> getSelectedPositions() {
return mSelectedItems;
}
ArrayList<MediaWrapper> getSelection() {
ArrayList<MediaWrapper> selection = new ArrayList<>();
for (Integer selected : mSelectedItems) {
MediaWrapper media = (MediaWrapper) mMediaList.get(selected);
selection.add(media);
for (MediaLibraryItem item : mMediaList) {
if (item.hasStateFlags(FLAG_SELECTED))
selection.add((MediaWrapper) item);
}
return selection;
}
......
......@@ -35,6 +35,7 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.LayoutInflater;
......@@ -60,6 +61,7 @@ import org.videolan.vlc.gui.helpers.UiTools;
import org.videolan.vlc.gui.view.ContextMenuRecyclerView;
import org.videolan.vlc.gui.view.SwipeRefreshLayout;
import org.videolan.vlc.interfaces.Filterable;
import org.videolan.vlc.interfaces.IEventsHandler;
import org.videolan.vlc.interfaces.IRefreshable;
import org.videolan.vlc.media.MediaDatabase;
import org.videolan.vlc.media.MediaUtils;
......@@ -72,9 +74,10 @@ import org.videolan.vlc.util.WeakHandler;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public abstract class BaseBrowserFragment extends MediaBrowserFragment implements IRefreshable, MediaBrowser.EventListener, SwipeRefreshLayout.OnRefreshListener, View.OnClickListener, Filterable {
public abstract class BaseBrowserFragment extends MediaBrowserFragment implements IRefreshable, MediaBrowser.EventListener, SwipeRefreshLayout.OnRefreshListener, View.OnClickListener, Filterable, IEventsHandler {
protected static final String TAG = "VLC/BaseBrowserFragment";
public static String ROOT = "smb";
......@@ -686,18 +689,18 @@ public abstract class BaseBrowserFragment extends MediaBrowserFragment implement
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.action_mode_browser_file, menu);
mAdapter.setActionMode(true);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
if (mAdapter.getSelectedPositions().isEmpty()) {
List<MediaWrapper> selection = mAdapter.getSelection();
if (selection.isEmpty()) {
stopActionMode();
return false;
}
boolean single = this instanceof FileBrowserFragment && mAdapter.getSelectedPositions().size() == 1;
int type = single ? ((MediaWrapper) mAdapter.getItem(mAdapter.getSelectedPositions().get(0))).getType() : -1;
boolean single = this instanceof FileBrowserFragment && selection.size() == 1;
int type = single ? selection.get(0).getType() : -1;
menu.findItem(R.id.action_mode_file_info).setVisible(single && (type == MediaWrapper.TYPE_AUDIO || type == MediaWrapper.TYPE_VIDEO));
return true;
}
......@@ -729,6 +732,59 @@ public abstract class BaseBrowserFragment extends MediaBrowserFragment implement
@Override
public void onDestroyActionMode(ActionMode mode) {
mAdapter.setActionMode(false);
mActionMode = null;
int index = -1;
for (MediaLibraryItem media : mAdapter.getAll()) {
++index;
if (media.hasStateFlags(MediaLibraryItem.FLAG_SELECTED)) {
media.removeStateFlags(MediaLibraryItem.FLAG_SELECTED);
mAdapter.notifyItemChanged(index, media);
}
}
}
public void onClick(View v, int position, MediaLibraryItem item) {
MediaWrapper mediaWrapper = (MediaWrapper) item;
if (mActionMode != null) {
if (mediaWrapper.getType() == MediaWrapper.TYPE_AUDIO ||
mediaWrapper.getType() == MediaWrapper.TYPE_VIDEO ||
mediaWrapper.getType() == MediaWrapper.TYPE_DIR) {
item.toggleStateFlag(MediaLibraryItem.FLAG_SELECTED);
mAdapter.notifyItemChanged(position, item);
invalidateActionMode();
}
} else {
mediaWrapper.removeFlags(MediaWrapper.MEDIA_FORCE_AUDIO);
if (mediaWrapper.getType() == MediaWrapper.TYPE_DIR)
browse(mediaWrapper, position, true);
else
MediaUtils.openMedia(v.getContext(), mediaWrapper);
}
}
public boolean onLongClick(View v, int position, MediaLibraryItem item) {
if (mActionMode != null)
return false;
MediaWrapper mediaWrapper = (MediaWrapper) item;
if (mediaWrapper.getType() == MediaWrapper.TYPE_AUDIO ||
mediaWrapper.getType() == MediaWrapper.TYPE_VIDEO ||
mediaWrapper.getType() == MediaWrapper.TYPE_DIR) {
if (mActionMode != null)
return false;
item.setStateFlags(MediaLibraryItem.FLAG_SELECTED);
mAdapter.notifyItemChanged(position, item);
startActionMode();
} else
mRecyclerView.openContextMenu(position);
return true;
}
public void onCtxClick(View v, int position, MediaLibraryItem item) {
if (mActionMode == null)
mRecyclerView.openContextMenu(position);
}
public void onUpdateFinished(RecyclerView.Adapter adapter) {
updateEmptyView();
}
}
......@@ -23,6 +23,7 @@
package org.videolan.vlc.gui.browser;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
......@@ -34,10 +35,12 @@ import android.view.MenuInflater;
import android.view.View;
import org.videolan.libvlc.Media;
import org.videolan.medialibrary.media.MediaLibraryItem;
import org.videolan.medialibrary.media.MediaWrapper;
import org.videolan.medialibrary.media.Storage;
import org.videolan.vlc.R;
import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.databinding.DirectoryViewItemBinding;
import org.videolan.vlc.util.AndroidDevices;
import org.videolan.vlc.util.CustomDirectories;
......@@ -183,6 +186,13 @@ public class StorageBrowserFragment extends FileBrowserFragment {
super.setContextMenuItems(menu, position);
}
@Override
public void onClick(View v, int position, MediaLibraryItem item) {
MediaWrapper mw = new MediaWrapper(((Storage) item).getUri());
mw.setType(MediaWrapper.TYPE_DIR);
browse(mw, position, ((DirectoryViewItemBinding)DataBindingUtil.findBinding(v)).browserCheckbox.isChecked());
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.fab){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment