package com.netease.nim.uikit.common.media.picker.activity;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
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.PickerPreviewPagerAdapter;
import com.netease.nim.uikit.common.media.picker.model.PhotoInfo;
import com.netease.nim.uikit.common.media.picker.model.PickerContract;
import com.netease.nim.uikit.common.media.picker.util.PickerUtil;
import com.netease.nim.uikit.common.ui.imageview.BaseZoomableImageView;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.media.ImageUtil;
import com.netease.nim.uikit.model.ToolBarOptions;
import com.netease.nim.uikit.session.constant.Extras;
import com.netease.nim.uikit.session.constant.RequestCode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class PickerAlbumPreviewActivity extends UI implements OnClickListener, OnPageChangeListener {
public static final int RESULT_FROM_USER = RESULT_FIRST_USER + 1;
public static void start(Activity activity, List<PhotoInfo> photos, int position, boolean supportOrig,
boolean isOrig, List<PhotoInfo> selectPhotoList, int mutiSelectLimitSize) {
Intent intent = PickerContract.makePreviewDataIntent(photos, selectPhotoList);
intent.setClass(activity, PickerAlbumPreviewActivity.class);
intent.putExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, position);
intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, supportOrig);
intent.putExtra(Extras.EXTRA_IS_ORIGINAL, isOrig);
intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, mutiSelectLimitSize);
activity.startActivityForResult(intent, RequestCode.PICKER_IMAGE_PREVIEW);
}
public static void start(Fragment fragment, List<PhotoInfo> photos, int position, boolean supportOrig,
boolean isOrig, List<PhotoInfo> selectPhotoList, int mutiSelectLimitSize) {
Intent intent = PickerContract.makePreviewDataIntent(photos, selectPhotoList);
intent.setClass(fragment.getActivity(), PickerAlbumPreviewActivity.class);
intent.putExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, position);
intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, supportOrig);
intent.putExtra(Extras.EXTRA_IS_ORIGINAL, isOrig);
intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, mutiSelectLimitSize);
fragment.startActivityForResult(intent, RequestCode.PICKER_IMAGE_PREVIEW);
}
private ViewPager imageViewPager;
private PickerPreviewPagerAdapter imageViewPagerAdapter;
private List<PhotoInfo> selectPhotoList = new ArrayList<PhotoInfo>();
private List<PhotoInfo> photoLists = new ArrayList<PhotoInfo>();
private int firstDisplayImageIndex = 0;
private int currentPosition = -1;
private int totalSize;
private BaseZoomableImageView currentImageView;
private int tempIndex = -1;
@SuppressWarnings("unused")
private LinearLayout previewOperationBar;
private ImageButton originalImage;
private boolean isSupportOriginal;
private boolean isSendOriginalImage;
private TextView originalImageSizeTip;
private TextView previewSendBtn;
private ImageButton previewSelectBtn;
private int mutiSelectLimitSize;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nim_picker_image_preview_activity);
ToolBarOptions options = new ToolBarOptions();
setToolBar(R.id.toolbar, options);
proceedExtras();
initActionBar();
initUI();
}
private void proceedExtras(){
Intent intent = getIntent();
isSupportOriginal = intent.getBooleanExtra(Extras.EXTRA_SUPPORT_ORIGINAL, false);
isSendOriginalImage = intent.getBooleanExtra(Extras.EXTRA_IS_ORIGINAL, false);
firstDisplayImageIndex = intent.getIntExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, 0);
mutiSelectLimitSize = intent.getIntExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, 9);
photoLists.addAll(PickerContract.getPhotos(intent));
totalSize = photoLists.size();
selectPhotoList.clear();
selectPhotoList.addAll(PickerContract.getSelectPhotos(intent));
}
private void initActionBar(){
previewSelectBtn = (ImageButton) findViewById(R.id.picker_image_preview_photos_select);
previewSelectBtn.setOnClickListener(this);
}
private void initUI(){
previewOperationBar = (LinearLayout) findViewById(R.id.picker_image_preview_operator_bar);
originalImage = (ImageButton) findViewById(R.id.picker_image_preview_orignal_image);
originalImage.setOnClickListener(this);
originalImageSizeTip = (TextView) findViewById(R.id.picker_image_preview_orignal_image_tip);
if(!isSupportOriginal){
originalImage.setVisibility(View.INVISIBLE);
originalImageSizeTip.setVisibility(View.INVISIBLE);
}
previewSendBtn = (TextView) findViewById(R.id.picker_image_preview_send);
previewSendBtn.setOnClickListener(this);
updateSelectBtnStatus();
updateOriImageSizeTip(isSendOriginalImage);
imageViewPager = (ViewPager) findViewById(R.id.picker_image_preview_viewpager);
imageViewPager.setOnPageChangeListener(this);
imageViewPager.setOffscreenPageLimit(2);
imageViewPagerAdapter = new PickerPreviewPagerAdapter(this, photoLists, getLayoutInflater(),
imageViewPager.getLayoutParams().width, imageViewPager.getLayoutParams().height, this);
imageViewPager.setAdapter(imageViewPagerAdapter);
setTitleIndex(firstDisplayImageIndex);
updateTitleSelect(firstDisplayImageIndex);
imageViewPager.setCurrentItem(firstDisplayImageIndex);
}
private void updateTitleSelect(int index){
if (photoLists == null || index >= photoLists.size())
return;
PhotoInfo photo = photoLists.get(index);
if(photo.isChoose()){
previewSelectBtn.setImageResource(R.drawable.nim_picker_image_selected);
}else{
previewSelectBtn.setImageResource(R.drawable.nim_picker_preview_unselected);
}
}
private void setTitleIndex(int index) {
if (totalSize <= 0) {
setTitle("");
}else {
index++;
setTitle(index + "/" + totalSize);
}
}
public void updateCurrentImageView(final int position) {
if (photoLists == null
|| (position > 0
&& position >= photoLists.size()))
return;
if (currentPosition == position) {
return;
} else {
currentPosition = 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(photoLists.get(position));
}
public void setImageView(PhotoInfo info) {
if (info == null) {
return;
}
if(info.getAbsolutePath() == null){
return;
}
Bitmap bitmap = BitmapDecoder.decodeSampledForDisplay(info.getAbsolutePath());
if (bitmap == null) {
currentImageView.setImageBitmap(ImageUtil.getDefaultBitmapWhenGetFail());
Toast.makeText(this, R.string.picker_image_error, Toast.LENGTH_LONG).show();
} else {
try{
bitmap = ImageUtil.rotateBitmapInNeeded(info.getAbsolutePath(), bitmap);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
currentImageView.setImageBitmap(bitmap);
}
}
private void restoreList() {
if (tempIndex != -1) {
imageViewPager.setAdapter(imageViewPagerAdapter);
setTitleIndex(tempIndex);
imageViewPager.setCurrentItem(tempIndex);
tempIndex = -1;
}
}
private void updateSelectBtnStatus(){
int selectSize = selectPhotoList.size();
if(selectSize > 0){
previewSendBtn.setEnabled(true);
previewSendBtn.setText(String.format(this.getResources().getString(
R.string.picker_image_send_select), selectSize));
}else{
previewSendBtn.setEnabled(true);
previewSendBtn.setText(R.string.picker_image_send);
}
}
private void updatePreviewSelectBtnStatus(boolean isChoose){
if(isChoose){
previewSelectBtn.setImageResource(R.drawable.nim_picker_image_selected);
}else{
previewSelectBtn.setImageResource(R.drawable.nim_picker_preview_unselected);
}
}
private void updateOriImageSizeTip(boolean isOri){
if(selectPhotoList == null)
return;
if(isOri){
long totalSize = 0;
for(int i = 0; i < selectPhotoList.size(); i++){
PhotoInfo pi = selectPhotoList.get(i);
totalSize += pi.getSize();
}
originalImageSizeTip.setText(String.format(this.getResources().getString(
R.string.picker_image_preview_original_select), PickerUtil.getFileSizeString(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 boolean checkSelectPhoto(PhotoInfo photo){
boolean isSelect = false;
for(int i = 0; i < selectPhotoList.size(); i++){
PhotoInfo select = selectPhotoList.get(i);
if(select.getImageId() == photo.getImageId()){
isSelect = true;
break;
}
}
return isSelect;
}
private void removeSelectPhoto(PhotoInfo photo){
Iterator<PhotoInfo> lIterator = selectPhotoList.iterator();
while (lIterator.hasNext()) {
PhotoInfo select = lIterator.next();
if(select.getImageId() == photo.getImageId()) {
lIterator.remove();
}
}
}
@Override
public void onResume() {
// restore the data source
restoreList();
super.onResume();
}
@Override
public void onPause() {
// save the data source and recycle all bitmaps
imageViewPager.setAdapter(null);
tempIndex = currentPosition;
currentPosition = -1;
super.onPause();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.picker_image_preview_photos_select) {
if (photoLists == null || currentPosition >= photoLists.size())
return;
PhotoInfo selectPhoto = photoLists.get(currentPosition);
boolean isChoose = selectPhoto.isChoose();
if (selectPhotoList != null && selectPhotoList.size() >= mutiSelectLimitSize && !isChoose) {
Toast.makeText(this, String.format(getResources().getString(R.string.picker_image_exceed_max_image_select)
, mutiSelectLimitSize), Toast.LENGTH_SHORT).show();
return;
}
selectPhoto.setChoose(!isChoose);
updatePreviewSelectBtnStatus(!isChoose);
// check
if (!isChoose) {
boolean isSelect = checkSelectPhoto(selectPhoto);
if (!isSelect) {
selectPhotoList.add(selectPhoto);
}
} else {
removeSelectPhoto(selectPhoto);
}
// update bottom bar
updateSelectBtnStatus();
// 如果没有选择,则自动取消原图发送
if (selectPhotoList.size() == 0 && isSendOriginalImage) {
isSendOriginalImage = false;
}
updateOriImageSizeTip(isSendOriginalImage);
} else if (v.getId() == R.id.picker_image_preview_send) {
if (selectPhotoList != null && selectPhotoList.size() == 0) { // 没有选择,点击发送则发送当前图片
PhotoInfo current = photoLists.get(currentPosition);
current.setChoose(true);
selectPhotoList.add(current);
}
setResult(RESULT_OK, PickerContract.makeDataIntent(selectPhotoList, isSendOriginalImage));
finish();
} else if (v.getId() == R.id.picker_image_preview_orignal_image) {
if (!isSendOriginalImage) {
isSendOriginalImage = true;
// 如果已选图片小于mutiSelectLimitSize,点击发送原图,自动选择当前页面
int selectSize = selectPhotoList != null ? selectPhotoList.size() : 0;
if (selectSize < mutiSelectLimitSize) {
PhotoInfo cur = photoLists.get(currentPosition);
if (!cur.isChoose()) {
cur.setChoose(true);
selectPhotoList.add(cur);
updateSelectBtnStatus();
updatePreviewSelectBtnStatus(true);
}
}
} else {
isSendOriginalImage = false;
}
updateOriImageSizeTip(isSendOriginalImage);
}
}
@Override
public void onBackPressed(){
setResult(RESULT_FROM_USER, PickerContract.makePreviewDataIntent(photoLists, selectPhotoList,
isSendOriginalImage));
finish();
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
setTitleIndex(arg0);
updateTitleSelect(arg0);
}
}