package com.lean56.andplug.image;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.ActivityNotFoundException;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
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.*;
import com.lean56.andplug.BaseApplication;
import com.lean56.andplug.R;
import com.lean56.andplug.activity.BaseActivity;
import com.lean56.andplug.common.RequestCodes;
import com.lean56.andplug.image.adapter.AllPhotoAdapter;
import com.lean56.andplug.image.adapter.FolderAdapter;
import com.lean56.andplug.image.adapter.GridPhotoAdapter;
import com.lean56.andplug.image.entity.ImageInfo;
import com.lean56.andplug.image.entity.ImageInfoExtra;
import java.util.ArrayList;
import java.util.LinkedHashMap;
/**
* PhotoPickActivity
* offers photo pick from camera and album
*
* @author Charles
*/
public class PhotoPickActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private final static String TAG = PhotoPickActivity.class.getSimpleName();
public static final String EXTRA_MAX = "EXTRA_MAX";
public static final String EXTRA_PICKED = "EXTRA_PICKED";
private static final String RESTORE_FILEURI = "fileUri";
protected ArrayList<ImageInfo> mPickData = new ArrayList<>();
private Uri fileUri;
private FolderAdapter mFolderAdapter;
private GridPhotoAdapter mPhotoAdapter;
private int mMaxPick = 1;
int mFolderId = 0;
/**
* if selected the first one
*/
protected boolean isAllPhotoMode() {
return mFolderId == 0;
}
// ui ref
MenuItem mSendMenu;
private TextView mFoldNameText;
private View mFoldSelectView;
private ListView mFoldList;
private GridView mPhotoGrid;
private TextView mPreviewText;
/**
* handle photo click
*/
GridView.OnItemClickListener mPhotoItemClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
return;
/* Intent intent = new Intent(PhotoPickActivity.this, PhotoPickDetailActivity.class);
intent.putExtra(PhotoPickDetailActivity.PICK_DATA, mPickData);
intent.putExtra(PhotoPickDetailActivity.EXTRA_MAX, mMaxPick);
String folderParam = "";
if (isAllPhotoMode()) {
// the first on is take photo from camera
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, RequestCodes.PHOTO_PICK_SELECTED);*/
}
};
/**
* handle folder click
*/
private ListView.OnItemClickListener mFolderItemClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mFolderAdapter.setSelect((int) id);
String folderName = mFolderAdapter.getSelect();
mFoldNameText.setText(folderName);
showFolderList(false);
if (mFolderId != position) {
getLoaderManager().destroyLoader(mFolderId);
mFolderId = position;
}
getLoaderManager().initLoader(mFolderId, null, PhotoPickActivity.this);
}
};
@Override
protected int getContentView() {
return R.layout.photo_pick;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// parse extra param
mMaxPick = getIntent().getIntExtra(EXTRA_MAX, 1);
Object extraPicked = getIntent().getSerializableExtra(EXTRA_PICKED);
if (extraPicked != null) {
mPickData = (ArrayList<ImageInfo>) extraPicked;
}
// init views
mPhotoGrid = (GridView) findViewById(R.id.gv_photo);
mFoldList = (ListView) findViewById(R.id.lv_fold);
mFoldSelectView = findViewById(R.id.layout_fold_select);
mFoldSelectView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleFolderSelect(v);
}
});
mFoldNameText = (TextView) findViewById(R.id.tv_fold_name);
mFoldNameText.setText(R.string.all_photos);
findViewById(R.id.view_select_fold).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleFolderSelect(v);
}
});
mPreviewText = (TextView) findViewById(R.id.tv_preview);
mPreviewText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//handlePreview(v);
}
});
// init data
initFolderList();
initPhotoList();
}
/**
* init all folders
*/
private void initFolderList() {
final String[] folderProjection = {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, folderProjection, "", 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(getString(R.string.all_photos), 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);
mFoldList.setAdapter(mFolderAdapter);
mFoldList.setOnItemClickListener(mFolderItemClick);
}
/**
* init all photos
*/
private void initPhotoList() {
getLoaderManager().initLoader(0, null, this);
}
// [+] LoaderManager.LoaderCallbacks
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String where = "";
if (!isAllPhotoMode()) {
String select = ((FolderAdapter) mFoldList.getAdapter()).getSelect();
where = String.format("%s='%s'", MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, select);
}
final String[] photoProjection = {MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.WIDTH,
MediaStore.Images.ImageColumns.HEIGHT
};
return new CursorLoader(this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, photoProjection, where, null, MediaStore.MediaColumns.DATE_ADDED + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (isAllPhotoMode()) {
mPhotoAdapter = new AllPhotoAdapter(this, data, false, this);
} else {
mPhotoAdapter = new GridPhotoAdapter(this, data, false, this);
}
mPhotoGrid.setAdapter(mPhotoAdapter);
mPhotoGrid.setOnItemClickListener(mPhotoItemClick);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mPhotoAdapter.swapCursor(null);
}
// [-] LoaderManager.LoaderCallbacks
/**
* handle folder select button and folder list click
*/
public void handleFolderSelect(View v) {
showFolderList(mFoldSelectView.getVisibility() != View.VISIBLE);
}
/**
* handle preview click
*/
public void handlePreview(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, RequestCodes.PHOTO_PICK_SELECTED);
}
/**
* show/hidden folder list
*/
private void showFolderList(boolean show) {
if (show) {
Animation animation = AnimationUtils.loadAnimation(this, R.anim.listview_up);
Animation fadeIn = AnimationUtils.loadAnimation(this, R.anim.listview_fade_in);
mFoldList.startAnimation(animation);
mFoldSelectView.startAnimation(fadeIn);
mFoldSelectView.setVisibility(View.VISIBLE);
} else {
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) {
mFoldSelectView.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
mFoldList.startAnimation(animation);
mFoldSelectView.startAnimation(fadeOut);
}
}
/**
* external call
*/
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) mFoldList.getAdapter()).notifyDataSetChanged();
updatePickCount();
}
/**
* external call
*/
public void camera() {
if(!mPickData.isEmpty()){
mPickData.remove(0);
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = CameraPhotoUtils.getOutputMediaFileUri();
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
try {
startActivityForResult(intent, RequestCodes.PHOTO_PICK_CAMERA);
} catch (ActivityNotFoundException e) {
BaseApplication.showToast(R.string.camera_exception);
}
}
// [+] OptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.photo_pick, menu);
mSendMenu = menu.getItem(0);
updatePickCount();
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_finish) {
send();
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
// [-] OptionsMenu
protected void send() {
if (mPickData.isEmpty()) {
setResult(Activity.RESULT_CANCELED);
} else {
Intent intent = new Intent();
intent.putExtra("data", mPickData);
setResult(Activity.RESULT_OK, intent);
}
finish();
}
@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 (resultCode == RESULT_OK) {
if (requestCode == RequestCodes.PHOTO_PICK_SELECTED) {
mPickData = (ArrayList<ImageInfo>) data.getSerializableExtra("data");
mPhotoAdapter.notifyDataSetChanged();
if (data.getBooleanExtra("send", false)) {
send();
}
} else if (requestCode == RequestCodes.PHOTO_PICK_CAMERA) {
mPickData.add(new ImageInfo(fileUri.toString()));
send();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
protected 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;
}
protected void removePicked(String path) {
for (int i = 0; i < mPickData.size(); ++i) {
if (mPickData.get(i).path.equals(path)) {
mPickData.remove(i);
return;
}
}
}
protected void updatePickCount() {
String format = "完成(%d/%d)";
mSendMenu.setTitle(String.format(format, mPickData.size(), mMaxPick));
String formatPreview = "预览(%d/%d)";
mPreviewText.setText(String.format(formatPreview, mPickData.size(), mMaxPick));
}
public static class GridViewCheckTag {
public View iconFore;
public CheckBox check;
public String path = "";
public GridViewCheckTag(View iconFore, CheckBox check) {
this.iconFore = iconFore;
this.check = check;
}
}
}