package net.dev123.yibo; import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import net.dev123.commons.util.FileUtil; import net.dev123.commons.util.StringUtil; import net.dev123.yibo.ImageViewerActivity.Mode; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.ImageUtil; import net.dev123.yibo.common.theme.ThemeUtil; import net.dev123.yibo.service.listener.ImageViewerSaveClickListener; import net.dev123.yibo.service.listener.SlideFinishOnGestureListener.SlideDirection; import net.dev123.yibo.widget.GifView; import net.dev123.yibo.widget.GifView.GifImageType; import net.dev123.yibo.widget.ImageViewTouchBase; import android.content.ContentResolver; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class ImageViewer4GifActivity extends BaseActivity { private static final String TAG = ImageViewer4GifActivity.class.getSimpleName(); private static final int RETRY_COUNT = 3; private boolean isGif; private boolean isFullScreen; private String imagePath; private GifView gifViewer; private boolean isInitialized; private ImageViewTouchBase ivImageViewer; private ImageView ivRotateLeft; private ImageView ivRotateRight; private ImageView ivZoomIn; private ImageView ivZoomOut; private Button btnOperate; private Mode mode = Mode.View; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.image_viewer); initComponent(); bindEvent(); if(Constants.DEBUG) { Log.d(TAG, "onCreate……"); } } private void initComponent() { LinearLayout llHeaderBase = (LinearLayout)findViewById(R.id.llHeaderBase); LinearLayout llToolbar = (LinearLayout)findViewById(R.id.llToolbar); ivRotateLeft = (ImageView) findViewById(R.id.ivRotateLeft); ivRotateRight = (ImageView) findViewById(R.id.ivRotateRight); ivZoomIn = (ImageView) findViewById(R.id.ivZoomIn); ivZoomOut = (ImageView) findViewById(R.id.ivZoomOut); ThemeUtil.setSecondaryImageHeader(llHeaderBase); llToolbar.setBackgroundDrawable(theme.getDrawable("bg_toolbar")); int padding8 = theme.dip2px(8); llToolbar.setPadding(padding8, padding8, padding8, padding8); ivRotateLeft.setBackgroundDrawable(theme.getDrawable("selector_btn_image_rotate_left")); ivRotateRight.setBackgroundDrawable(theme.getDrawable("selector_btn_image_rotate_right")); ivZoomIn.setBackgroundDrawable(theme.getDrawable("selector_btn_image_zoom_in")); ivZoomOut.setBackgroundDrawable(theme.getDrawable("selector_btn_image_zoom_out")); TextView tvTitle = (TextView) this.findViewById(R.id.tvTitle); tvTitle.setText(R.string.title_image_viewer); btnOperate = (Button) findViewById(R.id.btnOperate); ivImageViewer = (ImageViewTouchBase) findViewById(R.id.ivImageViewer); ivImageViewer.setRecycler(new ImageViewTouchBase.Recycler() { @Override public void recycle(Bitmap b) { if (!(b == null || b.isRecycled())) { if (Constants.DEBUG) { Log.d(TAG, "Recycle Bitmap : " + b); } b.recycle(); } } }); ivImageViewer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mode == Mode.View) { updateView(); } } }); } @Override protected void onResume() { super.onResume(); if(Constants.DEBUG) { Log.d(TAG, "onResume……"); } if (isInitialized) { if (isGif) { gifViewer.showAnimation(); } } else { initImageData(); } } private void initImageData() { if(Constants.DEBUG) { Log.d(TAG, "initImageData……"); } Uri uri = getIntent().getData(); if (uri != null) { if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { imagePath = uri.getPath(); } else { imagePath = uri.toString(); } mode = Mode.View; } else { imagePath = getIntent().getStringExtra("image-path"); try { mode = Mode.valueOf(getIntent().getStringExtra("mode")); } catch (Exception e) { if (Constants.DEBUG) { Log.d(TAG, e.getMessage(), e); } } } if (Constants.DEBUG) { Log.d(TAG, "Image Path : " + imagePath); } if (StringUtil.isEmpty(imagePath)) { onBackPressed(); return; } isGif = FileUtil.isGif(imagePath); if (isGif) { InputStream inputStream = getInputStreamFromFile(imagePath); if (inputStream == null) { onBackPressed(); return; } gifViewer = new GifView(this, ivImageViewer); gifViewer.setGifImageType(GifImageType.SYNC_DECODER); gifViewer.setGifImage(inputStream); gifViewer.showAnimation(); } else { uri = Uri.fromFile(new File(imagePath)); Bitmap bitmap = getBitmapFromUri(uri); if (bitmap == null) { onBackPressed(); return; } ivImageViewer.setImageBitmap(bitmap); } View.OnClickListener onClickListener = null; btnOperate.setVisibility(View.VISIBLE); if (mode == Mode.Edit) { btnOperate.setText(R.string.btn_delete); onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { setResult(Constants.RESULT_CODE_IMAGE_DELETED); finish(); } }; }else { btnOperate.setText(R.string.btn_save); onClickListener = new ImageViewerSaveClickListener(imagePath); } btnOperate.setOnClickListener(onClickListener); updateView(); isInitialized = true; } private InputStream getInputStreamFromFile(String path) { InputStream inputStream = null; try { inputStream = FileUtil.openInputStream(new File(imagePath)); inputStream = new BufferedInputStream(inputStream, 24576); // 24 * 1024 } catch (FileNotFoundException e) { try { int retryCount = 0; while (inputStream == null && retryCount < RETRY_COUNT) { if (Constants.DEBUG) { Log.d(TAG, "Reload Image: " + retryCount + " : " + path); } Thread.sleep(500); inputStream = FileUtil.openInputStream(new File(imagePath)); inputStream = new BufferedInputStream(inputStream, 24576); // 24 * 1024 retryCount ++; } } catch (Exception ee) { if (Constants.DEBUG) { Log.d(TAG, ee.getMessage(), ee); } } } catch (Exception e) { if (Constants.DEBUG) { Log.d(TAG, e.getMessage(), e); } } return inputStream; } private Bitmap getBitmapFromUri(Uri uri) { Bitmap bitmap = null; try { bitmap = ImageUtil.createBitmapFromUri(this, uri.toString(), 1600, 1600); } catch (FileNotFoundException e){ try { int retryCount = 0; while (bitmap == null && retryCount < RETRY_COUNT) { if (Constants.DEBUG) { Log.d(TAG, "Reload Image: " + retryCount + " : " + uri.toString()); } Thread.sleep(500); bitmap = ImageUtil.createBitmapFromUri(this, uri.toString(), 1600, 1600); retryCount ++; } } catch (Exception ee) { if (Constants.DEBUG) { Log.d(TAG, ee.getMessage(), ee); } } } catch (Exception e) { if (Constants.DEBUG) { Log.d(TAG, e.getMessage(), e); } } return bitmap; } private void updateView() { if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT && mode == Mode.View) { isFullScreen = !isFullScreen; } else { isFullScreen = false; } View llToolbar = findViewById(R.id.llToolbar); if (isFullScreen) { llToolbar.setVisibility(View.GONE); } else { llToolbar.setVisibility(View.VISIBLE); } } private void bindEvent() { Button back = (Button) this.findViewById(R.id.btnBack); back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); ivRotateLeft.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ivImageViewer == null) { return; } ivImageViewer.rotate(-90); } }); ivRotateRight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ivImageViewer == null) { return; } ivImageViewer.rotate(+90); } }); ivZoomIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ivImageViewer == null) { return; } ivImageViewer.zoomIn(); } }); ivZoomOut.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ivImageViewer == null) { return; } ivImageViewer.zoomOut(); } }); } @Override protected void onPause() { super.onPause(); if (gifViewer != null) { gifViewer.showCover(); } } @Override protected void onNewIntent(Intent intent) { if(Constants.DEBUG) { Log.d(TAG, "onNewIntent……"); } setIntent(intent); isInitialized = false; } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ivImageViewer != null && Math.abs(1 - ivImageViewer.getScale()) < 0.01F) { setSlideDirection(SlideDirection.RIGHT); } else { setSlideDirection(SlideDirection.NONE); } return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { if (ivImageViewer != null) { ivImageViewer.onTouchEvent(event); } return super.onTouchEvent(event); } @Override protected void onDestroy() { super.onDestroy(); recycle(); } private void recycle() { isFullScreen = false; isGif = false; mode = Mode.View; imagePath = null; if (ivImageViewer != null) { ivImageViewer.clear(); } if (gifViewer != null) { gifViewer.destroy(); gifViewer = null; } } @Override public void onBackPressed() { this.moveTaskToBack(true); recycle(); //this.finish(); } }