package net.coding.program.common.photopick;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.ActionBar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import net.coding.program.R;
import net.coding.program.common.ui.BaseActivity;
import net.coding.program.maopao.MaopaoAddActivity;
import java.util.ArrayList;
import java.util.LinkedHashMap;
public class PhotoPickActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<Cursor> {
public static final String EXTRA_MAX = "EXTRA_MAX";
public static final String EXTRA_PICKED = "EXTRA_PICKED"; // mPickData
private static final String RESTORE_FILEURI = "fileUri";
public static DisplayImageOptions optionsImage = new DisplayImageOptions
.Builder()
.showImageOnLoading(R.drawable.ic_default_image)
.showImageForEmptyUri(R.drawable.image_not_exist)
.showImageOnFail(R.drawable.image_not_exist)
.cacheInMemory(true)
.cacheOnDisk(false)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY)
.build();
final int RESULT_PICK = 20;
final int RESULT_CAMERA = 21;
private final String allPhotos = "所有图片";
private final String CameraItem = "CameraItem";
MenuItem mMenuItem;
int mFolderId = 0;
private int mMaxPick = MaopaoAddActivity.PHOTO_MAX_COUNT;
private LayoutInflater mInflater;
private TextView mFoldName;
private View mListViewGroup;
private ListView mListView;
// LinkedHashMap<String, ArrayList<ImageInfo>> mFolders = new LinkedHashMap();
// ArrayList<String> mFoldersName = new ArrayList<>();
View.OnClickListener mOnClickFoldName = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListViewGroup.getVisibility() == View.VISIBLE) {
hideFolderList();
} else {
showFolderList();
}
}
};
private GridView mGridView;
private TextView mPreView;
private ArrayList<ImageInfo> mPickData = new ArrayList<>();
private FolderAdapter mFolderAdapter;
GridView.OnItemClickListener mOnPhotoItemClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(PhotoPickActivity.this, PhotoPickDetailActivity.class);
intent.putExtra(PhotoPickDetailActivity.PICK_DATA, mPickData);
intent.putExtra(PhotoPickDetailActivity.EXTRA_MAX, mMaxPick);
String folderParam = "";
if (isAllPhotoMode()) {
// 第一个item是照相机
intent.putExtra(PhotoPickDetailActivity.PHOTO_BEGIN, position - 1);
} else {
intent.putExtra(PhotoPickDetailActivity.PHOTO_BEGIN, position);
folderParam = mFolderAdapter.getSelect();
}
intent.putExtra(PhotoPickDetailActivity.FOLDER_NAME, folderParam);
startActivityForResult(intent, RESULT_PICK);
}
};
private GridPhotoAdapter photoAdapter;
private String[] projection = {
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.WIDTH,
MediaStore.Images.ImageColumns.HEIGHT
};
private View.OnClickListener onClickPre = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPickData.size() == 0) {
return;
}
Intent intent = new Intent(PhotoPickActivity.this, PhotoPickDetailActivity.class);
intent.putExtra(PhotoPickDetailActivity.FOLDER_NAME, mFolderAdapter.getSelect());
intent.putExtra(PhotoPickDetailActivity.PICK_DATA, mPickData);
intent.putExtra(PhotoPickDetailActivity.ALL_DATA, mPickData);
intent.putExtra(PhotoPickDetailActivity.EXTRA_MAX, mMaxPick);
startActivityForResult(intent, RESULT_PICK);
}
};
private ListView.OnItemClickListener mOnItemClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mFolderAdapter.setSelect((int) id);
String folderName = mFolderAdapter.getSelect();
mFoldName.setText(folderName);
hideFolderList();
if (mFolderId != position) {
getLoaderManager().destroyLoader(mFolderId);
mFolderId = position;
}
getLoaderManager().initLoader(mFolderId, null, PhotoPickActivity.this);
}
};
private Uri fileUri;
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_pick);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("图片");
actionBar.setDisplayHomeAsUpEnabled(true);
mMaxPick = getIntent().getIntExtra(EXTRA_MAX, 6);
Object extraPicked = getIntent().getSerializableExtra(EXTRA_PICKED);
if (extraPicked != null) {
mPickData = (ArrayList<ImageInfo>) extraPicked;
}
mInflater = getLayoutInflater();
mGridView = (GridView) findViewById(R.id.gridView);
mListView = (ListView) findViewById(R.id.listView);
mListViewGroup = findViewById(R.id.listViewParent);
mListViewGroup.setOnClickListener(mOnClickFoldName);
mFoldName = (TextView) findViewById(R.id.foldName);
mFoldName.setText(allPhotos);
findViewById(R.id.selectFold).setOnClickListener(mOnClickFoldName);
mPreView = (TextView) findViewById(R.id.preView);
mPreView.setOnClickListener(onClickPre);
initListView1();
initListView2();
}
public int getmMaxPick() {
return mMaxPick;
}
public void clickPhotoItem(View v) {
GridViewCheckTag tag = (GridViewCheckTag) v.getTag();
if (((CheckBox) v).isChecked()) {
if (mPickData.size() >= mMaxPick) {
((CheckBox) v).setChecked(false);
String s = String.format("最多只能选择%d张", mMaxPick);
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
return;
}
addPicked(tag.path);
tag.iconFore.setVisibility(View.VISIBLE);
} else {
removePicked(tag.path);
tag.iconFore.setVisibility(View.INVISIBLE);
}
((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
updatePickCount();
}
private void initListView1() {
final String[] needInfos = {
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
};
LinkedHashMap<String, Integer> mNames = new LinkedHashMap<>();
LinkedHashMap<String, ImageInfo> mData = new LinkedHashMap<>();
Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, needInfos, "", null, MediaStore.MediaColumns.DATE_ADDED + " DESC");
while (cursor.moveToNext()) {
String name = cursor.getString(2);
if (!mNames.containsKey(name)) {
mNames.put(name, 1);
ImageInfo imageInfo = new ImageInfo(cursor.getString(1));
mData.put(name, imageInfo);
} else {
int newCount = mNames.get(name) + 1;
mNames.put(name, newCount);
}
}
ArrayList<ImageInfoExtra> mFolderData = new ArrayList<>();
if (cursor.moveToFirst()) {
ImageInfo imageInfo = new ImageInfo(cursor.getString(1));
int allImagesCount = cursor.getCount();
mFolderData.add(new ImageInfoExtra(allPhotos, imageInfo, allImagesCount));
}
for (String item : mNames.keySet()) {
ImageInfo info = mData.get(item);
Integer count = mNames.get(item);
mFolderData.add(new ImageInfoExtra(item, info, count));
}
cursor.close();
mFolderAdapter = new FolderAdapter(mFolderData);
mListView.setAdapter(mFolderAdapter);
mListView.setOnItemClickListener(mOnItemClick);
}
private void initListView2() {
getLoaderManager().initLoader(0, null, this);
}
private void showFolderList() {
Animation animation = AnimationUtils.loadAnimation(this, R.anim.listview_up);
Animation fadeIn = AnimationUtils.loadAnimation(this, R.anim.listview_fade_in);
mListView.startAnimation(animation);
mListViewGroup.startAnimation(fadeIn);
mListViewGroup.setVisibility(View.VISIBLE);
}
private void hideFolderList() {
Animation animation = AnimationUtils.loadAnimation(PhotoPickActivity.this, R.anim.listview_down);
Animation fadeOut = AnimationUtils.loadAnimation(PhotoPickActivity.this, R.anim.listview_fade_out);
fadeOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mListViewGroup.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mListView.startAnimation(animation);
mListViewGroup.startAnimation(fadeOut);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_photo_pick, menu);
mMenuItem = menu.getItem(0);
updatePickCount();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_finish) {
send();
return true;
} else if (id == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
private void send() {
if (mPickData.isEmpty()) {
setResult(Activity.RESULT_CANCELED);
} else {
Intent intent = new Intent();
intent.putExtra("data", mPickData);
setResult(Activity.RESULT_OK, intent);
}
finish();
}
public void camera() {
if (mPickData.size() >= mMaxPick) {
String s = String.format("最多只能选择%d张", mMaxPick);
Toast.makeText(PhotoPickActivity.this, s, Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = CameraPhotoUtil.getOutputMediaFileUri();
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, RESULT_CAMERA);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
fileUri = savedInstanceState.getParcelable(RESTORE_FILEURI);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (fileUri != null) {
outState.putParcelable(RESTORE_FILEURI, fileUri);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_PICK) {
if (resultCode == RESULT_OK) {
mPickData = (ArrayList<ImageInfo>) data.getSerializableExtra("data");
photoAdapter.notifyDataSetChanged();
boolean send = data.getBooleanExtra("send", false);
if (send) {
send();
}
}
} else if (requestCode == RESULT_CAMERA) {
if (resultCode == RESULT_OK) {
ImageInfo itme = new ImageInfo(fileUri.toString());
mPickData.add(itme);
send();
}
}
updatePickCount();
super.onActivityResult(requestCode, resultCode, data);
}
private void addPicked(String path) {
if (!isPicked(path)) {
mPickData.add(new ImageInfo(path));
}
}
public boolean isPicked(String path) {
for (ImageInfo item : mPickData) {
if (item.path.equals(path)) {
return true;
}
}
return false;
}
private void removePicked(String path) {
for (int i = 0; i < mPickData.size(); ++i) {
if (mPickData.get(i).path.equals(path)) {
mPickData.remove(i);
return;
}
}
}
private void updatePickCount() {
String format = "完成(%d/%d)";
mMenuItem.setTitle(String.format(format, mPickData.size(), mMaxPick));
String formatPreview = "预览(%d/%d)";
mPreView.setText(String.format(formatPreview, mPickData.size(), mMaxPick));
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String where;
if (!isAllPhotoMode()) {
String select = ((FolderAdapter) mListView.getAdapter()).getSelect();
where = String.format("%s='%s'",
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
select
);
} else {
where = "";
}
return new CursorLoader(
this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,
where,
null,
MediaStore.MediaColumns.DATE_ADDED + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (isAllPhotoMode()) {
photoAdapter = new AllPhotoAdapter(this, data, false, this);
} else {
photoAdapter = new GridPhotoAdapter(this, data, false, this);
}
mGridView.setAdapter(photoAdapter);
mGridView.setOnItemClickListener(mOnPhotoItemClick);
}
/*
* 选择了listview的第一个项,gridview的第一个是照相机
*/
private boolean isAllPhotoMode() {
return mFolderId == 0;
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
photoAdapter.swapCursor(null);
}
static class GridViewCheckTag {
View iconFore;
String path = "";
GridViewCheckTag(View iconFore) {
this.iconFore = iconFore;
}
}
}