package com.netease.nim.uikit.common.media.picker.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.activity.UI; import com.netease.nim.uikit.common.media.picker.adapter.ImagePagerAdapterInImageSwitch; import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialog; import com.netease.nim.uikit.common.ui.imageview.BaseZoomableImageView; import com.netease.nim.uikit.common.util.file.AttachmentStore; import com.netease.nim.uikit.common.util.file.FileUtil; import com.netease.nim.uikit.common.util.media.BitmapDecoder; import com.netease.nim.uikit.common.util.media.ImageUtil; import com.netease.nim.uikit.common.util.storage.StorageType; import com.netease.nim.uikit.common.util.storage.StorageUtil; import com.netease.nim.uikit.session.constant.Extras; import com.netease.nim.uikit.session.constant.RequestCode; import java.io.File; import java.util.ArrayList; public class PreviewImageFromLocalActivity extends UI { private boolean needShowSendOriginal = false; private ImageButton originalImage; private boolean isSendOriginalImage; private TextView originalImageSizeTip; private File imageFile; private ArrayList<String> selectImageList; private ArrayList<String> origImageList; protected ViewPager imageViewPager; private ImagePagerAdapterInImageSwitch imageViewPagerAdapter; protected BaseZoomableImageView currentImageView; protected int currentPostion = -1; private int tempIndex = -1; private View sendButton; public static Intent initPreviewImageIntent( ArrayList<String> thumbnailImageList, ArrayList<String> orignialImageList, boolean isOrignial ) { Intent intent = new Intent(); intent.putStringArrayListExtra(Extras.EXTRA_SCALED_IMAGE_LIST, thumbnailImageList); intent.putStringArrayListExtra(Extras.EXTRA_ORIG_IMAGE_LIST, orignialImageList); intent.putExtra(Extras.EXTRA_IS_ORIGINAL, isOrignial); return intent; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nim_preview_image_from_local_activity); originalImageSizeTip = (TextView) findViewById(R.id.picker_image_preview_orignal_image_tip); originalImage = (ImageButton) findViewById(R.id.picker_image_preview_orignal_image); originalImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isSendOriginalImage = !isSendOriginalImage; updateOriImageSizeTip(isSendOriginalImage); } }); needShowSendOriginal = getIntent().getBooleanExtra(Extras.EXTRA_NEED_SHOW_SEND_ORIGINAL, false); if (needShowSendOriginal) { originalImage.setVisibility(View.VISIBLE); originalImageSizeTip.setVisibility(View.VISIBLE); } else { originalImage.setVisibility(View.INVISIBLE); originalImageSizeTip.setVisibility(View.INVISIBLE); } sendButton = findViewById(R.id.buttonSend); sendButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isSendOriginalImage) { sendOrigImage(); } else { sendSelectedImage(false); } } }); initViewPager(); } private void restoreList() { if (tempIndex != -1) { imageViewPager.setAdapter(imageViewPagerAdapter); setTitleIndex(tempIndex); imageViewPager.setCurrentItem(tempIndex); tempIndex = -1; } } private void setTitleIndex(int index) { if (selectImageList.size() <= 0) { setTitle(""); } else { index++; setTitle(index + "/" + selectImageList.size()); } } private void sendSelectedImage(boolean isOrig) { Intent intent = initPreviewImageIntent(selectImageList, origImageList, isOrig); intent.setClass(PreviewImageFromLocalActivity.this, getIntent().getClass()); setResult(RESULT_OK, intent); PreviewImageFromLocalActivity.this.finish(); } @SuppressLint("NewApi") private void sendOrigImage() { final UI activity = PreviewImageFromLocalActivity.this; final EasyAlertDialog allAlertDialog = new EasyAlertDialog(activity); allAlertDialog.setTitle(getString(R.string.picker_image_preview_original)); long fileSize = 0; for (String filepath : origImageList) { fileSize += AttachmentStore.getFileLength(filepath); } if (origImageList.size() == 1) { allAlertDialog.setMessage(getString(R.string.image_compressed_size, FileUtil.formatFileSize(fileSize)) + getString(R.string.is_send_image)); } else { allAlertDialog.setMessage(getString(R.string.multi_image_compressed_size, FileUtil.formatFileSize(fileSize)) + getString(R.string.is_send_multi_image)); } allAlertDialog.addPositiveButton(getString(R.string.ok), EasyAlertDialog.NO_TEXT_COLOR, EasyAlertDialog.NO_TEXT_SIZE, new OnClickListener() { @Override public void onClick(View view) { sendSelectedImage(true); } }); allAlertDialog.addNegativeButton(getString(R.string.cancel), EasyAlertDialog.NO_TEXT_COLOR, EasyAlertDialog.NO_TEXT_SIZE, new OnClickListener() { @Override public void onClick(View view) { allAlertDialog.dismiss(); } }); if (!activity.isDestroyedCompatible()) { allAlertDialog.show(); } } private void updateOriImageSizeTip(boolean isOrig){ if(origImageList == null) return; if(isOrig){ long totalSize = 0; for (String filepath : origImageList) { totalSize += AttachmentStore.getFileLength(filepath); } originalImageSizeTip.setText(String.format(this.getResources().getString( R.string.picker_image_preview_original_select), FileUtil.formatFileSize(totalSize))); originalImage.setImageResource(R.drawable.nim_picker_orignal_checked); }else{ originalImageSizeTip.setText(R.string.picker_image_preview_original); originalImage.setImageResource(R.drawable.nim_picker_orignal_normal); } } /** * 初始化图片查看 */ private void initViewPager() { imageViewPager = (ViewPager) findViewById(R.id.viewPagerImage); imageViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { setTitleIndex(arg0); } }); imageViewPager.setOffscreenPageLimit(2); String imageFilePath = getIntent().getExtras().getString("ImageFilePath"); String origImageFilePath = getIntent().getExtras().getString("OrigImageFilePath"); imageFile = new File(imageFilePath); selectImageList = new ArrayList<String>(); selectImageList.add(imageFilePath); origImageList = new ArrayList<String>(); origImageList.add(origImageFilePath); imageViewPagerAdapter = new ImagePagerAdapterInImageSwitch(this, selectImageList, getLayoutInflater(), imageViewPager.getLayoutParams().width, imageViewPager.getLayoutParams().height, this); imageViewPager.setAdapter(imageViewPagerAdapter); } @Override public void onBackPressed() { deleteTempFiles(); Intent intent = new Intent(); intent.setClass(PreviewImageFromLocalActivity.this, getIntent().getClass()); setResult(RESULT_CANCELED, intent); PreviewImageFromLocalActivity.this.finish(); } @Override public void onResume() { // restore the data source restoreList(); super.onResume(); } @Override public void onPause() { // recycleBitmap(previewImageView); // save the data source and recycle all bitmaps imageViewPager.setAdapter(null); tempIndex = currentPostion; currentPostion = -1; super.onPause(); } /** * 获取本地图片 */ protected void choosePictureFromLocal() { if (!StorageUtil.hasEnoughSpaceForWrite(PreviewImageFromLocalActivity.this, StorageType.TYPE_IMAGE, true)) { return; } new AsyncTask<String, Integer, Boolean>() { @Override protected void onPreExecute() { Toast.makeText(PreviewImageFromLocalActivity.this, R.string.waitfor_image_local, Toast.LENGTH_LONG).show(); } @Override protected Boolean doInBackground(String... params) { return true; } @Override protected void onPostExecute(Boolean result) { int from = PickImageActivity.FROM_LOCAL; Activity thiz = PreviewImageFromLocalActivity.this; PickImageActivity.start(thiz, RequestCode.GET_LOCAL_IMAGE, from, ""); } }.execute(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_CANCELED) { if (requestCode == RequestCode.GET_LOCAL_IMAGE) { onGetLocalPictureResult(requestCode, resultCode, data); } } else { if (selectImageList.size() == 0) { sendButton.setEnabled(false); } } } public void onGetLocalPictureResult(int requestCode, int resultCode, final Intent data) { if (data == null) { return; } final String photoPath = data.getStringExtra(Extras.EXTRA_FILE_PATH); if (TextUtils.isEmpty(photoPath)) { return; } imageFile = new File(photoPath); String mimeType = FileUtil.getExtensionName(photoPath); imageFile = ImageUtil.getScaledImageFileWithMD5(imageFile, mimeType); if (imageFile == null) { Toast.makeText(this, R.string.picker_image_error, Toast.LENGTH_LONG).show(); return; } else { ImageUtil.makeThumbnail(PreviewImageFromLocalActivity.this, imageFile); } origImageList.add(photoPath); selectImageList.add(imageFile.getAbsolutePath()); imageViewPagerAdapter.notifyDataSetChanged(); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { imageViewPager.setCurrentItem(selectImageList.size() - 1); } }, 100); //有可用的图片 if(selectImageList.size() >= 1){ sendButton.setEnabled(true); } } public void updateCurrentImageView(final int position) { if (selectImageList == null || (position > 0 && position >= selectImageList.size())) return; if (currentPostion == position) { return; } else { currentPostion = position; } setTitleIndex(position); // LinearLayout currentLayout = (LinearLayout) // imageViewPager.getChildAt(position); LinearLayout currentLayout = (LinearLayout) imageViewPager.findViewWithTag(position); if (currentLayout == null) { Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { updateCurrentImageView(position); } }, 300); return; } currentImageView = (BaseZoomableImageView) currentLayout.findViewById(R.id.imageView); currentImageView.setViewPager(imageViewPager); setImageView(selectImageList.get(position)); } public void setImageView(String imageFilePath) { if (imageFilePath == null) { return; } Bitmap bitmap = BitmapDecoder.decodeSampledForDisplay(imageFilePath); if (bitmap == null) { currentImageView.setImageBitmap(ImageUtil.getDefaultBitmapWhenGetFail()); Toast.makeText(this, R.string.picker_image_error, Toast.LENGTH_LONG).show(); } else { currentImageView.setImageBitmap(bitmap); } } private void deleteTempFiles() { for (String file : selectImageList) { new File(file).delete(); } } }