|
@@ -0,0 +1,301 @@
|
|
|
+package com.netease.nim.uikit.session.activity;
|
|
|
+
|
|
|
+import android.content.ContentValues;
|
|
|
+import android.content.Context;
|
|
|
+import android.content.Intent;
|
|
|
+import android.graphics.Bitmap;
|
|
|
+import android.graphics.Color;
|
|
|
+import android.graphics.drawable.Drawable;
|
|
|
+import android.os.Bundle;
|
|
|
+import android.os.Handler;
|
|
|
+import android.provider.MediaStore;
|
|
|
+import android.support.v4.view.PagerAdapter;
|
|
|
+import android.support.v4.view.ViewCompat;
|
|
|
+import android.support.v4.view.ViewPager;
|
|
|
+import android.text.TextUtils;
|
|
|
+import android.util.Log;
|
|
|
+import android.view.LayoutInflater;
|
|
|
+import android.view.View;
|
|
|
+import android.view.ViewGroup;
|
|
|
+import android.view.WindowManager;
|
|
|
+import android.widget.AbsoluteLayout;
|
|
|
+import android.widget.Button;
|
|
|
+import android.widget.TextView;
|
|
|
+import android.widget.Toast;
|
|
|
+
|
|
|
+import com.bumptech.glide.Glide;
|
|
|
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
|
|
+import com.bumptech.glide.request.animation.GlideAnimation;
|
|
|
+import com.bumptech.glide.request.target.SimpleTarget;
|
|
|
+import com.netease.nim.uikit.R;
|
|
|
+import com.netease.nim.uikit.common.activity.UI;
|
|
|
+import com.netease.nim.uikit.common.ui.dialog.CustomAlertDialog;
|
|
|
+import com.netease.nim.uikit.common.ui.imageview.BaseZoomableImageView;
|
|
|
+import com.netease.nim.uikit.common.ui.imageview.ImageGestureListener;
|
|
|
+import com.netease.nim.uikit.common.util.C;
|
|
|
+import com.netease.nim.uikit.common.util.file.AttachmentStore;
|
|
|
+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.StorageUtil;
|
|
|
+import com.netease.nimlib.sdk.AbortableFuture;
|
|
|
+import com.netease.nimlib.sdk.NIMClient;
|
|
|
+import com.netease.nimlib.sdk.Observer;
|
|
|
+import com.netease.nimlib.sdk.msg.MsgService;
|
|
|
+import com.netease.nimlib.sdk.msg.MsgServiceObserve;
|
|
|
+import com.netease.nimlib.sdk.msg.attachment.ImageAttachment;
|
|
|
+import com.netease.nimlib.sdk.msg.constant.AttachStatusEnum;
|
|
|
+import com.netease.nimlib.sdk.msg.model.IMMessage;
|
|
|
+
|
|
|
+import java.io.Serializable;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by fenix on 2017/8/22.
|
|
|
+ */
|
|
|
+
|
|
|
+public class WatchPictureActivity extends UI {
|
|
|
+
|
|
|
+ private static final String INTENT_EXTRA_IMAGE = "INTENT_EXTRA_IMAGE";
|
|
|
+
|
|
|
+ private Handler handler;
|
|
|
+
|
|
|
+ private int firstDisplayImageIndex = 0;
|
|
|
+ private WatchPictureData data;
|
|
|
+
|
|
|
+ private boolean newPageSelected = false;
|
|
|
+
|
|
|
+ private View loadingLayout;
|
|
|
+ private BaseZoomableImageView image;
|
|
|
+ protected CustomAlertDialog alertDialog;
|
|
|
+ private ViewPager imageViewPager;
|
|
|
+ private PagerAdapter adapter;
|
|
|
+
|
|
|
+ private HashMap<String, Bitmap> thumbMap;
|
|
|
+ private HashMap<String, Bitmap> picMap;
|
|
|
+
|
|
|
+ private TextView textView;
|
|
|
+
|
|
|
+ public static void start(Context context, List<String> picPathList, List<String> thumbPathList, int firstIndex) {
|
|
|
+ Intent intent = new Intent();
|
|
|
+ WatchPictureData data = new WatchPictureData(picPathList, thumbPathList, firstIndex);
|
|
|
+ intent.putExtra(INTENT_EXTRA_IMAGE, data);
|
|
|
+ intent.setClass(context, WatchPictureActivity.class);
|
|
|
+ context.startActivity(intent);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCreate(Bundle savedInstatnceState){
|
|
|
+ super.onCreate(savedInstatnceState);
|
|
|
+ setContentView(R.layout.nim_watch_picture_activity);
|
|
|
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
|
|
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
|
+
|
|
|
+ this.data = (WatchPictureData) getIntent().getSerializableExtra(INTENT_EXTRA_IMAGE);
|
|
|
+ this.firstDisplayImageIndex = this.data.getFirstIndex();
|
|
|
+ findViews();
|
|
|
+ setViewPagerAdapter();
|
|
|
+
|
|
|
+ handler = new Handler();
|
|
|
+
|
|
|
+ thumbMap = new HashMap<String, Bitmap>();
|
|
|
+ picMap = new HashMap<String, Bitmap>();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onDestroy() {
|
|
|
+ imageViewPager.setAdapter(null);
|
|
|
+ super.onDestroy();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void findViews() {
|
|
|
+ alertDialog = new CustomAlertDialog(this);
|
|
|
+ loadingLayout = findViewById(R.id.loading_layout);
|
|
|
+
|
|
|
+ imageViewPager = (ViewPager) findViewById(R.id.view_pager_image);
|
|
|
+
|
|
|
+ textView = (TextView) findViewById(R.id.watch_picture_text);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setViewPagerAdapter() {
|
|
|
+ adapter = new PagerAdapter() {
|
|
|
+ @Override
|
|
|
+ public int getCount() {
|
|
|
+ return data == null ? 0 : data.size();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void notifyDataSetChanged() {
|
|
|
+ super.notifyDataSetChanged();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void destroyItem(ViewGroup container, int position, Object object) {
|
|
|
+ View layout = (View) object;
|
|
|
+ BaseZoomableImageView iv = (BaseZoomableImageView) layout.findViewById(R.id.watch_image_view);
|
|
|
+ iv.clear();
|
|
|
+ container.removeView(layout);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isViewFromObject(View view, Object object) {
|
|
|
+ return (view == object);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object instantiateItem(ViewGroup container, int position) {
|
|
|
+ ViewGroup layout;
|
|
|
+ layout = (ViewGroup) LayoutInflater.from(WatchPictureActivity.this).inflate(R.layout.image_layout_multi_touch, null);
|
|
|
+ layout.setBackgroundColor(Color.BLACK);
|
|
|
+
|
|
|
+ container.addView(layout);
|
|
|
+ layout.setTag(position);
|
|
|
+
|
|
|
+ if (position == firstDisplayImageIndex) {
|
|
|
+ onViewPagerSelected(position);
|
|
|
+ }
|
|
|
+
|
|
|
+ return layout;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int getItemPosition(Object object) {
|
|
|
+ return POSITION_NONE;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ imageViewPager.setAdapter(adapter);
|
|
|
+ imageViewPager.setOffscreenPageLimit(9);
|
|
|
+ imageViewPager.setCurrentItem(firstDisplayImageIndex);
|
|
|
+ imageViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
|
|
+ @Override
|
|
|
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
|
|
+ if (positionOffset == 0f && newPageSelected) {
|
|
|
+ newPageSelected = false;
|
|
|
+ onViewPagerSelected(position);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onPageSelected(int position) {
|
|
|
+ newPageSelected = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onPageScrollStateChanged(int state) {
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void onViewPagerSelected(int position) {
|
|
|
+ updateCurrentImageView(position);
|
|
|
+ onImageViewFound(image);
|
|
|
+ requestOriImage(data.getPics().get(position));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化每个view的image
|
|
|
+ protected void updateCurrentImageView(final int position) {
|
|
|
+ View currentLayout = imageViewPager.findViewWithTag(position);
|
|
|
+ if (currentLayout == null) {
|
|
|
+ ViewCompat.postOnAnimation(imageViewPager, new Runnable() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ updateCurrentImageView(position);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ };
|
|
|
+ image = (BaseZoomableImageView) currentLayout.findViewById(R.id.watch_image_view);
|
|
|
+ image.bitmapRecyclable = false;
|
|
|
+
|
|
|
+ textView.setText(""+(position+1)+"/"+data.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 若图片已下载,直接显示图片;若图片未下载,则下载图片
|
|
|
+ private void requestOriImage(final String path) {
|
|
|
+
|
|
|
+ Glide.with(this.getApplicationContext()).load(path).asBitmap().diskCacheStrategy(DiskCacheStrategy.ALL).into(new SimpleTarget<Bitmap>() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onLoadStarted(Drawable placeholder) {
|
|
|
+ loadingLayout.setVisibility(View.VISIBLE);
|
|
|
+ Log.d("onLoadStarted", path);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onLoadFailed(Exception e, Drawable errorDrawable) {
|
|
|
+ onDownloadFailed();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
|
|
|
+ Log.d("onResourceReady", path);
|
|
|
+ loadingLayout.setVisibility(View.GONE);
|
|
|
+ image.setImageBitmap(resource);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isOriginImageHasDownloaded(final String picPath) {
|
|
|
+ if (!TextUtils.isEmpty(picPath)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ******************************** 设置图片 *********************************
|
|
|
+ */
|
|
|
+
|
|
|
+ private int getImageResOnLoading() {
|
|
|
+ return R.drawable.nim_image_default;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int getImageResOnFailed() {
|
|
|
+ return R.drawable.nim_image_download_failed;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void onDownloadFailed() {
|
|
|
+ loadingLayout.setVisibility(View.GONE);
|
|
|
+ image.setImageBitmap(ImageUtil.getBitmapFromDrawableRes(getImageResOnFailed()));
|
|
|
+ Toast.makeText(this, R.string.download_picture_fail, Toast.LENGTH_LONG).show();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ***********************************图片点击事件*******************************************
|
|
|
+ */
|
|
|
+
|
|
|
+ // 设置图片点击事件
|
|
|
+ protected void onImageViewFound(BaseZoomableImageView imageView) {
|
|
|
+ imageView.setImageGestureListener(new ImageGestureListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onImageGestureSingleTapConfirmed() {
|
|
|
+ onImageViewTouched();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onImageGestureLongPress() {
|
|
|
+ //showWatchPictureAction();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onImageGestureFlingDown() {
|
|
|
+ finish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 图片单击
|
|
|
+ protected void onImageViewTouched() {
|
|
|
+ finish();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|