package org.wordpress.android.ui.media; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Parcel; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.android.volley.toolbox.ImageLoader; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.WordPressDB; import org.wordpress.android.models.Blog; import org.wordpress.android.util.MediaUtils; import org.wordpress.mediapicker.MediaItem; import org.wordpress.mediapicker.source.MediaSource; import java.util.ArrayList; import java.util.List; public class MediaSourceWPVideos implements MediaSource { private static final String VIDEO_PRESS_HOST = "https://videos.files.wordpress.com/"; private static final String VIDEO_PRESS_THUMBNAIL_APPEND = "_hd.thumbnail.jpg"; private OnMediaChange mListener; private List<MediaItem> mMediaItems = new ArrayList<>(); public MediaSourceWPVideos() { } @Override public void gather(Context context) { Blog blog = WordPress.getCurrentBlog(); if (blog != null) { Cursor videoCursor = WordPressMediaUtils.getWordPressMediaVideos(String.valueOf(blog.getLocalTableBlogId())); if (videoCursor != null) { addWordPressVideosFromCursor(videoCursor); videoCursor.close(); } else if (mListener != null){ mListener.onMediaLoaded(false); } } else if (mListener != null){ mListener.onMediaLoaded(false); } } @Override public void cleanup() { mMediaItems.clear(); } @Override public void setListener(OnMediaChange listener) { mListener = listener; } @Override public int getCount() { return mMediaItems.size(); } @Override public MediaItem getMedia(int position) { return mMediaItems.get(position); } @Override public View getView(int position, View convertView, ViewGroup parent, LayoutInflater inflater, ImageLoader.ImageCache cache) { if (convertView == null) { convertView = inflater.inflate(R.layout.media_item_wp_video, parent, false); } if (convertView != null) { MediaItem mediaItem = mMediaItems.get(position); Uri imageSource = mediaItem.getPreviewSource(); ImageView imageView = (ImageView) convertView.findViewById(R.id.wp_video_view_background); if (imageView != null) { if (imageSource != null) { Bitmap imageBitmap = null; if (cache != null) { imageBitmap = cache.getBitmap(imageSource.toString()); } imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); if (imageBitmap == null) { imageView.setImageDrawable(placeholderDrawable(convertView.getContext())); WordPressMediaUtils.BackgroundDownloadWebImage bgDownload = new WordPressMediaUtils.BackgroundDownloadWebImage(imageView); imageView.setTag(bgDownload); bgDownload.execute(mediaItem.getPreviewSource()); } else { org.wordpress.mediapicker.MediaUtils.fadeInImage(imageView, imageBitmap); } } else { imageView.setTag(null); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setImageResource(R.drawable.video_thumbnail); } } } return convertView; } @Override public boolean onMediaItemSelected(MediaItem mediaItem, boolean selected) { return !selected; } private Drawable placeholderDrawable(Context context) { if (context != null && context.getResources() != null) { return context.getResources().getDrawable(R.drawable.media_item_placeholder); } return null; } /** * Helper method; removes unnecessary characters from videoPressShortcode cursor value * * @param cursorEntry * the cursor value for the videoPressShortcode key * @return * the VideoPress code */ private String extractVideoPressCode(String cursorEntry) { cursorEntry = cursorEntry.replace("[wpvideo ", ""); cursorEntry = cursorEntry.substring(0, cursorEntry.length() - 1); return cursorEntry; } private void addWordPressVideosFromCursor(Cursor cursor) { if (cursor.moveToFirst()) { do { int attachmentIdColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_MEDIA_ID); int fileUrlColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_URL); int fileNameColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_NAME); int videoPressColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_VIDEO_PRESS_SHORTCODE); String id = ""; if (attachmentIdColumnIndex != -1) { id = String.valueOf(cursor.getInt(attachmentIdColumnIndex)); } MediaItem newContent = new MediaItem(); newContent.setTag(id); newContent.setTitle(""); if (fileUrlColumnIndex != -1) { String fileUrl = cursor.getString(fileUrlColumnIndex); if (fileUrl != null && MediaUtils.isVideo(fileUrl)) { newContent.setSource(Uri.parse(fileUrl)); } else { continue; } } if (videoPressColumnIndex != -1 && fileNameColumnIndex != -1) { String videoPressCode = cursor.getString(videoPressColumnIndex); String fileName = cursor.getString(fileNameColumnIndex); if (videoPressCode != null && !videoPressCode.isEmpty() && fileName != null && !fileName.isEmpty()) { videoPressCode = extractVideoPressCode(videoPressCode); newContent.setPreviewSource(VIDEO_PRESS_HOST + videoPressCode + "/" + fileName + VIDEO_PRESS_THUMBNAIL_APPEND); } } mMediaItems.add(newContent); } while (cursor.moveToNext()); } if (mListener != null) { mListener.onMediaLoaded(true); } } /** * {@link android.os.Parcelable} interface */ public static final Creator<MediaSourceWPVideos> CREATOR = new Creator<MediaSourceWPVideos>() { public MediaSourceWPVideos createFromParcel(Parcel in) { return new MediaSourceWPVideos(); } public MediaSourceWPVideos[] newArray(int size) { return new MediaSourceWPVideos[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { } }