/*
* Multiple Image Selection Activity, modified from Android's Gallery App.
* @date 2013-04
* @see https://android.googlesource.com/platform/packages/apps/Gallery/
*/
package com.seafile.seadroid2.gallery;
import java.util.ArrayList;
import java.util.HashSet;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.seafile.seadroid2.R;
public class MultipleImageSelectionActivity extends NoSearchActivity implements
GridViewSpecial.Listener, GridViewSpecial.DrawAdapter {
private static final String STATE_SCROLL_POSITION = "scroll_position";
private static final String STATE_SELECTED_INDEX = "first_index";
private static final String TAG = "MultipleImageSelectionActivity";
private static final float INVALID_POSITION = -1f;
private ImageManager.ImageListParam mParam;
private IImageList mAllImages;
private int mInclusion;
boolean mSortAscending = false;
private View mNoImagesView;
private TextView mSelectionStatus;
public static final int CROP_MSG = 2;
private Dialog mMediaScanningDialog;
// private MenuItem mSlideShowItem;
private SharedPreferences mPrefs;
private long mVideoSizeLimit = Long.MAX_VALUE;
private View mSelectionFooterView;
private BroadcastReceiver mReceiver = null;
private final Handler mHandler = new Handler();
private boolean mLayoutComplete;
private boolean mPausing = true;
private ImageLoader mLoader;
private GridViewSpecial mGvs;
private Uri mCropResultUri;
// The index of the first picture in GridViewSpecial.
private int mSelectedIndex = GridViewSpecial.INDEX_NONE;
private float mScrollPosition = INVALID_POSITION;
private boolean mConfigurationChanged = false;
private HashSet<IImage> mMultiSelected = Sets.newHashSet();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
// Must be called before setContentView().
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.multiple_image_selection);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.custom_gallery_title);
mNoImagesView = findViewById(R.id.no_images);
mSelectionStatus = (TextView)findViewById(R.id.upload_selection_status);
mSelectionFooterView = findViewById(R.id.selection_footer);
mGvs = (GridViewSpecial) findViewById(R.id.image_grid);
mGvs.setListener(this);
// mFooterOrganizeView = findViewById(R.id.footer_organize);
// consume all click events on the footer view
// mFooterOrganizeView.setOnClickListener(Util.getNullOnClickListener());
// initializeFooterButtons();
initializeButtons();
mVideoSizeLimit = getIntent().getLongExtra(
MediaStore.EXTRA_SIZE_LIMIT, Long.MAX_VALUE);
setupTitle();
mLoader = new ImageLoader(getContentResolver(), mHandler);
}
private void initializeButtons() {
Button cancelButton = (Button) findViewById(R.id.button_cancel_upload);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
Button confirmButton = (Button) findViewById(R.id.button_confirm_upload);
confirmButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResultAndFinish();
}
});
}
private void setResultAndFinish() {
Intent result = new Intent();
ArrayList<String> selected = Lists.newArrayList();
for (IImage image : mMultiSelected) {
selected.add(image.getDataPath());
}
result.putExtra("photos", selected);
setResult(RESULT_OK, result);
finish();
}
// private void initializeFooterButtons() {
// Button deleteButton = (Button) findViewById(R.id.button_delete);
// deleteButton.setOnClickListener(new OnClickListener() {
// public void onClick(View v) {
// onDeleteMultipleClicked();
// }
// });
// Button shareButton = (Button) findViewById(R.id.button_share);
// shareButton.setOnClickListener(new OnClickListener() {
// public void onClick(View v) {
// onShareMultipleClicked();
// }
// });
// Button closeButton = (Button) findViewById(R.id.button_close);
// closeButton.setOnClickListener(new OnClickListener() {
// public void onClick(View v) {
// closeMultiSelectMode();
// }
// });
// }
// private MenuItem addSlideShowMenu(Menu menu) {
// return menu.add(Menu.NONE, Menu.NONE, MenuHelper.POSITION_SLIDESHOW,
// R.string.slide_show)
// .setOnMenuItemClickListener(
// new MenuItem.OnMenuItemClickListener() {
// public boolean onMenuItemClick(MenuItem item) {
// return onSlideShowClicked();
// }
// }).setIcon(android.R.drawable.ic_menu_slideshow);
// }
// public boolean onSlideShowClicked() {
// if (!canHandleEvent()) {
// return false;
// }
// IImage img = getCurrentImage();
// if (img == null) {
// img = mAllImages.getImageAt(0);
// if (img == null) {
// return true;
// }
// }
// Uri targetUri = img.fullSizeImageUri();
// Uri thisUri = getIntent().getData();
// if (thisUri != null) {
// String bucket = thisUri.getQueryParameter("bucketId");
// if (bucket != null) {
// targetUri = targetUri.buildUpon()
// .appendQueryParameter("bucketId", bucket)
// .build();
// }
// }
// Intent intent = new Intent(Intent.ACTION_VIEW, targetUri);
// intent.putExtra("slideshow", true);
// startActivity(intent);
// return true;
// }
// private final Runnable mDeletePhotoRunnable = new Runnable() {
// public void run() {
// if (!canHandleEvent()) return;
// IImage currentImage = getCurrentImage();
// // The selection will be cleared when mGvs.stop() is called, so
// // we need to call getCurrentImage() before mGvs.stop().
// mGvs.stop();
// if (currentImage != null) {
// mAllImages.removeImage(currentImage);
// }
// mGvs.setImageList(mAllImages);
// mGvs.start();
// mNoImagesView.setVisibility(mAllImages.isEmpty()
// ? View.VISIBLE
// : View.GONE);
// }
// };
// private Uri getCurrentImageUri() {
// IImage image = getCurrentImage();
// if (image != null) {
// return image.fullSizeImageUri();
// } else {
// return null;
// }
// }
// private IImage getCurrentImage() {
// int currentSelection = mGvs.getCurrentSelection();
// if (currentSelection < 0
// || currentSelection >= mAllImages.getCount()) {
// return null;
// } else {
// return mAllImages.getImageAt(currentSelection);
// }
// }
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mConfigurationChanged = true;
}
boolean canHandleEvent() {
// Don't process event in pause state.
return (!mPausing) && (mLayoutComplete);
}
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (!canHandleEvent()) return false;
// switch (keyCode) {
// case KeyEvent.KEYCODE_DEL:
// IImage image = getCurrentImage();
// if (image != null) {
// MenuHelper.deleteImage(
// this, mDeletePhotoRunnable, getCurrentImage());
// }
// return true;
// }
// return super.onKeyDown(keyCode, event);
// }
// private boolean isPickIntent() {
// String action = getIntent().getAction();
// return (Intent.ACTION_PICK.equals(action)
// || Intent.ACTION_GET_CONTENT.equals(action));
// }
// private void launchCropperOrFinish(IImage img) {
// Bundle myExtras = getIntent().getExtras();
// long size = MenuHelper.getImageFileSize(img);
// if (size < 0) {
// // Return if the image file is not available.
// return;
// }
// if (size > mVideoSizeLimit) {
// DialogInterface.OnClickListener buttonListener =
// new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// dialog.dismiss();
// }
// };
// new AlertDialog.Builder(this)
// .setIcon(android.R.drawable.ic_dialog_info)
// .setTitle(R.string.file_info_title)
// .setMessage(R.string.video_exceed_mms_limit)
// .setNeutralButton(R.string.details_ok, buttonListener)
// .show();
// return;
// }
// String cropValue = myExtras != null ? myExtras.getString("crop") : null;
// if (cropValue != null) {
// Bundle newExtras = new Bundle();
// if (cropValue.equals("circle")) {
// newExtras.putString("circleCrop", "true");
// }
// Intent cropIntent = new Intent();
// cropIntent.setData(img.fullSizeImageUri());
// cropIntent.setClass(this, CropImage.class);
// cropIntent.putExtras(newExtras);
// /* pass through any extras that were passed in */
// cropIntent.putExtras(myExtras);
// startActivityForResult(cropIntent, CROP_MSG);
// } else {
// Intent result = new Intent(null, img.fullSizeImageUri());
// if (myExtras != null && myExtras.getBoolean("return-data")) {
// // The size of a transaction should be below 100K.
// Bitmap bitmap = img.fullSizeBitmap(
// IImage.UNCONSTRAINED, 100 * 1024);
// if (bitmap != null) {
// result.putExtra("data", bitmap);
// }
// }
// setResult(RESULT_OK, result);
// finish();
// }
// }
// @Override
// protected void onActivityResult(int requestCode, int resultCode,
// Intent data) {
// switch (requestCode) {
// case MenuHelper.RESULT_COMMON_MENU_CROP: {
// if (resultCode == RESULT_OK) {
// // The CropImage activity passes back the Uri of the cropped
// // image as the Action rather than the Data.
// // We store this URI so we can move the selection box to it
// // later.
// mCropResultUri = Uri.parse(data.getAction());
// }
// break;
// }
// case CROP_MSG: {
// if (resultCode == RESULT_OK) {
// setResult(resultCode, data);
// finish();
// }
// break;
// }
// }
// }
@Override
public void onPause() {
super.onPause();
mPausing = true;
mLoader.stop();
mGvs.stop();
if (mReceiver != null) {
unregisterReceiver(mReceiver);
mReceiver = null;
}
// Now that we've paused the threads that are using the cursor it is
// safe to close it.
mAllImages.close();
mAllImages = null;
}
private void rebake(boolean unmounted, boolean scanning) {
mGvs.stop();
if (mAllImages != null) {
mAllImages.close();
mAllImages = null;
}
if (mMediaScanningDialog != null) {
mMediaScanningDialog.cancel();
mMediaScanningDialog = null;
}
if (scanning) {
mMediaScanningDialog = ProgressDialog.show(
this,
null,
getResources().getString(R.string.wait),
true,
true);
}
mParam = allImages(!unmounted && !scanning);
mAllImages = ImageManager.makeImageList(getContentResolver(), mParam);
mGvs.setImageList(mAllImages);
mGvs.setDrawAdapter(this);
mGvs.setLoader(mLoader);
mGvs.start();
if (mAllImages.getCount() > 0) {
mGvs.setVisibility(View.VISIBLE);
mSelectionFooterView.setVisibility(View.VISIBLE);
mNoImagesView.setVisibility(View.GONE);
} else {
mGvs.setVisibility(View.GONE);
mSelectionFooterView.setVisibility(View.GONE);
mNoImagesView.setVisibility(View.VISIBLE);
}
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putFloat(STATE_SCROLL_POSITION, mScrollPosition);
state.putInt(STATE_SELECTED_INDEX, mSelectedIndex);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
mScrollPosition = state.getFloat(
STATE_SCROLL_POSITION, INVALID_POSITION);
mSelectedIndex = state.getInt(STATE_SELECTED_INDEX, 0);
}
@Override
public void onResume() {
super.onResume();
mGvs.setSizeChoice(Integer.parseInt(
mPrefs.getString("pref_gallery_size_key", "1")));
mGvs.requestFocus();
String sortOrder = mPrefs.getString("pref_gallery_sort_key", null);
if (sortOrder != null) {
mSortAscending = sortOrder.equals("ascending");
}
mPausing = false;
// install an intent filter to receive SD card related events.
IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
intentFilter.addDataScheme("file");
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
// SD card available
// TODO put up a "please wait" message
// TODO also listen for the media scanner finished message
} else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
// SD card unavailable
rebake(true, false);
} else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
rebake(false, true);
} else if (action.equals(
Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
rebake(false, false);
} else if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
rebake(true, false);
}
}
};
registerReceiver(mReceiver, intentFilter);
rebake(false, ImageManager.isMediaScannerScanning(
getContentResolver()));
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// if (isPickIntent()) {
// String type = getIntent().resolveType(this);
// if (type != null) {
// if (isImageType(type)) {
// MenuHelper.addCapturePictureMenuItems(menu, this);
// } else if (isVideoType(type)) {
// MenuHelper.addCaptureVideoMenuItems(menu, this);
// }
// }
// } else {
// MenuHelper.addCaptureMenuItems(menu, this);
// if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) {
// mSlideShowItem = addSlideShowMenu(menu);
// }
// MenuItem item = menu.add(Menu.NONE, Menu.NONE,
// MenuHelper.POSITION_GALLERY_SETTING,
// R.string.camerasettings);
// item.setOnMenuItemClickListener(
// new MenuItem.OnMenuItemClickListener() {
// public boolean onMenuItemClick(MenuItem item) {
// Intent preferences = new Intent();
// preferences.setClass(MultipleImageSelectionActivity.this,
// GallerySettings.class);
// startActivity(preferences);
// return true;
// }
// });
// item.setAlphabeticShortcut('p');
// item.setIcon(android.R.drawable.ic_menu_preferences);
// item = menu.add(Menu.NONE, Menu.NONE,
// MenuHelper.POSITION_MULTISELECT,
// R.string.multiselect);
// item.setOnMenuItemClickListener(
// new MenuItem.OnMenuItemClickListener() {
// public boolean onMenuItemClick(MenuItem item) {
// if (isInMultiSelectMode()) {
// closeMultiSelectMode();
// } else {
// openMultiSelectMode();
// }
// return true;
// }
// });
// item.setIcon(R.drawable.ic_menu_multiselect_gallery);
// }
// return true;
// }
// @Override
// public boolean onPrepareOptionsMenu(Menu menu) {
// if (!canHandleEvent()) return false;
// if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) {
// boolean videoSelected = isVideoSelected();
// // TODO: Only enable slide show if there is at least one image in
// // the folder.
// if (mSlideShowItem != null) {
// mSlideShowItem.setEnabled(!videoSelected);
// }
// }
// return true;
// }
// private boolean isVideoSelected() {
// IImage image = getCurrentImage();
// return (image != null) && ImageManager.isVideo(image);
// }
// According to the intent, setup what we include (image/video) in the
// gallery and the title of the gallery.
private void setupTitle() {
mInclusion = ImageManager.INCLUDE_IMAGES | ImageManager.INCLUDE_VIDEOS;
TextView leftText = (TextView) findViewById(R.id.left_text);
leftText.setText(R.string.pick_photo_video_title);
}
// Returns the image list parameter which contains the subset of image/video
// we want.
private ImageManager.ImageListParam allImages(boolean storageAvailable) {
if (!storageAvailable) {
return ImageManager.getEmptyImageListParam();
} else {
return ImageManager.getImageListParam(
ImageManager.DataLocation.EXTERNAL,
mInclusion,
mSortAscending
? ImageManager.SORT_ASCENDING
: ImageManager.SORT_DESCENDING,
ImageManager.CAMERA_IMAGE_BUCKET_ID);
}
}
private void updateSelectionStatus() {
int nSelected = mMultiSelected.size();
String status;
if (nSelected == 0) {
status = getResources().getString(R.string.select_upload_items);
} else {
status = getResources().getQuantityString(R.plurals.n_upload_items_selected, nSelected, nSelected);
}
mSelectionStatus.setText(status);
}
private void toggleMultiSelected(IImage image) {
if (!mMultiSelected.add(image)) {
mMultiSelected.remove(image);
}
Log.d(TAG, "add/remove: " + image.getDataPath());
updateSelectionStatus();
mGvs.invalidate();
}
public void onImageClicked(int index) {
}
// public void onImageClicked(int index) {
// if (index < 0 || index >= mAllImages.getCount()) {
// return;
// }
// mSelectedIndex = index;
// mGvs.setSelectedIndex(index);
// IImage image = mAllImages.getImageAt(index);
// if (isInMultiSelectMode()) {
// toggleMultiSelected(image);
// return;
// }
// if (isPickIntent()) {
// launchCropperOrFinish(image);
// } else {
// Intent intent;
// if (image instanceof VideoObject) {
// intent = new Intent(
// Intent.ACTION_VIEW, image.fullSizeImageUri());
// intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
// ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// } else {
// intent = new Intent(this, ViewImage.class);
// intent.putExtra(ViewImage.KEY_IMAGE_LIST, mParam);
// intent.setData(image.fullSizeImageUri());
// }
// startActivity(intent);
// }
// }
public void onImageTapped(int index) {
// In the multiselect mode, once the finger finishes tapping, we hide
// the selection box by setting the selected index to none. However, if
// we use the dpad center key, we will keep the selected index in order
// to show the the selection box. We do this because we have the
// multiselect marker on the images to indicate which of them are
// selected, so we don't need the selection box, but in the dpad case
// we still need the selection box to show as a "cursor".
mGvs.setSelectedIndex(GridViewSpecial.INDEX_NONE);
toggleMultiSelected(mAllImages.getImageAt(index));
}
// private class CreateContextMenuListener implements
// View.OnCreateContextMenuListener {
// public void onCreateContextMenu(ContextMenu menu, View v,
// ContextMenu.ContextMenuInfo menuInfo) {
// if (!canHandleEvent()) return;
// IImage image = getCurrentImage();
// if (image == null) {
// return;
// }
// boolean isImage = ImageManager.isImage(image);
// if (isImage) {
// menu.add(R.string.view)
// .setOnMenuItemClickListener(
// new MenuItem.OnMenuItemClickListener() {
// public boolean onMenuItemClick(MenuItem item) {
// if (!canHandleEvent()) return false;
// onImageClicked(mGvs.getCurrentSelection());
// return true;
// }
// });
// }
// menu.setHeaderTitle(isImage
// ? R.string.context_menu_header
// : R.string.video_context_menu_header);
// if ((mInclusion & (ImageManager.INCLUDE_IMAGES
// | ImageManager.INCLUDE_VIDEOS)) != 0) {
// MenuHelper.MenuItemsResult r = MenuHelper.addImageMenuItems(
// menu,
// MenuHelper.INCLUDE_ALL,
// MultipleImageSelectionActivity.this,
// mHandler,
// mDeletePhotoRunnable,
// new MenuHelper.MenuInvoker() {
// public void run(MenuHelper.MenuCallback cb) {
// if (!canHandleEvent()) {
// return;
// }
// cb.run(getCurrentImageUri(), getCurrentImage());
// mGvs.invalidateImage(mGvs.getCurrentSelection());
// }
// });
// if (r != null) {
// r.gettingReadyToOpen(menu, image);
// }
// if (isImage) {
// MenuHelper.enableShowOnMapMenuItem(
// menu, MenuHelper.hasLatLngData(image));
// addSlideShowMenu(menu);
// }
// }
// }
// }
public void onLayoutComplete(boolean changed) {
mLayoutComplete = true;
if (mCropResultUri != null) {
IImage image = mAllImages.getImageForUri(mCropResultUri);
mCropResultUri = null;
if (image != null) {
mSelectedIndex = mAllImages.getImageIndex(image);
}
}
mGvs.setSelectedIndex(mSelectedIndex);
if (mScrollPosition == INVALID_POSITION) {
if (mSortAscending) {
mGvs.scrollTo(0, mGvs.getHeight());
} else {
mGvs.scrollToImage(0);
}
} else if (mConfigurationChanged) {
mConfigurationChanged = false;
mGvs.scrollTo(mScrollPosition);
if (mGvs.getCurrentSelection() != GridViewSpecial.INDEX_NONE) {
mGvs.scrollToVisible(mSelectedIndex);
}
} else {
mGvs.scrollTo(mScrollPosition);
}
}
public void onScroll(float scrollPosition) {
mScrollPosition = scrollPosition;
}
private Drawable mVideoOverlay;
private Drawable mVideoMmsErrorOverlay;
private Drawable mMultiSelectTrue;
private Drawable mMultiSelectFalse;
// mSrcRect and mDstRect are only used in drawImage, but we put them as
// instance variables to reduce the memory allocation overhead because
// drawImage() is called a lot.
private final Rect mSrcRect = new Rect();
private final Rect mDstRect = new Rect();
private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
public void drawImage(Canvas canvas, IImage image,
Bitmap b, int xPos, int yPos, int w, int h) {
if (b != null) {
// if the image is close to the target size then crop,
// otherwise scale both the bitmap and the view should be
// square but I suppose that could change in the future.
int bw = b.getWidth();
int bh = b.getHeight();
int deltaW = bw - w;
int deltaH = bh - h;
if (deltaW >= 0 && deltaW < 10 &&
deltaH >= 0 && deltaH < 10) {
int halfDeltaW = deltaW / 2;
int halfDeltaH = deltaH / 2;
mSrcRect.set(0 + halfDeltaW, 0 + halfDeltaH,
bw - halfDeltaW, bh - halfDeltaH);
mDstRect.set(xPos, yPos, xPos + w, yPos + h);
canvas.drawBitmap(b, mSrcRect, mDstRect, null);
} else {
mSrcRect.set(0, 0, bw, bh);
mDstRect.set(xPos, yPos, xPos + w, yPos + h);
canvas.drawBitmap(b, mSrcRect, mDstRect, mPaint);
}
} else {
// If the thumbnail cannot be drawn, put up an error icon
// instead
Bitmap error = getErrorBitmap(image);
int width = error.getWidth();
int height = error.getHeight();
mSrcRect.set(0, 0, width, height);
int left = (w - width) / 2 + xPos;
int top = (w - height) / 2 + yPos;
mDstRect.set(left, top, left + width, top + height);
canvas.drawBitmap(error, mSrcRect, mDstRect, null);
}
if (ImageManager.isVideo(image)) {
Drawable overlay = null;
long size = Util.getImageFileSize(image);
if (size >= 0 && size <= mVideoSizeLimit) {
if (mVideoOverlay == null) {
mVideoOverlay = getResources().getDrawable(
R.drawable.ic_gallery_video_overlay);
}
overlay = mVideoOverlay;
} else {
if (mVideoMmsErrorOverlay == null) {
mVideoMmsErrorOverlay = getResources().getDrawable(
R.drawable.ic_error_mms_video_overlay);
}
overlay = mVideoMmsErrorOverlay;
Paint paint = new Paint();
paint.setARGB(0x80, 0x00, 0x00, 0x00);
canvas.drawRect(xPos, yPos, xPos + w, yPos + h, paint);
}
int width = overlay.getIntrinsicWidth();
int height = overlay.getIntrinsicHeight();
int left = (w - width) / 2 + xPos;
int top = (h - height) / 2 + yPos;
mSrcRect.set(left, top, left + width, top + height);
overlay.setBounds(mSrcRect);
overlay.draw(canvas);
}
}
public void drawDecoration(Canvas canvas, IImage image,
int xPos, int yPos, int w, int h) {
initializeMultiSelectDrawables();
if (mMultiSelected.contains(image)) {
Drawable checkBox = mMultiSelectTrue;
int width = checkBox.getIntrinsicWidth();
int height = checkBox.getIntrinsicHeight();
int left = 5 + xPos;
int top = h - height - 5 + yPos;
mSrcRect.set(left, top, left + width, top + height);
checkBox.setBounds(mSrcRect);
checkBox.draw(canvas);
}
}
private void initializeMultiSelectDrawables() {
if (mMultiSelectTrue == null) {
mMultiSelectTrue = getResources()
.getDrawable(R.drawable.btn_check_buttonless_on);
}
if (mMultiSelectFalse == null) {
mMultiSelectFalse = getResources()
.getDrawable(R.drawable.btn_check_buttonless_off);
}
}
private Bitmap mMissingImageThumbnailBitmap;
private Bitmap mMissingVideoThumbnailBitmap;
// Create this bitmap lazily, and only once for all the ImageBlocks to
// use
public Bitmap getErrorBitmap(IImage image) {
if (ImageManager.isImage(image)) {
if (mMissingImageThumbnailBitmap == null) {
mMissingImageThumbnailBitmap = BitmapFactory.decodeResource(
getResources(),
R.drawable.ic_missing_thumbnail_picture);
}
return mMissingImageThumbnailBitmap;
} else {
if (mMissingVideoThumbnailBitmap == null) {
mMissingVideoThumbnailBitmap = BitmapFactory.decodeResource(
getResources(), R.drawable.ic_missing_thumbnail_video);
}
return mMissingVideoThumbnailBitmap;
}
}
// private Animation mFooterAppear;
// private Animation mFooterDisappear;
// private void showFooter() {
// mFooterOrganizeView.setVisibility(View.VISIBLE);
// if (mFooterAppear == null) {
// mFooterAppear = AnimationUtils.loadAnimation(
// this, R.anim.footer_appear);
// }
// mFooterOrganizeView.startAnimation(mFooterAppear);
// }
// private void hideFooter() {
// if (mFooterOrganizeView.getVisibility() != View.GONE) {
// mFooterOrganizeView.setVisibility(View.GONE);
// if (mFooterDisappear == null) {
// mFooterDisappear = AnimationUtils.loadAnimation(
// this, R.anim.footer_disappear);
// }
// mFooterOrganizeView.startAnimation(mFooterDisappear);
// }
// }
// private String getShareMultipleMimeType() {
// final int FLAG_IMAGE = 1, FLAG_VIDEO = 2;
// int flag = 0;
// for (IImage image : mMultiSelected) {
// flag |= ImageManager.isImage(image) ? FLAG_IMAGE : FLAG_VIDEO;
// }
// return flag == FLAG_IMAGE
// ? "image/*"
// : flag == FLAG_VIDEO ? "video/*" : "*/*";
// }
// private void onShareMultipleClicked() {
// if (mMultiSelected == null) return;
// if (mMultiSelected.size() > 1) {
// Intent intent = new Intent();
// intent.setAction(Intent.ACTION_SEND_MULTIPLE);
// String mimeType = getShareMultipleMimeType();
// intent.setType(mimeType);
// ArrayList<Parcelable> list = Lists.newArrayList();
// for (IImage image : mMultiSelected) {
// list.add(image.fullSizeImageUri());
// }
// intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, list);
// try {
// startActivity(Intent.createChooser(
// intent, getText(R.string.send_media_files)));
// } catch (android.content.ActivityNotFoundException ex) {
// Toast.makeText(this, R.string.no_way_to_share,
// Toast.LENGTH_SHORT).show();
// }
// } else if (mMultiSelected.size() == 1) {
// IImage image = mMultiSelected.iterator().next();
// Intent intent = new Intent();
// intent.setAction(Intent.ACTION_SEND);
// String mimeType = image.getMimeType();
// intent.setType(mimeType);
// intent.putExtra(Intent.EXTRA_STREAM, image.fullSizeImageUri());
// boolean isImage = ImageManager.isImage(image);
// try {
// startActivity(Intent.createChooser(intent, getText(
// isImage ? R.string.sendImage : R.string.sendVideo)));
// } catch (android.content.ActivityNotFoundException ex) {
// Toast.makeText(this, isImage
// ? R.string.no_way_to_share_image
// : R.string.no_way_to_share_video,
// Toast.LENGTH_SHORT).show();
// }
// }
// }
// private void onDeleteMultipleClicked() {
// if (mMultiSelected == null) return;
// Runnable action = new Runnable() {
// public void run() {
// ArrayList<Uri> uriList = Lists.newArrayList();
// for (IImage image : mMultiSelected) {
// uriList.add(image.fullSizeImageUri());
// }
// closeMultiSelectMode();
// Intent intent = new Intent(MultipleImageSelectionActivity.this,
// DeleteImage.class);
// intent.putExtra("delete-uris", uriList);
// try {
// startActivity(intent);
// } catch (ActivityNotFoundException ex) {
// Log.e(TAG, "Delete images fail", ex);
// }
// }
// };
// MenuHelper.deleteMultiple(this, action);
// }
// private boolean isInMultiSelectMode() {
// return mMultiSelected != null;
// }
// private void closeMultiSelectMode() {
// if (mMultiSelected == null) return;
// mMultiSelected = null;
// mGvs.invalidate();
// hideFooter();
// }
}