diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java new file mode 100644 index 000000000..26e61ae12 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java @@ -0,0 +1,264 @@ +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.AsyncTask; +import android.os.Parcel; +import android.util.Log; +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.mediapicker.MediaItem; +import org.wordpress.mediapicker.source.MediaSource; +import org.wordpress.mediapicker.MediaUtils.LimitedBackgroundOperation; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class MediaSourceWPImages implements MediaSource { + private final List<MediaItem> mVerifiedItems = new ArrayList<>(); + private final List<MediaItem> mMediaItems = new ArrayList<>(); + + private OnMediaChange mListener; + + public MediaSourceWPImages() { + } + + @Override + public void gather(Context context) { + mMediaItems.clear(); + + Blog blog = WordPress.getCurrentBlog(); + + if (blog != null) { + Cursor imageCursor = WordPressMediaUtils.getWordPressMediaImages(String.valueOf(blog.getLocalTableBlogId())); + + if (imageCursor != null) { + addWordPressImagesFromCursor(imageCursor); + imageCursor.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 mVerifiedItems.size(); + } + + @Override + public MediaItem getMedia(int position) { + return mVerifiedItems.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_image, parent, false); + } + + if (convertView != null) { + MediaItem mediaItem = mVerifiedItems.get(position); + Uri imageSource = mediaItem.getPreviewSource(); + ImageView imageView = (ImageView) convertView.findViewById(R.id.wp_image_view_background); + if (imageView != null) { + if (imageSource != null) { + Bitmap imageBitmap = null; + if (cache != null) { + imageBitmap = cache.getBitmap(imageSource.toString()); + } + + if (imageBitmap == null) { + imageView.setImageDrawable(placeholderDrawable(convertView.getContext())); + WordPressMediaUtils.BackgroundDownloadWebImage bgDownload = + new WordPressMediaUtils.BackgroundDownloadWebImage(imageView); + imageView.setTag(bgDownload); + bgDownload.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, mediaItem.getPreviewSource()); + } else { + imageView.setImageBitmap(imageBitmap); + } + } else { + imageView.setTag(null); + imageView.setImageResource(R.color.grey_darken_10); + } + } + } + + 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; + } + + private void addWordPressImagesFromCursor(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 filePathColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_PATH); + int thumbnailColumnIndex = cursor.getColumnIndex(WordPressDB.COLUMN_NAME_THUMBNAIL_URL); + + 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) { + newContent.setSource(Uri.parse(fileUrl)); + newContent.setPreviewSource(Uri.parse(fileUrl)); + } else if (filePathColumnIndex != -1) { + String filePath = cursor.getString(filePathColumnIndex); + + if (filePath != null) { + newContent.setSource(Uri.parse(filePath)); + newContent.setPreviewSource(Uri.parse(filePath)); + } + } + } + + if (thumbnailColumnIndex != -1) { + String preview = cursor.getString(thumbnailColumnIndex); + + if (preview != null) { + newContent.setPreviewSource(Uri.parse(preview)); + } + } + + mMediaItems.add(newContent); + } while (cursor.moveToNext()); + + removeDeletedEntries(); + } else if (mListener != null) { + mListener.onMediaLoaded(true); + } + } + + private void removeDeletedEntries() { + final List<MediaItem> existingItems = new ArrayList<>(mMediaItems); + final List<MediaItem> failedItems = new ArrayList<>(); + + for (final MediaItem mediaItem : existingItems) { + LimitedBackgroundOperation<MediaItem, Void, MediaItem> backgroundCheck = + new LimitedBackgroundOperation<MediaItem, Void, MediaItem>() { + private int responseCode; + + @Override + protected MediaItem performBackgroundOperation(MediaItem[] params) { + MediaItem mediaItem = params[0]; + try { + URL mediaUrl = new URL(mediaItem.getSource().toString()); + HttpURLConnection connection = (HttpURLConnection) mediaUrl.openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + responseCode = connection.getResponseCode(); + } catch (IOException ioException) { + Log.e("", "Error reading from " + mediaItem.getSource() + "\nexception:" + ioException); + + return null; + } + + return mediaItem; + } + + @Override + public void performPostExecute(MediaItem result) { + if (mListener != null && result != null) { + if (responseCode == 200) { + mVerifiedItems.add(result); + List<MediaItem> resultList = new ArrayList<>(); + resultList.add(result); + + // Only signal newly loaded data every 3 images + if ((existingItems.size() - mVerifiedItems.size()) % 3 == 0) { + mListener.onMediaAdded(MediaSourceWPImages.this, resultList); + } + } else { + failedItems.add(result); + } + + // Notify of all media loaded if all have been processed + if ((failedItems.size() + mVerifiedItems.size()) == existingItems.size()) { + mListener.onMediaLoaded(true); + } + } + } + + @Override + public void startExecution(Object params) { + if (!(params instanceof MediaItem)) { + throw new IllegalArgumentException("Params must be of type MediaItem"); + } + executeOnExecutor(THREAD_POOL_EXECUTOR, (MediaItem) params); + } + }; + backgroundCheck.executeWithLimit(mediaItem); + } + } + + /** + * {@link android.os.Parcelable} interface + */ + + public static final Creator<MediaSourceWPImages> CREATOR = + new Creator<MediaSourceWPImages>() { + public MediaSourceWPImages createFromParcel(Parcel in) { + return new MediaSourceWPImages(); + } + + public MediaSourceWPImages[] newArray(int size) { + return new MediaSourceWPImages[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + } +} |