blob: 26e61ae121213831fcaa14167724253a7db43a19 [file] [log] [blame]
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) {
}
}