package org.qii.weiciyuan.support.gallery; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.MessageBean; import org.qii.weiciyuan.support.asyncdrawable.TaskCache; import org.qii.weiciyuan.support.file.FileDownloaderHttpHelper; import org.qii.weiciyuan.support.file.FileLocationMethod; import org.qii.weiciyuan.support.file.FileManager; import org.qii.weiciyuan.support.imageutility.ImageUtility; import org.qii.weiciyuan.support.lib.CircleProgressView; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.settinghelper.SettingUtility; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.SmileyPickerUtility; import org.qii.weiciyuan.support.utils.Utility; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.app.Activity; import android.app.AlertDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.webkit.WebView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import uk.co.senab.photoview.PhotoView; import uk.co.senab.photoview.PhotoViewAttacher; /** * User: qii * Date: 13-7-28 */ @Deprecated public class GalleryActivity extends Activity { private static final int IMAGEVIEW_SOFT_LAYER_MAX_WIDTH = 2000; private static final int IMAGEVIEW_SOFT_LAYER_MAX_HEIGHT = 3000; private static final int STATUS_BAR_HEIGHT_DP_UNIT = 25; private static final int NAVIGATION_BAR_HEIGHT_DP_UNIT = 48; private static final String CURRENT_VISIBLE_PAGE = "currentPage"; private ArrayList<String> urls = new ArrayList<String>(); private TextView position; private HashMap<String, PicSimpleBitmapWorkerTask> taskMap = new HashMap<String, PicSimpleBitmapWorkerTask>(); private PicSaveTask saveTask; private ViewPager pager; private HashSet<ViewGroup> unRecycledViews = new HashSet<ViewGroup>(); private boolean alreadyShowPicturesTooLargeHint = false; private ImageView animationView; private View currentViewPositionLayout; private Rect rect; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.galleryactivity_layout); animationView = (ImageView) findViewById(R.id.animation); currentViewPositionLayout = findViewById(R.id.position_layout); position = (TextView) findViewById(R.id.position); TextView sum = (TextView) findViewById(R.id.sum); // rect = ((AnimationRect) getIntent().getParcelableArrayListExtra("rect")).scaledBitmapRect; MessageBean msg = getIntent().getParcelableExtra("msg"); ArrayList<String> tmp = msg.getThumbnailPicUrls(); for (int i = 0; i < tmp.size(); i++) { urls.add(tmp.get(i).replace("thumbnail", "large")); } sum.setText(String.valueOf(urls.size())); //jump to new gallery animation activity if (urls.size() < 10 && ImageUtility.isThisBitmapCanRead( FileManager.getFilePathFromUrl(urls.get(0), FileLocationMethod.picture_large)) ) { Intent intent = new Intent(this, GalleryAnimationActivity.class); intent.putExtra("msg", getIntent().getParcelableExtra("msg")); intent.putExtra("rect", getIntent().getParcelableArrayListExtra("rect")); intent.putExtra("position", getIntent().getIntExtra("position", 0)); startActivity(intent); overridePendingTransition(0, 0); finish(); return; } pager = (ViewPager) findViewById(R.id.pager); pager.setAdapter(new ImagePagerAdapter()); pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); GalleryActivity.this.position.setText(String.valueOf(position + 1)); } }); pager.setCurrentItem(getIntent().getIntExtra("position", 0)); pager.setOffscreenPageLimit(1); pager.setPageTransformer(true, new ZoomOutPageTransformer()); pager.setPadding(0, Utility.dip2px(STATUS_BAR_HEIGHT_DP_UNIT), 0, 0); } @Override public void onBackPressed() { if (rect == null || urls.size() > 1) { super.onBackPressed(); return; } View view = pager.findViewWithTag(CURRENT_VISIBLE_PAGE); final PhotoView imageView = (PhotoView) view.findViewById(R.id.image); if (imageView == null || (!(imageView.getDrawable() instanceof BitmapDrawable))) { super.onBackPressed(); return; } animateClose(imageView); } @Override protected void onDestroy() { super.onDestroy(); for (String url : urls) { MyAsyncTask task = taskMap.get(url); if (task != null) { task.cancel(true); } } if (pager != null && unRecycledViews != null) { Utility.recycleViewGroupAndChildViews(pager, true); for (ViewGroup viewGroup : unRecycledViews) { Utility.recycleViewGroupAndChildViews(viewGroup, true); } System.gc(); } } private void animateClose(PhotoView imageView) { currentViewPositionLayout.setVisibility(View.INVISIBLE); animationView.setImageDrawable(imageView.getDrawable()); pager.setVisibility(View.INVISIBLE); final Rect startBounds = rect; final Rect finalBounds = new Rect(); final Point globalOffset = new Point(); animationView.getGlobalVisibleRect(finalBounds, globalOffset); startBounds.offset(-globalOffset.x, -globalOffset.y); finalBounds.offset(-globalOffset.x, -globalOffset.y); float startScale; if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds.width() / startBounds.height()) { // Extend start bounds horizontally startScale = (float) startBounds.height() / finalBounds.height(); float startWidth = startScale * finalBounds.width(); float deltaWidth = (startWidth - startBounds.width()) / 2; startBounds.left -= deltaWidth; startBounds.right += deltaWidth; } else { // Extend start bounds vertically startScale = (float) startBounds.width() / finalBounds.width(); float startHeight = startScale * finalBounds.height(); float deltaHeight = (startHeight - startBounds.height()) / 2; startBounds.top -= deltaHeight; startBounds.bottom += deltaHeight; } animationView.setPivotX(0f); animationView.setPivotY(0f); final float startScaleFinal = startScale; animationView.animate().setInterpolator(new DecelerateInterpolator()).x(startBounds.left) .y(startBounds.top).scaleY(startScaleFinal).scaleX(startScaleFinal).setDuration(300) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); GalleryActivity.this.finish(); overridePendingTransition(0, 0); } }).start(); } @Override public void onSaveInstanceState(Bundle outState) { } private class ImagePagerAdapter extends PagerAdapter { private LayoutInflater inflater; public ImagePagerAdapter() { inflater = getLayoutInflater(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { if (object instanceof ViewGroup) { ((ViewPager) container).removeView((View) object); unRecycledViews.remove(object); ViewGroup viewGroup = (ViewGroup) object; Utility.recycleViewGroupAndChildViews(viewGroup, true); } // ((ViewPager) container).removeView((View) object); } @Override public int getCount() { return urls.size(); } @Override public Object instantiateItem(ViewGroup view, int position) { View contentView = inflater.inflate(R.layout.galleryactivity_item, view, false); handlePage(position, contentView, true); ((ViewPager) view).addView(contentView, 0); unRecycledViews.add((ViewGroup) contentView); return contentView; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); View contentView = (View) object; if (contentView == null) { return; } contentView.setTag(CURRENT_VISIBLE_PAGE); if (SettingUtility.allowClickToCloseGallery()) { contentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } ImageView imageView = (ImageView) contentView.findViewById(R.id.image); if (imageView.getDrawable() != null) { return; } handlePage(position, contentView, false); } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } } private void handlePage(int position, View contentView, boolean fromInstantiateItem) { final PhotoView imageView = (PhotoView) contentView.findViewById(R.id.image); imageView.setVisibility(View.INVISIBLE); if (SettingUtility.allowClickToCloseGallery()) { imageView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float x, float y) { if (rect == null || imageView == null || (!(imageView.getDrawable() instanceof BitmapDrawable))) { GalleryActivity.this.finish(); return; } animateClose(imageView); } }); } WebView gif = (WebView) contentView.findViewById(R.id.gif); gif.setBackgroundColor(getResources().getColor(R.color.transparent)); gif.setVisibility(View.INVISIBLE); WebView large = (WebView) contentView.findViewById(R.id.large); large.setBackgroundColor(getResources().getColor(R.color.transparent)); large.setVisibility(View.INVISIBLE); large.setOverScrollMode(View.OVER_SCROLL_NEVER); if (Utility.doThisDeviceOwnNavigationBar(GalleryActivity.this)) { imageView.setPadding(0, 0, 0, Utility.dip2px(NAVIGATION_BAR_HEIGHT_DP_UNIT)); //webview has a bug, padding is ignored gif.setPadding(0, 0, 0, Utility.dip2px(NAVIGATION_BAR_HEIGHT_DP_UNIT)); large.setPadding(0, 0, 0, Utility.dip2px(NAVIGATION_BAR_HEIGHT_DP_UNIT)); } TextView wait = (TextView) contentView.findViewById(R.id.wait); TextView readError = (TextView) contentView.findViewById(R.id.error); String path = FileManager .getFilePathFromUrl(urls.get(position), FileLocationMethod.picture_large); boolean shouldDownLoadPicture = !fromInstantiateItem || (fromInstantiateItem && Utility .isWifi(GalleryActivity.this)); //sometime picture is not downloaded completely, but android already can read it.... if (ImageUtility.isThisBitmapCanRead(path) && taskMap.get(urls.get(position)) == null && TaskCache.isThisUrlTaskFinished(urls.get(position))) { wait.setVisibility(View.INVISIBLE); readPicture(imageView, gif, large, readError, urls.get(position), path); } else if (shouldDownLoadPicture) { final CircleProgressView spinner = (CircleProgressView) contentView .findViewById(R.id.loading); spinner.setVisibility(View.VISIBLE); if (taskMap.get(urls.get(position)) == null) { wait.setVisibility(View.VISIBLE); PicSimpleBitmapWorkerTask task = new PicSimpleBitmapWorkerTask(imageView, gif, large, spinner, wait, readError, urls.get(position), taskMap); taskMap.put(urls.get(position), task); task.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } else { PicSimpleBitmapWorkerTask task = taskMap.get(urls.get(position)); task.setWidget(imageView, gif, spinner, wait, readError); } } } private class PicSimpleBitmapWorkerTask extends MyAsyncTask<String, Integer, String> { private FileDownloaderHttpHelper.DownloadListener downloadListener = new FileDownloaderHttpHelper.DownloadListener() { @Override public void pushProgress(int progress, int max) { publishProgress(progress, max); } }; public void setWidget(ImageView iv, WebView gif, CircleProgressView spinner, TextView wait, TextView readError) { this.iv = iv; this.spinner = spinner; this.wait = wait; this.readError = readError; this.gif = gif; } private ImageView iv; private WebView gif; private WebView large; private TextView wait; private String url; private CircleProgressView spinner; private TextView readError; private HashMap<String, PicSimpleBitmapWorkerTask> taskMap; public PicSimpleBitmapWorkerTask(ImageView iv, WebView gif, WebView large, CircleProgressView spinner, TextView wait, TextView readError, String url, HashMap<String, PicSimpleBitmapWorkerTask> taskMap) { this.iv = iv; this.url = url; this.spinner = spinner; this.readError = readError; this.taskMap = taskMap; this.gif = gif; this.large = large; this.wait = wait; this.readError.setVisibility(View.INVISIBLE); this.spinner.setVisibility(View.VISIBLE); } @Override protected String doInBackground(String... dd) { if (isCancelled()) { return null; } // boolean downloaded = TaskCache.waitForMsgDetailPictureDownload(url, downloadListener); // if (downloaded) { // return FileManager.getFilePathFromUrl(url, FileLocationMethod.picture_large); // } else { return null; // } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); this.wait.setVisibility(View.INVISIBLE); int progress = values[0]; int max = values[1]; spinner.setMax(max); spinner.setProgress(progress); } @Override protected void onCancelled(String s) { super.onCancelled(s); taskMap.remove(url); this.spinner.setVisibility(View.INVISIBLE); this.wait.setVisibility(View.INVISIBLE); } @Override protected void onPostExecute(final String bitmapPath) { this.spinner.setVisibility(View.INVISIBLE); this.wait.setVisibility(View.INVISIBLE); if (isCancelled()) { return; } taskMap.remove(url); if (TextUtils.isEmpty(bitmapPath) || iv == null) { readError.setVisibility(View.VISIBLE); readError.setText(getString(R.string.picture_cant_download_or_sd_cant_read)); return; } else { readError.setVisibility(View.INVISIBLE); } if (!ImageUtility.isThisBitmapCanRead(bitmapPath)) { Toast.makeText(GalleryActivity.this, R.string.download_finished_but_cant_read_picture_file, Toast.LENGTH_SHORT) .show(); } readPicture(iv, gif, large, readError, url, bitmapPath); } } private void readPicture(final ImageView imageView, WebView gif, WebView large, final TextView readError, final String url, final String bitmapPath) { if (bitmapPath.endsWith(".gif")) { readGif(gif, large, readError, url, bitmapPath); return; } if (!ImageUtility.isThisBitmapCanRead(bitmapPath)) { Toast.makeText(GalleryActivity.this, R.string.download_finished_but_cant_read_picture_file, Toast.LENGTH_SHORT) .show(); } boolean isThisBitmapTooLarge = ImageUtility.isThisBitmapTooLargeToRead(bitmapPath); if (isThisBitmapTooLarge && !alreadyShowPicturesTooLargeHint) { // Toast.makeText(GalleryActivity.this, // R.string.picture_is_too_large_so_enable_software_layer, Toast.LENGTH_LONG) // .show(); alreadyShowPicturesTooLargeHint = true; } if (isThisBitmapTooLarge) { readLarge(large, url, bitmapPath); return; } //ImageView already have bitmap, ignore it if (imageView.getDrawable() != null) { return; } new MyAsyncTask<Void, Bitmap, Bitmap>() { //todo //when I finish new ImageView in the future, I will refactor these code.... @Override protected Bitmap doInBackground(Void... params) { Bitmap bitmap = null; try { bitmap = ImageUtility .decodeBitmapFromSDCard(bitmapPath, IMAGEVIEW_SOFT_LAYER_MAX_WIDTH, IMAGEVIEW_SOFT_LAYER_MAX_HEIGHT); } catch (OutOfMemoryError ignored) { GlobalContext.getInstance().getBitmapCache().evictAll(); try { bitmap = ImageUtility .decodeBitmapFromSDCard(bitmapPath, IMAGEVIEW_SOFT_LAYER_MAX_WIDTH, IMAGEVIEW_SOFT_LAYER_MAX_HEIGHT); } catch (OutOfMemoryError ignoredToo) { } } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (imageView.getDrawable() != null) { return; } if (bitmap != null) { imageView.setVisibility(View.VISIBLE); imageView.setImageBitmap(bitmap); bindImageViewLongClickListener(imageView, url, bitmapPath); readError.setVisibility(View.INVISIBLE); } else { readError.setText(getString(R.string.picture_read_failed)); imageView.setVisibility(View.INVISIBLE); readError.setVisibility(View.VISIBLE); } } }.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } private void readGif(WebView webView, WebView large, TextView readError, String url, String bitmapPath) { readError.setVisibility(View.INVISIBLE); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(bitmapPath, options); int picWidth = options.outWidth; int picHeight = options.outHeight; int availableWidth = Utility.getScreenWidth() - getResources().getDimensionPixelOffset(R.dimen.normal_gif_webview_margin_left) - getResources().getDimensionPixelOffset(R.dimen.normal_gif_webview_margin_right); int availableHeight = SmileyPickerUtility.getAppHeight(GalleryActivity.this); int maxPossibleResizeHeight = availableWidth * availableHeight / picWidth; if (picWidth >= availableWidth || picHeight >= availableHeight || maxPossibleResizeHeight >= availableHeight) { readLarge(large, url, bitmapPath); return; } webView.setVisibility(View.VISIBLE); bindImageViewLongClickListener(((View) webView.getParent()), url, bitmapPath); if (webView.getTag() != null) { return; } webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setBuiltInZoomControls(false); webView.getSettings().setDisplayZoomControls(false); webView.getSettings().setSupportZoom(false); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false); File file = new File(bitmapPath); String str1 = "file://" + file.getAbsolutePath().replace("/mnt/sdcard/", "/sdcard/"); String str2 = "<html>\n<head>\n <style>\n html,body{background:transparent;margin:0;padding:0;} *{-webkit-tap-highlight-color:rgba(0, 0, 0, 0);}\n </style>\n <script type=\"text/javascript\">\n var imgUrl = \"" + str1 + "\";" + " var objImage = new Image();\n" + " var realWidth = 0;\n" + " var realHeight = 0;\n" + "\n" + " function onLoad() {\n" + " objImage.onload = function() {\n" + " realWidth = objImage.width;\n" + " realHeight = objImage.height;\n" + "\n" + " document.gagImg.src = imgUrl;\n" + " onResize();\n" + " }\n" + " objImage.src = imgUrl;\n" + " }\n" + "\n" + " function onResize() {\n" + " var scale = 1;\n" + " var newWidth = document.gagImg.width;\n" + " if (realWidth > newWidth) {\n" + " scale = realWidth / newWidth;\n" + " } else {\n" + " scale = newWidth / realWidth;\n" + " }\n" + "\n" + " hiddenHeight = Math.ceil(30 * scale);\n" + " document.getElementById('hiddenBar').style.height = hiddenHeight + \"px\";\n" + " document.getElementById('hiddenBar').style.marginTop = -hiddenHeight + \"px\";\n" + " }\n" + " </script>\n" + "</head>\n" + "<body onload=\"onLoad()\" onresize=\"onResize()\" onclick=\"Android.toggleOverlayDisplay();\">\n" + " <table style=\"width: 100%;height:100%;\">\n" + " <tr style=\"width: 100%;\">\n" + " <td valign=\"middle\" align=\"center\" style=\"width: 100%;\">\n" + " <div style=\"display:block\">\n" + " <img name=\"gagImg\" src=\"\" width=\"100%\" style=\"\" />\n" + " </div>\n" + " <div id=\"hiddenBar\" style=\"position:absolute; width: 100%; background: transparent;\"></div>\n" + " </td>\n" + " </tr>\n" + " </table>\n" + "</body>\n" + "</html>"; webView.loadDataWithBaseURL("file:///android_asset/", str2, "text/html", "utf-8", null); webView.setTag(new Object()); } private void readLarge(WebView large, String url, String bitmapPath) { large.setVisibility(View.VISIBLE); bindImageViewLongClickListener(large, url, bitmapPath); if (SettingUtility.allowClickToCloseGallery()) { large.setOnTouchListener(largeOnTouchListener); } if (large.getTag() != null) { return; } large.getSettings().setJavaScriptEnabled(true); large.getSettings().setUseWideViewPort(true); large.getSettings().setLoadWithOverviewMode(true); large.getSettings().setBuiltInZoomControls(true); large.getSettings().setDisplayZoomControls(false); large.setVerticalScrollBarEnabled(false); large.setHorizontalScrollBarEnabled(false); File file = new File(bitmapPath); String str1 = "file://" + file.getAbsolutePath().replace("/mnt/sdcard/", "/sdcard/"); String str2 = "<html>\n<head>\n <style>\n html,body{background:transparent;margin:0;padding:0;} *{-webkit-tap-highlight-color:rgba(0, 0, 0, 0);}\n </style>\n <script type=\"text/javascript\">\n var imgUrl = \"" + str1 + "\";" + " var objImage = new Image();\n" + " var realWidth = 0;\n" + " var realHeight = 0;\n" + "\n" + " function onLoad() {\n" + " objImage.onload = function() {\n" + " realWidth = objImage.width;\n" + " realHeight = objImage.height;\n" + "\n" + " document.gagImg.src = imgUrl;\n" + " onResize();\n" + " }\n" + " objImage.src = imgUrl;\n" + " }\n" + "\n" + " function onResize() {\n" + " var scale = 1;\n" + " var newWidth = document.gagImg.width;\n" + " if (realWidth > newWidth) {\n" + " scale = realWidth / newWidth;\n" + " } else {\n" + " scale = newWidth / realWidth;\n" + " }\n" + "\n" + " hiddenHeight = Math.ceil(30 * scale);\n" + " document.getElementById('hiddenBar').style.height = hiddenHeight + \"px\";\n" + " document.getElementById('hiddenBar').style.marginTop = -hiddenHeight + \"px\";\n" + " }\n" + " </script>\n" + "</head>\n" + "<body onload=\"onLoad()\" onresize=\"onResize()\" onclick=\"Android.toggleOverlayDisplay();\">\n" + " <table style=\"width: 100%;height:100%;\">\n" + " <tr style=\"width: 100%;\">\n" + " <td valign=\"middle\" align=\"center\" style=\"width: 100%;\">\n" + " <div style=\"display:block\">\n" + " <img name=\"gagImg\" src=\"\" width=\"100%\" style=\"\" />\n" + " </div>\n" + " <div id=\"hiddenBar\" style=\"position:absolute; width: 100%; background: transparent;\"></div>\n" + " </td>\n" + " </tr>\n" + " </table>\n" + "</body>\n" + "</html>"; large.loadDataWithBaseURL("file:///android_asset/", str2, "text/html", "utf-8", null); large.setVisibility(View.VISIBLE); large.setTag(new Object()); } private View.OnTouchListener largeOnTouchListener = new View.OnTouchListener() { boolean mPressed; boolean mClose; CheckForSinglePress mPendingCheckForSinglePress; long lastTime = 0; float[] location = new float[2]; class CheckForSinglePress implements Runnable { View view; public CheckForSinglePress(View view) { this.view = view; } public void run() { if (!mPressed && mClose) { Utility.playClickSound(view); finish(); } } } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mPendingCheckForSinglePress = new CheckForSinglePress(v); mPressed = true; if (System.currentTimeMillis() - lastTime > ViewConfiguration.getDoubleTapTimeout() + 100) { mClose = true; new Handler().postDelayed(mPendingCheckForSinglePress, ViewConfiguration.getDoubleTapTimeout() + 100); } else { mClose = false; } lastTime = System.currentTimeMillis(); location[0] = event.getRawX(); location[1] = event.getRawY(); break; case MotionEvent.ACTION_UP: mPressed = false; break; case MotionEvent.ACTION_CANCEL: mClose = false; break; case MotionEvent.ACTION_MOVE: float x = event.getRawX(); float y = event.getRawY(); if (Math.abs(location[0] - x) > 5.0f && Math.abs(location[1] - y) > 5.0f) { mClose = false; } break; } return false; } }; private void bindImageViewLongClickListener(View view, final String url, final String filePath) { view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { String[] values = {getString(R.string.copy_link_to_clipboard), getString(R.string.share), getString(R.string.save_pic_album)}; new AlertDialog.Builder(GalleryActivity.this) .setItems(values, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: ClipboardManager cm = (ClipboardManager) getSystemService( Context.CLIPBOARD_SERVICE); cm.setPrimaryClip(ClipData.newPlainText("sinaweibo", url)); Toast.makeText(GalleryActivity.this, getString(R.string.copy_successfully), Toast.LENGTH_SHORT).show(); break; case 1: Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setType("image/jpeg"); if (!TextUtils.isEmpty(filePath)) { Uri uri = Uri.fromFile(new File(filePath)); sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); if (Utility.isIntentSafe(GalleryActivity.this, sharingIntent)) { startActivity(Intent.createChooser(sharingIntent, getString(R.string.share))); } } break; case 2: saveBitmapToPictureDir(filePath); break; } } }).show(); return true; } }); } private void saveBitmapToPictureDir(String filePath) { if (Utility.isTaskStopped(saveTask)) { saveTask = new PicSaveTask(filePath); saveTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } private class PicSaveTask extends MyAsyncTask<Void, Boolean, Boolean> { String path; public PicSaveTask(String path) { this.path = path; } @Override protected Boolean doInBackground(Void... params) { return FileManager.saveToPicDir(path); } @Override protected void onPostExecute(Boolean value) { super.onPostExecute(value); if (value) { Toast.makeText(GalleryActivity.this, getString(R.string.save_to_album_successfully), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(GalleryActivity.this, getString(R.string.cant_save_pic), Toast.LENGTH_SHORT).show(); } } } }