package com.gzsll.hupu.ui.gallery; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.MediaStore; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.ListPopupWindow; import android.widget.TextView; import android.widget.Toast; import com.gzsll.hupu.R; import com.gzsll.hupu.bean.Folder; import com.gzsll.hupu.bean.Image; import com.gzsll.hupu.ui.BaseSwipeBackActivity; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * Created by sll on 2016/3/9. * TODO 待重构 */ public class GalleryActivity extends BaseSwipeBackActivity implements GalleryContract.View, ImageAdapter.OnImageItemClickListener, AdapterView.OnItemClickListener { public static void startActivity(Activity mActivity, ArrayList<String> selectImages) { Intent intent = new Intent(mActivity, GalleryActivity.class); intent.putExtra("selectImages", selectImages); mActivity.startActivityForResult(intent, REQUEST_IMAGE); } @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.recyclerView) RecyclerView recyclerView; @BindView(R.id.tvFolder) TextView tvFolder; @BindView(R.id.btCommit) Button btCommit; @Inject GalleryPresenter mPresenter; @Inject ImageAdapter mImageAdapter; @Inject FolderAdapter mFolderAdapter; public static final int REQUEST_IMAGE = 101; public static final String EXTRA_RESULT = "select_result"; private static final int MAX = 5; // 结果数据 private ArrayList<String> resultList = new ArrayList<String>(); private ListPopupWindow mFolderPopupWindow; @Override public int initContentView() { return R.layout.activity_gallery; } @Override public void initInjector() { DaggerGalleryComponent.builder() .applicationComponent(getApplicationComponent()) .activityModule(getActivityModule()) .build() .inject(this); } @Override public void initUiAndListener() { ButterKnife.bind(this); mPresenter.attachView(this); setTitle("图库"); initToolBar(toolbar); ArrayList<String> selectImages = getIntent().getStringArrayListExtra("selectImages"); if (selectImages != null && selectImages.size() > 0) { resultList = selectImages; btCommit.setText(String.format("完成( %d/%d )", resultList.size(), MAX)); } GridLayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 4); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(mImageAdapter); recyclerView.setItemAnimator(new DefaultItemAnimator()); mImageAdapter.setOnImageItemClickListener(this); createPopupFolderList(); } private void createPopupFolderList() { mFolderPopupWindow = new ListPopupWindow(this); mFolderPopupWindow.setAdapter(mFolderAdapter); mFolderPopupWindow.setContentWidth(ListPopupWindow.MATCH_PARENT); mFolderPopupWindow.setWidth(ListPopupWindow.MATCH_PARENT); mFolderPopupWindow.setHeight(ListPopupWindow.MATCH_PARENT); mFolderPopupWindow.setAnchorView(toolbar); mFolderPopupWindow.setModal(true); mFolderPopupWindow.setAnimationStyle(R.style.popwindow_anim_style); mFolderPopupWindow.setOnItemClickListener(this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter.onImageAndFolderReceive(); } @Override protected boolean isApplyStatusBarTranslucency() { return true; } @Override protected boolean isApplyStatusBarColor() { return true; } @Override public void renderFolders(List<Folder> folders) { mFolderAdapter.bind(folders); } @Override public void renderImages(List<Image> images) { mImageAdapter.bind(images); if (resultList != null && resultList.size() > 0) { mImageAdapter.setDefaultSelected(resultList); } } @Override public void click(Image image, ImageView view) { if (image != null) { if (resultList.contains(image.path)) { resultList.remove(image.path); if (resultList.size() != 0) { btCommit.setText(String.format("完成( %d/%d )", resultList.size(), MAX)); } else { btCommit.setText("完成"); } } else { // 判断选择数量问题 if (MAX == resultList.size()) { Toast.makeText(this, String.format("最多选择 %d 张图片哦", MAX), Toast.LENGTH_SHORT).show(); return; } resultList.add(image.path); btCommit.setText(String.format("完成( %d/%d )", resultList.size(), MAX)); } mImageAdapter.select(image, view); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mFolderAdapter.setSelectIndex(position); final int index = position; final AdapterView v = parent; new Handler().postDelayed(new Runnable() { @Override public void run() { mFolderPopupWindow.dismiss(); if (index == 0) { mPresenter.onImageAndFolderReceive(); tvFolder.setText("最近照片"); } else { Folder folder = (Folder) v.getAdapter().getItem(index); if (null != folder) { mImageAdapter.bind(folder.images); tvFolder.setText(folder.name); // 设定默认选择 if (resultList != null && resultList.size() > 0) { mImageAdapter.setDefaultSelected(resultList); } } } // 滑动到最初始位置 recyclerView.smoothScrollToPosition(0); } }, 100); } @OnClick(R.id.tvFolder) void setTvFolderClick() { if (mFolderPopupWindow.isShowing()) { mFolderPopupWindow.dismiss(); } else { mFolderPopupWindow.show(); int index = mFolderAdapter.getSelectIndex(); index = index == 0 ? index : index - 1; mFolderPopupWindow.getListView().setSelection(index); } } @OnClick(R.id.btCommit) void setBtCommitClick() { if (resultList != null && resultList.size() > 0) { // 返回已选择的图片数据 Intent data = new Intent(); data.putStringArrayListExtra(EXTRA_RESULT, resultList); setResult(RESULT_OK, data); finish(); } } private String mTmpFilePath; // 请求加载系统照相机 private static final int REQUEST_CAMERA = 100; @OnClick(R.id.rlCamera) void setRlCameraClick() { // 跳转到系统照相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (cameraIntent.resolveActivity(getPackageManager()) != null) { // 设置系统相机拍照后的输出路径 // 创建临时文件 mTmpFilePath = createTmpFile(); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mTmpFilePath))); startActivityForResult(cameraIntent, REQUEST_CAMERA); } else { Toast.makeText(this, "没有系统相机", Toast.LENGTH_SHORT).show(); } } public String createTmpFile() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // 已挂载 File pic = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); if (!pic.exists()) { pic.mkdirs(); } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); String fileName = "tui_" + timeStamp + ""; return pic.getAbsolutePath() + File.separator + fileName + ".jpg"; } else { File cacheDir = getCacheDir(); String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); String fileName = "tui_" + timeStamp + ""; return cacheDir + File.separator + fileName + ".jpg"; } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mTmpFilePath = savedInstanceState.getString("mTmpFilePath"); resultList = savedInstanceState.getStringArrayList("resultList"); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("mTmpFilePath", mTmpFilePath); outState.putStringArrayList("resultList", resultList); super.onSaveInstanceState(outState); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 相机拍照完成后,返回图片路径 if (requestCode == REQUEST_CAMERA) { if (resultCode == Activity.RESULT_OK) { if (!TextUtils.isEmpty(mTmpFilePath)) { resultList.add(mTmpFilePath); Intent intent = new Intent(); intent.putStringArrayListExtra(EXTRA_RESULT, resultList); setResult(RESULT_OK, intent); finish(); } } else { File mTmpFile = new File(mTmpFilePath); if (mTmpFile.exists()) { mTmpFile.delete(); } } } } @Override protected void onDestroy() { super.onDestroy(); mPresenter.detachView(); } }