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

Add context menu for extension browsing

parent d5514c7a
No related branches found
No related tags found
No related merge requests found
......@@ -3,14 +3,11 @@
<data>
<import type="android.view.View"/>
<variable
name="handler"
type="org.videolan.vlc.gui.browser.ExtensionAdapter.ClickHandler"/>
name="holder"
type="org.videolan.vlc.gui.browser.ExtensionAdapter.ViewHolder"/>
<variable
name="item"
type="org.videolan.vlc.plugin.api.VLCExtensionItem"/>
<variable
name="position"
type="int"/>
<variable
name="image"
type="android.graphics.drawable.BitmapDrawable"/>
......@@ -19,25 +16,24 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_margin="5dp">
android:layout_margin="5dp"
android:clickable="true"
android:onClick="@{holder.onClick}" >
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_alignParentLeft="true"
android:layout_marginRight="5dp"
android:src="@{image}"
android:clickable="true"
android:tag="@{position}"
android:onClick="@{handler.onClick}" />
android:src="@{image}"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/image"
android:layout_toLeftOf="@+id/item_more"
android:layout_above="@+id/author"
android:layout_marginBottom="1dp"
android:gravity="bottom"
......@@ -47,28 +43,29 @@
android:textSize="16sp"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:clickable="true"
android:tag="@{position}"
android:onClick="@{handler.onClick}" />
android:singleLine="true" />
<TextView
android:id="@+id/author"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/image"
android:layout_toLeftOf="@+id/item_more"
android:layout_marginTop="1dp"
android:gravity="top"
android:text="@{item.subTitle}"
android:fontFamily="sans-serif-light"
android:textColor="?attr/list_subtitle"
android:ellipsize="marquee"
android:maxLines="1"
android:clickable="true"
android:tag="@{position}"
android:onClick="@{handler.onClick}" />
android:maxLines="1" />
<ImageView
android:id="@+id/item_more"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:src="@drawable/ic_more"
android:visibility="@{item.type != 0 ? View.VISIBLE : View.GONE}"/>
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/extension_item_view_play_all"
android:title="@string/play_all" />
<item
android:id="@+id/extension_item_view_append"
android:title="@string/append" />
<item
android:id="@+id/extension_item_view_play_audio"
android:title="@string/play_as_audio" />
<item
android:id="@+id/extension_item_download"
android:title="@string/download_on_device" />
</menu>
\ No newline at end of file
......@@ -546,6 +546,7 @@
</string-array>
<string name="chroma_format_default" translatable="false">RV32</string>
<string name="plugins">Plugins</string>
<string name="download_on_device">Download</string>
<string-array name="chroma_formats" translatable="false">
<item>RGB 32-bit</item>
......
......@@ -23,12 +23,40 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
ExtensionBrowser mFragment;
ArrayList<VLCExtensionItem> mItemsList = new ArrayList<>();
static class ViewHolder extends RecyclerView.ViewHolder {
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
ExtensionItemViewBinding binding;
public ViewHolder(View itemView) {
super(itemView);
binding = DataBindingUtil.bind(itemView);
itemView.setOnLongClickListener(this);
binding.setHolder(this);
}
public void onClick(View v){
final VLCExtensionItem item = getItem(getLayoutPosition());
if (item.type == VLCExtensionItem.TYPE_DIRECTORY) {
mFragment.browseItem(item);
} else if (item.type == VLCExtensionItem.TYPE_AUDIO || item.type == VLCExtensionItem.TYPE_VIDEO){
MediaUtils.openUri(v.getContext(), Uri.parse(item.link)); //TODO fix path in playbackservice !
}
}
public void onMoreClick(View v){
openContextMenu();
}
@Override
public boolean onLongClick(View v) {
return openContextMenu();
}
private boolean openContextMenu() {
if (mFragment == null)
return false;
mFragment.openContextMenu(getLayoutPosition());
return true;
}
}
......@@ -48,9 +76,7 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
public void onBindViewHolder(ViewHolder holder, int position) {
final ViewHolder vh = holder;
final VLCExtensionItem item = getItem(position);
vh.binding.setHandler(mClickHandler);
vh.binding.setItem(item);
vh.binding.setPosition(position);
vh.binding.executePendingBindings();
Resources res = holder.itemView.getContext().getResources();
vh.binding.setImage(new BitmapDrawable(res, BitmapFactory.decodeResource(res, getIconResId(item))));
......@@ -63,7 +89,7 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
}
private int getIconResId(VLCExtensionItem item) {
switch (item.iconType){
switch (item.type){
case VLCExtensionItem.TYPE_AUDIO:
return R.drawable.ic_browser_audio_normal;
case VLCExtensionItem.TYPE_DIRECTORY:
......@@ -77,10 +103,14 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
}
}
private VLCExtensionItem getItem(int position) {
public VLCExtensionItem getItem(int position) {
return mItemsList.get(position);
}
public ArrayList<VLCExtensionItem> getAll() {
return mItemsList;
}
@Override
public int getItemCount() {
return mItemsList.size();
......@@ -96,18 +126,8 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
mItemsList.clear();
}
protected void openMediaFromView(View v) {
final int position = ((Integer)v.getTag()).intValue();
final VLCExtensionItem item = getItem(position);
if (item.iconType == VLCExtensionItem.TYPE_DIRECTORY) {
mFragment.browseItem(item);
} else if (item.iconType == VLCExtensionItem.TYPE_AUDIO || item.iconType == VLCExtensionItem.TYPE_VIDEO){
MediaUtils.openUri(v.getContext(), Uri.parse(item.link)); //TODO fix path in playbackservice !
}
}
private int getTypeAccordingToItem(int iconType) {
switch (iconType) {
private int getTypeAccordingToItem(int type) {
switch (type) {
case VLCExtensionItem.TYPE_DIRECTORY:
return MediaWrapper.TYPE_DIR;
case VLCExtensionItem.TYPE_VIDEO:
......@@ -122,15 +142,4 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
return MediaWrapper.TYPE_ALL;
}
}
public ClickHandler mClickHandler = new ClickHandler();
public class ClickHandler {
public void onClick(View v){
openMediaFromView(v);
}
public void onCheckBoxClick(View v){}
public void onMoreClick(View v){}
}
}
......@@ -6,7 +6,9 @@ import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
......@@ -16,7 +18,10 @@ import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.gui.view.ContextMenuRecyclerView;
import org.videolan.vlc.gui.view.DividerItemDecoration;
import org.videolan.vlc.gui.view.SwipeRefreshLayout;
import org.videolan.vlc.media.MediaUtils;
import org.videolan.vlc.media.MediaWrapper;
import org.videolan.vlc.plugin.PluginService;
import org.videolan.vlc.plugin.Utils;
import org.videolan.vlc.plugin.api.VLCExtensionItem;
import java.util.ArrayList;
......@@ -28,7 +33,6 @@ public class ExtensionBrowser extends Fragment implements View.OnClickListener,
public static final String KEY_TITLE = "key_title";
private String mTitle;
private ArrayList<VLCExtensionItem> mediaList;
FloatingActionButton mAddDirectoryFAB;
ExtensionAdapter mAdapter;
protected ContextMenuRecyclerView mRecyclerView;
......@@ -55,8 +59,7 @@ public class ExtensionBrowser extends Fragment implements View.OnClickListener,
if (bundle != null){
mTitle = bundle.getString(KEY_TITLE);
showSettings = bundle.getBoolean(KEY_SHOW_FAB);
mediaList = bundle.getParcelableArrayList(KEY_ITEMS_LIST);
mAdapter.addAll(mediaList);
mAdapter.addAll(bundle.<VLCExtensionItem>getParcelableArrayList(KEY_ITEMS_LIST));
}
}
......@@ -133,4 +136,56 @@ public class ExtensionBrowser extends Fragment implements View.OnClickListener,
mSwipeRefreshLayout.setEnabled(topRowVerticalPosition >= 0);
}
};
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (menuInfo == null)
return;
ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView
.RecyclerContextMenuInfo) menuInfo;
VLCExtensionItem item = mAdapter.getItem(info.position);
if (item.type == VLCExtensionItem.TYPE_DIRECTORY)
return;
boolean isVideo = item.type == VLCExtensionItem.TYPE_VIDEO;
getActivity().getMenuInflater().inflate(R.menu.extension_context_menu, menu);
menu.findItem(R.id.extension_item_view_play_audio).setVisible(isVideo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView
.RecyclerContextMenuInfo) item.getMenuInfo();
if (info != null && handleContextItemSelected(item, info.position))
return true;
return super.onContextItemSelected(item);
}
public void openContextMenu(final int position) {
mRecyclerView.openContextMenu(position);
}
protected boolean handleContextItemSelected(MenuItem item, final int position) {
switch (item.getItemId()) {
case R.id.extension_item_view_play_all:
ArrayList<VLCExtensionItem> items = mAdapter.getAll();
ArrayList<MediaWrapper> medias = new ArrayList<>(items.size());
for (VLCExtensionItem vlcItem : items) {
medias.add(Utils.mediawrapperFromExtension(vlcItem));
}
MediaUtils.openList(getActivity(), medias, position);
return true;
case R.id.extension_item_view_append:
MediaUtils.appendMedia(getActivity(), Utils.mediawrapperFromExtension(mAdapter.getItem(position)));
return true;
case R.id.extension_item_view_play_audio:
MediaWrapper mw = Utils.mediawrapperFromExtension(mAdapter.getItem(position));
mw.addFlags(MediaWrapper.MEDIA_FORCE_AUDIO);
MediaUtils.openMedia(getActivity(), mw);
return true;
case R.id.extension_item_download:
//TODO
default:return false;
}
}
}
package org.videolan.vlc.plugin;
import android.net.Uri;
import org.videolan.vlc.media.MediaWrapper;
import org.videolan.vlc.plugin.api.VLCExtensionItem;
public class Utils {
public static MediaWrapper mediawrapperFromExtension(VLCExtensionItem vlcItem) {
MediaWrapper media = new MediaWrapper(Uri.parse(vlcItem.link));
media.setTitle(vlcItem.title);
if (vlcItem.type != VLCExtensionItem.TYPE_OTHER_FILE)
media.setType(vlcItem.type);
return media;
}
}
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