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

Custom bindings to auto trigger images loading

parent 280fcc19
No related branches found
No related tags found
No related merge requests found
Showing
with 241 additions and 177 deletions
......@@ -41,12 +41,14 @@
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp" >
<!-- Image loading is handled by org.videolan.vlc.gui.helpers.AsyncImageLoader.loadPicture() -->
<ImageView
android:id="@+id/media_cover"
android:layout_width="@dimen/audio_browser_item_size"
android:layout_height="@dimen/audio_browser_item_size"
android:src="@{cover}"
android:layout_gravity="center"
vlc:item="@{item}"
android:visibility="@{cover != null ? View.VISIBLE : View.GONE}"/>
<LinearLayout
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:vlc="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View"/>
<variable
......@@ -52,6 +53,7 @@
android:checked="@{checked}"
android:onClick="@{holder.onCheckBoxClick}"/>
<!-- Image downloading is handled by org.videolan.vlc.gui.helpers.AsyncImageLoader.downloadIcon() -->
<TextView
android:id="@+id/dvi_icon"
android:layout_width="@dimen/directory_browser_item_size"
......@@ -64,7 +66,8 @@
android:text="@{protocol}"
android:textSize="11sp"
android:textColor="@color/whitetransparent"
android:background="@{image}"/>
android:background="@{image}"
vlc:mediaWithArt="@{media}" />
<LinearLayout
android:layout_width="0dp"
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:vlc="http://schemas.android.com/apk/res-auto" >
<data>
<import type="android.view.View"/>
<variable
......@@ -9,7 +10,7 @@
name="item"
type="org.videolan.vlc.extensions.api.VLCExtensionItem"/>
<variable
name="imageDrawable"
name="image"
type="android.graphics.drawable.BitmapDrawable"/>
</data>
......@@ -20,19 +21,19 @@
android:clickable="true"
android:onClick="@{holder.onClick}" >
<ImageView
android:id="@+id/image"
android:id="@+id/extension_image"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_alignParentLeft="true"
android:layout_marginRight="5dp"
android:src="@{imageDrawable}"/>
android:src="@{image}" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/image"
android:layout_toRightOf="@+id/extension_image"
android:layout_toLeftOf="@+id/item_more"
android:layout_above="@+id/author"
android:layout_marginBottom="1dp"
......@@ -50,7 +51,7 @@
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/image"
android:layout_toRightOf="@+id/extension_image"
android:layout_toLeftOf="@+id/item_more"
android:layout_marginTop="1dp"
android:gravity="top"
......@@ -67,5 +68,4 @@
android:src="@drawable/ic_more"
android:visibility="@{item.type != 0 ? View.VISIBLE : View.GONE}"/>
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto">
xmlns:vlc="http://schemas.android.com/apk/res-auto" >
<data>
......@@ -43,9 +43,9 @@
android:id="@+id/card_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardElevation="1sp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
vlc:cardElevation="1sp"
vlc:cardPreventCornerOverlap="false"
vlc:cardUseCompatPadding="true"
android:layout_marginBottom="10dip"
android:longClickable="true"
android:clickable="true"
......@@ -63,13 +63,16 @@
android:gravity="center_vertical"
android:orientation="vertical">
<!-- Image loading is handled by org.videolan.vlc.gui.helpers.AsyncImageLoader.loadPicture() -->
<ImageView
android:id="@+id/ml_item_thumbnail"
android:layout_width="@dimen/grid_card_thumb_width"
android:layout_height="@dimen/grid_card_thumb_height"
android:background="?attr/background_default_darker"
android:scaleType="@{scaleType}"
android:src="@{cover}" />
vlc:media="@{media}"
vlc:binding="@{holder.binding}"
android:src="@{cover}"/>
<LinearLayout
android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto">
xmlns:vlc="http://schemas.android.com/apk/res-auto">
<data>
......@@ -44,9 +44,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
card_view:cardElevation="1sp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
vlc:cardElevation="1sp"
vlc:cardPreventCornerOverlap="false"
vlc:cardUseCompatPadding="true"
android:clickable="true"
android:focusable="true"
android:onClick="@{holder.onClick}"
......@@ -59,11 +59,14 @@
android:padding="10dp"
android:orientation="horizontal">
<!-- Image loading is handled by org.videolan.vlc.gui.helpers.AsyncImageLoader.loadPicture() -->
<ImageView
android:id="@+id/ml_item_thumbnail"
android:layout_width="120dip"
android:layout_height="76dip"
android:background="?attr/background_default_darker"
vlc:media="@{media}"
vlc:binding="@{holder.binding}"
android:scaleType="@{scaleType}"
android:src="@{cover}" />
......
......@@ -37,7 +37,6 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.SectionIndexer;
import android.widget.TextView;
import org.videolan.vlc.BR;
import org.videolan.vlc.R;
......@@ -45,7 +44,6 @@ import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.gui.helpers.AsyncImageLoader;
import org.videolan.vlc.gui.helpers.AudioUtil;
import org.videolan.vlc.gui.helpers.MediaComparators;
import org.videolan.vlc.gui.helpers.UiTools;
import org.videolan.vlc.interfaces.IAudioClickHandler;
import org.videolan.vlc.media.MediaUtils;
import org.videolan.vlc.media.MediaWrapper;
......@@ -362,17 +360,10 @@ public class AudioBrowserListAdapter extends BaseAdapter implements SectionIndex
holder.binding.setVariable(BR.item, item);
holder.binding.setVariable(BR.position, position);
final ArrayList<MediaWrapper> mediaList = mItems.get(position).mMediaList;
boolean asyncLoad = true;
if (mItemType == ITEM_WITH_COVER) {
Bitmap bitmap = AudioUtil.getCoverFromMemCache(mContext, mediaList, 64);
if (bitmap != null) {
asyncLoad = false;
holder.binding.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
} else {
holder.binding.setVariable(BR.cover, AudioUtil.DEFAULT_COVER);
}
//Tagging the binding to the ImageView will trigger async image loading with:
// org.videolan.vlc.gui.helpers.AsyncImageLoader.loadPicture(ImageView , AudioBrowserListAdapter.ListItem)
holder.binding.getRoot().findViewById(R.id.media_cover).setTag(holder.binding);
} else
holder.binding.setVariable(BR.cover, AudioUtil.DEFAULT_COVER);
......@@ -380,8 +371,6 @@ public class AudioBrowserListAdapter extends BaseAdapter implements SectionIndex
holder.binding.setVariable(BR.clickable, mContextPopupMenuListener != null);
holder.binding.setVariable(BR.handler, this);
holder.binding.executePendingBindings();
if (asyncLoad)
AsyncImageLoader.LoadImage(new AudioCoverFetcher(holder.binding, mContext, mediaList), null);
return v;
}
......@@ -598,28 +587,4 @@ public class AudioBrowserListAdapter extends BaseAdapter implements SectionIndex
if (mContextPopupMenuListener != null)
mContextPopupMenuListener.onPopupMenu(v, ((Integer)v.getTag()).intValue());
}
private static class AudioCoverFetcher extends AsyncImageLoader.CoverFetcher {
final ArrayList<MediaWrapper> list;
final Context context;
AudioCoverFetcher(ViewDataBinding binding, Context context, ArrayList<MediaWrapper> list) {
super(binding);
this.context = context;
this.list = list;
}
@Override
public Bitmap getImage() {
return AudioUtil.getCover(context, list, 64);
}
@Override
public void updateBindImage(Bitmap bitmap, View target) {
if (bitmap != null && (bitmap.getWidth() != 1 && bitmap.getHeight() != 1)) {
binding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
binding.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
}
}
}
}
......@@ -36,13 +36,11 @@ import org.videolan.vlc.R;
import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.databinding.BrowserItemSeparatorBinding;
import org.videolan.vlc.databinding.DirectoryViewItemBinding;
import org.videolan.vlc.gui.helpers.AsyncImageLoader;
import org.videolan.vlc.gui.helpers.MediaComparators;
import org.videolan.vlc.media.MediaDatabase;
import org.videolan.vlc.media.MediaUtils;
import org.videolan.vlc.media.MediaWrapper;
import org.videolan.vlc.util.CustomDirectories;
import org.videolan.vlc.util.HttpImageLoader;
import java.io.File;
import java.util.ArrayList;
......@@ -112,8 +110,6 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
vh.binding.executePendingBindings();
vh.binding.dviIcon.setBackgroundResource(getIconResId(media));
if (!TextUtils.isEmpty(media.getArtworkURL()) && media.getArtworkURL().startsWith("http"))
AsyncImageLoader.LoadImage(new HttpImageLoader(media.getArtworkURL(), vh.binding), null);
vh.setContextMenuListener();
}
......@@ -136,13 +132,14 @@ public class BaseBrowserAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
}
public class MediaViewHolder extends ViewHolder implements View.OnLongClickListener {
DirectoryViewItemBinding binding;
public DirectoryViewItemBinding binding;
public MediaViewHolder(View v) {
super(v);
binding = DataBindingUtil.bind(v);
binding.setHolder(this);
v.findViewById(R.id.layout_item).setTag(R.id.layout_item, this);
v.setTag(binding);
}
public void setContextMenuListener() {
......
......@@ -2,7 +2,6 @@ package org.videolan.vlc.gui.browser;
import android.content.res.Resources;
import android.databinding.DataBindingUtil;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
......@@ -30,11 +29,11 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
ExtensionItemViewBinding binding;
public ExtensionItemViewBinding binding;
public ViewHolder(View itemView) {
super(itemView);
binding = DataBindingUtil.bind(itemView);
public ViewHolder(ExtensionItemViewBinding binding) {
super(binding.getRoot());
this.binding = binding;
itemView.setOnLongClickListener(this);
binding.setHolder(this);
}
......@@ -75,10 +74,7 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.extension_item_view, parent, false);
return new ViewHolder(v);
return new ViewHolder((ExtensionItemViewBinding) DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.extension_item_view, parent, false));
}
@Override
......@@ -88,11 +84,9 @@ public class ExtensionAdapter extends RecyclerView.Adapter<ExtensionAdapter.View
vh.binding.setItem(item);
vh.binding.executePendingBindings();
Resources res = holder.itemView.getContext().getResources();
vh.binding.setImageDrawable(new BitmapDrawable(res, BitmapFactory.decodeResource(res, getIconResId(item))));
if (item.imageUri != null) {
if (TextUtils.equals("http", item.imageUri.getScheme()))
vh.binding.setImage(new BitmapDrawable(res, BitmapFactory.decodeResource(res, getIconResId(item))));
if (item.imageUri != null && (TextUtils.equals("http", item.imageUri.getScheme())))
AsyncImageLoader.LoadImage(new HttpImageLoader(item.getImageUri().toString(), holder.binding), null);
}
}
private int getIconResId(VLCExtensionItem item) {
......
......@@ -24,14 +24,25 @@
package org.videolan.vlc.gui.helpers;
import android.app.Activity;
import android.databinding.BindingAdapter;
import android.databinding.OnRebindCallback;
import android.databinding.ViewDataBinding;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import org.videolan.vlc.BR;
import org.videolan.vlc.R;
import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.gui.audio.AudioBrowserListAdapter;
import org.videolan.vlc.media.MediaWrapper;
import org.videolan.vlc.util.HttpImageLoader;
import java.util.concurrent.Callable;
......@@ -43,6 +54,9 @@ public class AsyncImageLoader {
}
public final static String TAG = "VLC/AsyncImageLoader";
private static final Handler sHandler = new Handler(Looper.getMainLooper());
public static final BitmapDrawable DEFAULT_COVER_VIDEO = new BitmapDrawable(VLCApplication.getAppResources(), BitmapCache.getFromResource(VLCApplication.getAppResources(), R.drawable.ic_cone_o));
public static void LoadImage(final Callbacks cbs, final View target){
VLCApplication.runBackground(new Runnable() {
......@@ -54,37 +68,8 @@ public class AsyncImageLoader {
});
}
public static void LoadAudioCover(final Callable<Bitmap> loader, final ViewDataBinding binding, final Activity activity){
final Callbacks updater = new Callbacks() {
@Override
public Bitmap getImage() {
try {
return loader.call();
} catch (Exception ignored) {
return null;
}
}
@Override
public void updateImage(final Bitmap bitmap, View target) {
if (bitmap != null && activity != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
binding.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
binding.executePendingBindings();
}
});
}
}
};
LoadImage(updater, null);
}
public abstract static class CoverFetcher implements AsyncImageLoader.Callbacks {
final protected ViewDataBinding binding;
protected ViewDataBinding binding = null;
private boolean bindChanged = false;
final OnRebindCallback<ViewDataBinding> rebindCallbacks = new OnRebindCallback<ViewDataBinding>() {
@Override
......@@ -105,18 +90,173 @@ public class AsyncImageLoader {
};
protected CoverFetcher(ViewDataBinding binding){
this.binding = binding;
this.binding.executePendingBindings();
this.binding.addOnRebindCallback(rebindCallbacks);
if (binding != null) {
this.binding = binding;
this.binding.executePendingBindings();
this.binding.addOnRebindCallback(rebindCallbacks);
}
}
public abstract void updateBindImage(final Bitmap bitmap, View target);
public void updateBindImage(final Bitmap bitmap) {}
public void updateImageView(final Bitmap bitmap, View target) {}
@Override
public final void updateImage(final Bitmap bitmap, View target) {
this.binding.removeOnRebindCallback(rebindCallbacks);
if (!bindChanged)
updateBindImage(bitmap, target);
public void updateImage(final Bitmap bitmap, final View target) {
if (binding != null) {
this.binding.removeOnRebindCallback(rebindCallbacks);
if (!bindChanged)
sHandler.post(new Runnable() {
@Override
public void run() {
updateBindImage(bitmap);
}
});
} else {
sHandler.post(new Runnable() {
@Override
public void run() {
updateImageView(bitmap, target);
}
});
}
}
}
/*
* Custom bindings to trigger image (dwon)loading
*/
@BindingAdapter({"bind:imageUri", "bind:binding"})
public static void downloadIcon(final View v, final Uri imageUri, final ViewDataBinding vdb) {
AsyncImageLoader.LoadImage(new Callbacks() {
@Override
public Bitmap getImage() {
return HttpImageLoader.downloadBitmap(imageUri.toString());
}
@Override
public void updateImage(Bitmap bitmap, View target) {
if (v instanceof ImageView)
setCover((ImageView) v, 0, bitmap, vdb);
}
}, v);
}
@BindingAdapter({"bind:mediaWithArt"})
public static void downloadIcon(View v, MediaWrapper mw) {
ViewDataBinding vdb = (ViewDataBinding) v.getTag();
if (TextUtils.isEmpty(mw.getArtworkURL()) || !mw.getArtworkURL().startsWith("http"))
return;
if (vdb == null && v.getTag() instanceof ViewDataBinding)
vdb = (ViewDataBinding) v.getTag();
AsyncImageLoader.LoadImage(new MediaCoverFetcher(vdb, mw), v);
}
@BindingAdapter({"bind:media"})
public static void loadPicture(ImageView v, MediaWrapper mw) {
ViewDataBinding vdb = null;
if (v.getTag() instanceof ViewDataBinding)
vdb = (ViewDataBinding) v.getTag();
loadPicture(v, mw, vdb);
}
@BindingAdapter({"bind:item"})
public static void loadPicture(final ImageView v, final AudioBrowserListAdapter.ListItem item) {
final Object tag = v.getTag();
if (tag == null || !(tag instanceof ViewDataBinding))
return;
Bitmap bitmap = AudioUtil.getCoverFromMemCache(VLCApplication.getAppContext(), item.mMediaList, 64);
if (bitmap != null) {
((ViewDataBinding) tag).setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
return;
}
AsyncImageLoader.LoadImage(new Callbacks() {
@Override
public Bitmap getImage() {
return AudioUtil.getCover(VLCApplication.getAppContext(), item.mMediaList, 64);
}
@Override
public void updateImage(final Bitmap bitmap, View target) {
sHandler.post(new Runnable() {
@Override
public void run() {
setCover(v, MediaWrapper.TYPE_AUDIO, bitmap, (ViewDataBinding) tag);
}
});
}
}, v);
}
@BindingAdapter({"bind:media", "bind:binding"})
public static void loadPicture(ImageView v, MediaWrapper mw, ViewDataBinding vdb) {
final Bitmap bitmap = mw.getType() == MediaWrapper.TYPE_VIDEO ?
BitmapUtil.getPictureFromCache(mw) :
AudioUtil.getCoverFromMemCache(v.getContext(), mw, 64);
if (bitmap != null)
setCover(v, mw.getType(), bitmap, vdb);
else
AsyncImageLoader.LoadImage(new MediaCoverFetcher(vdb, mw), v);
}
private static void setCover(ImageView iv, int type, Bitmap bitmap, ViewDataBinding vdb) {
if (vdb != null) {
if (bitmap != null && bitmap.getWidth() != 1 && bitmap.getHeight() != 1) {
vdb.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
vdb.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
} else
vdb.setVariable(BR.cover, type == MediaWrapper.TYPE_VIDEO ? DEFAULT_COVER_VIDEO : AudioUtil.DEFAULT_COVER);
} else {
iv.setVisibility(View.VISIBLE);
if (bitmap != null && bitmap.getWidth() != 1 && bitmap.getHeight() != 1) {
iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setImageBitmap(bitmap);
} else {
iv.setImageResource(type == MediaWrapper.TYPE_VIDEO ? R.drawable.ic_cone_o : R.drawable.icon);
}
}
}
private static class MediaCoverFetcher extends AsyncImageLoader.CoverFetcher {
final MediaWrapper media;
MediaCoverFetcher(ViewDataBinding binding, MediaWrapper media) {
super(binding);
this.media = media;
}
@Override
public Bitmap getImage() {
if (!TextUtils.isEmpty(media.getArtworkURL()) && media.getArtworkURL().startsWith("http"))
return HttpImageLoader.downloadBitmap(media.getArtworkURL());
return media.getType() == MediaWrapper.TYPE_VIDEO ? BitmapUtil.fetchPicture(media) :
AudioUtil.getCover(VLCApplication.getAppContext(), media, 64);
}
@Override
public void updateImage(final Bitmap bitmap, final View target) {
sHandler.post(new Runnable() {
@Override
public void run() {
if (target instanceof ImageView)
setCover((ImageView) target, media.getType(), bitmap, binding);
else if (target instanceof TextView) {
if (bitmap != null && (bitmap.getWidth() != 1 && bitmap.getHeight() != 1)) {
if (binding != null) {
binding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
binding.setVariable(BR.image, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
binding.setVariable(BR.protocol, null);
} else {
target.setBackgroundDrawable(new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
((TextView) target).setText(null);
}
}
}
}
});
}
}
}
......@@ -23,8 +23,6 @@ package org.videolan.vlc.gui.video;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import android.support.v4.util.ArrayMap;
......@@ -39,9 +37,6 @@ import org.videolan.vlc.R;
import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.gui.MainActivity;
import org.videolan.vlc.gui.SecondaryActivity;
import org.videolan.vlc.gui.helpers.AsyncImageLoader;
import org.videolan.vlc.gui.helpers.BitmapCache;
import org.videolan.vlc.gui.helpers.BitmapUtil;
import org.videolan.vlc.media.MediaGroup;
import org.videolan.vlc.media.MediaWrapper;
import org.videolan.vlc.util.Strings;
......@@ -70,8 +65,6 @@ public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.View
private VideoGridFragment mFragment;
private volatile ArrayList<MediaWrapper> mVideos = new ArrayList<>();
public static final BitmapDrawable DEFAULT_COVER = new BitmapDrawable(VLCApplication.getAppResources(), BitmapCache.getFromResource(VLCApplication.getAppResources(), R.drawable.ic_cone_o));
public VideoListAdapter(VideoGridFragment fragment) {
super();
mFragment = fragment;
......@@ -88,27 +81,10 @@ public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.View
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
MediaWrapper media = mVideos.get(position);
boolean asyncLoad = true;
holder.binding.setVariable(BR.scaleType, ImageView.ScaleType.CENTER);
final Bitmap bitmap = BitmapUtil.getPictureFromCache(media);
if (bitmap != null) {
if (bitmap.getWidth() != 1 && bitmap.getHeight() != 1) {
asyncLoad = false;
holder.binding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
holder.binding.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
} else
holder.binding.setVariable(BR.cover, DEFAULT_COVER);
} else {
holder.binding.setVariable(BR.cover, DEFAULT_COVER);
}
holder.binding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
fillView(holder, media);
holder.binding.setVariable(BR.media, media);
holder.binding.executePendingBindings();
if (asyncLoad)
AsyncImageLoader.LoadImage(new VideoCoverFetcher(holder.binding, media), null);
}
@MainThread
......@@ -303,31 +279,9 @@ public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.View
return mListMode;
}
private static class VideoCoverFetcher extends AsyncImageLoader.CoverFetcher {
final MediaWrapper media;
VideoCoverFetcher(ViewDataBinding binding, MediaWrapper media) {
super(binding);
this.media = media;
}
@Override
public Bitmap getImage() {
return BitmapUtil.fetchPicture(media);
}
@Override
public void updateBindImage(Bitmap bitmap, View target) {
if (bitmap != null && (bitmap.getWidth() != 1 && bitmap.getHeight() != 1)) {
binding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
binding.setVariable(BR.cover, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
}
}
}
@Override
public long getItemId(int position) {
return 0l;
return 0L;
}
@Override
......@@ -342,7 +296,7 @@ public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.View
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
boolean listmode;
ViewDataBinding binding;
public ViewDataBinding binding;
public ViewHolder(View itemView, boolean listMode) {
super(itemView);
......
......@@ -31,6 +31,7 @@ import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.support.v17.leanback.widget.ImageCardView;
import android.support.v4.util.SimpleArrayMap;
import android.view.View;
......@@ -90,21 +91,26 @@ public class HttpImageLoader implements Callbacks {
@Override
public Bitmap getImage() {
if (iconsMap.containsKey(mImageLink)) {
Bitmap bd = iconsMap.get(mImageLink).get();
return downloadBitmap(mImageLink);
}
@Nullable
public static Bitmap downloadBitmap(String imageUrl) {
if (iconsMap.containsKey(imageUrl)) {
Bitmap bd = iconsMap.get(imageUrl).get();
if (bd != null) {
return bd;
} else
iconsMap.remove(mImageLink);
iconsMap.remove(imageUrl);
}
HttpURLConnection urlConnection = null;
Bitmap icon = null;
try {
URL url = new URL(mImageLink);
URL url = new URL(imageUrl);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
icon = BitmapFactory.decodeStream(in);
iconsMap.put(mImageLink, new SoftReference<>(icon));
iconsMap.put(imageUrl, new SoftReference<>(icon));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
......@@ -118,18 +124,16 @@ public class HttpImageLoader implements Callbacks {
@Override
public void updateImage(final Bitmap bitmap, final View target) {
if (bitmap == null || bitmap.getWidth() == 1 || bitmap.getHeight() == 1)
return;
if (mBinding != null) {
mBinding.removeOnRebindCallback(rebindCallbacks);
if (bitmap != null && (bitmap.getWidth() != 1 && bitmap.getHeight() != 1)) {
if (mBinding != null) {
if (bindChanged)
return;
mBinding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
mBinding.setVariable(BR.image, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
mBinding.setVariable(BR.protocol, null);
}
}
} else if (bitmap != null && (bitmap.getWidth() != 1 && bitmap.getHeight() != 1)) {
if (bindChanged)
return;
mBinding.setVariable(BR.scaleType, ImageView.ScaleType.FIT_CENTER);
mBinding.setVariable(BR.image, new BitmapDrawable(VLCApplication.getAppResources(), bitmap));
mBinding.setVariable(BR.protocol, null);
} else {
sHandler.post(new Runnable() {
@Override
public void run() {
......@@ -142,6 +146,5 @@ public class HttpImageLoader implements Callbacks {
}
});
}
}
}
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