| 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) { |
| } |
| } |