/**
* Copyright 2016 bingoogolapple
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.bingoogolapple.photopicker.activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.File;
import java.util.ArrayList;
import cn.bingoogolapple.androidcommon.adapter.BGAOnNoDoubleClickListener;
import cn.bingoogolapple.photopicker.R;
import cn.bingoogolapple.photopicker.adapter.BGAPhotoPageAdapter;
import cn.bingoogolapple.photopicker.imageloader.BGAImage;
import cn.bingoogolapple.photopicker.imageloader.BGAImageLoader;
import cn.bingoogolapple.photopicker.util.BGAAsyncTask;
import cn.bingoogolapple.photopicker.util.BGAPhotoPickerUtil;
import cn.bingoogolapple.photopicker.util.BGASavePhotoTask;
import cn.bingoogolapple.photopicker.widget.BGAHackyViewPager;
import uk.co.senab.photoview.PhotoViewAttacher;
/**
* 作者:王浩 邮件:bingoogolapple@gmail.com
* 创建时间:16/6/24 下午2:59
* 描述:图片预览界面
*/
public class BGAPhotoPreviewActivity extends BGAPPToolbarActivity implements PhotoViewAttacher.OnViewTapListener, BGAAsyncTask.Callback<Void> {
private static final String EXTRA_SAVE_IMG_DIR = "EXTRA_SAVE_IMG_DIR";
private static final String EXTRA_PREVIEW_IMAGES = "EXTRA_PREVIEW_IMAGES";
private static final String EXTRA_CURRENT_POSITION = "EXTRA_CURRENT_POSITION";
private static final String EXTRA_IS_SINGLE_PREVIEW = "EXTRA_IS_SINGLE_PREVIEW";
private static final String EXTRA_PHOTO_PATH = "EXTRA_PHOTO_PATH";
private TextView mTitleTv;
private ImageView mDownloadIv;
private BGAHackyViewPager mContentHvp;
private BGAPhotoPageAdapter mPhotoPageAdapter;
private boolean mIsSinglePreview;
private File mSaveImgDir;
private boolean mIsHidden = false;
private BGASavePhotoTask mSavePhotoTask;
/**
* 上一次标题栏显示或隐藏的时间戳
*/
private long mLastShowHiddenTime;
/**
* 获取查看多张图片的intent
*
* @param context
* @param saveImgDir 保存图片的目录,如果传null,则没有保存图片功能
* @param previewImages 当前预览的图片目录里的图片路径集合
* @param currentPosition 当前预览图片的位置
* @return
*/
public static Intent newIntent(Context context, File saveImgDir, ArrayList<String> previewImages, int currentPosition) {
Intent intent = new Intent(context, BGAPhotoPreviewActivity.class);
intent.putExtra(EXTRA_SAVE_IMG_DIR, saveImgDir);
intent.putStringArrayListExtra(EXTRA_PREVIEW_IMAGES, previewImages);
intent.putExtra(EXTRA_CURRENT_POSITION, currentPosition);
intent.putExtra(EXTRA_IS_SINGLE_PREVIEW, false);
return intent;
}
/**
* 获取查看单张图片的intent
*
* @param context
* @param saveImgDir 保存图片的目录,如果传null,则没有保存图片功能
* @param photoPath 图片路径
* @return
*/
public static Intent newIntent(Context context, File saveImgDir, String photoPath) {
Intent intent = new Intent(context, BGAPhotoPreviewActivity.class);
intent.putExtra(EXTRA_SAVE_IMG_DIR, saveImgDir);
intent.putExtra(EXTRA_PHOTO_PATH, photoPath);
intent.putExtra(EXTRA_CURRENT_POSITION, 0);
intent.putExtra(EXTRA_IS_SINGLE_PREVIEW, true);
return intent;
}
@Override
protected void initView(Bundle savedInstanceState) {
setNoLinearContentView(R.layout.bga_pp_activity_photo_preview);
mContentHvp = getViewById(R.id.hvp_photo_preview_content);
}
@Override
protected void setListener() {
mContentHvp.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
renderTitleTv();
}
});
}
@Override
protected void processLogic(Bundle savedInstanceState) {
mSaveImgDir = (File) getIntent().getSerializableExtra(EXTRA_SAVE_IMG_DIR);
if (mSaveImgDir != null && !mSaveImgDir.exists()) {
mSaveImgDir.mkdirs();
}
ArrayList<String> previewImages = getIntent().getStringArrayListExtra(EXTRA_PREVIEW_IMAGES);
mIsSinglePreview = getIntent().getBooleanExtra(EXTRA_IS_SINGLE_PREVIEW, false);
if (mIsSinglePreview) {
previewImages = new ArrayList<>();
previewImages.add(getIntent().getStringExtra(EXTRA_PHOTO_PATH));
}
int currentPosition = getIntent().getIntExtra(EXTRA_CURRENT_POSITION, 0);
mPhotoPageAdapter = new BGAPhotoPageAdapter(this, this, previewImages);
mContentHvp.setAdapter(mPhotoPageAdapter);
mContentHvp.setCurrentItem(currentPosition);
// 过2秒隐藏标题栏
mToolbar.postDelayed(new Runnable() {
@Override
public void run() {
hiddenTitleBar();
}
}, 2000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.bga_pp_menu_photo_preview, menu);
MenuItem menuItem = menu.findItem(R.id.item_photo_preview_title);
View actionView = menuItem.getActionView();
mTitleTv = (TextView) actionView.findViewById(R.id.tv_photo_preview_title);
mDownloadIv = (ImageView) actionView.findViewById(R.id.iv_photo_preview_download);
mDownloadIv.setOnClickListener(new BGAOnNoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
if (mSavePhotoTask == null) {
savePic();
}
}
});
if (mSaveImgDir == null) {
mDownloadIv.setVisibility(View.INVISIBLE);
}
renderTitleTv();
return true;
}
private void renderTitleTv() {
if (mTitleTv == null || mPhotoPageAdapter == null) {
return;
}
if (mIsSinglePreview) {
mTitleTv.setText(R.string.bga_pp_view_photo);
} else {
mTitleTv.setText((mContentHvp.getCurrentItem() + 1) + "/" + mPhotoPageAdapter.getCount());
}
}
@Override
public void onViewTap(View view, float x, float y) {
if (System.currentTimeMillis() - mLastShowHiddenTime > 500) {
mLastShowHiddenTime = System.currentTimeMillis();
if (mIsHidden) {
showTitleBar();
} else {
hiddenTitleBar();
}
}
}
private void showTitleBar() {
if (mToolbar != null) {
ViewCompat.animate(mToolbar).translationY(0).setInterpolator(new DecelerateInterpolator(2)).setListener(new ViewPropertyAnimatorListenerAdapter() {
@Override
public void onAnimationEnd(View view) {
mIsHidden = false;
}
}).start();
}
}
private void hiddenTitleBar() {
if (mToolbar != null) {
ViewCompat.animate(mToolbar).translationY(-mToolbar.getHeight()).setInterpolator(new DecelerateInterpolator(2)).setListener(new ViewPropertyAnimatorListenerAdapter() {
@Override
public void onAnimationEnd(View view) {
mIsHidden = true;
}
}).start();
}
}
private synchronized void savePic() {
if (mSavePhotoTask != null) {
return;
}
final String url = mPhotoPageAdapter.getItem(mContentHvp.getCurrentItem());
File file;
if (url.startsWith("file")) {
file = new File(url.replace("file://", ""));
if (file.exists()) {
BGAPhotoPickerUtil.showSafe(getString(R.string.bga_pp_save_img_success_folder, file.getParentFile().getAbsolutePath()));
return;
}
}
// 通过MD5加密url生成文件名,避免多次保存同一张图片
file = new File(mSaveImgDir, BGAPhotoPickerUtil.md5(url) + ".png");
if (file.exists()) {
BGAPhotoPickerUtil.showSafe(getString(R.string.bga_pp_save_img_success_folder, mSaveImgDir.getAbsolutePath()));
return;
}
mSavePhotoTask = new BGASavePhotoTask(this, this, file);
BGAImage.download(url, new BGAImageLoader.DownloadDelegate() {
@Override
public void onSuccess(String url, Bitmap bitmap) {
mSavePhotoTask.setBitmapAndPerform(bitmap);
}
@Override
public void onFailed(String url) {
mSavePhotoTask = null;
BGAPhotoPickerUtil.show(R.string.bga_pp_save_img_failure);
}
});
}
@Override
public void onPostExecute(Void aVoid) {
mSavePhotoTask = null;
}
@Override
public void onTaskCancelled() {
mSavePhotoTask = null;
}
@Override
protected void onDestroy() {
if (mSavePhotoTask != null) {
mSavePhotoTask.cancelTask();
mSavePhotoTask = null;
}
super.onDestroy();
}
}