aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java
diff options
context:
space:
mode:
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.java264
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) {
+ }
+}