package com.ody.photopicker.fragment;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.ListPopupWindow;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;
import com.ody.photopicker.PhotoPickerActivity;
import com.ody.photopicker.R;
import com.ody.photopicker.adapter.PhotoGridAdapter;
import com.ody.photopicker.adapter.PopupDirectoryListAdapter;
import com.ody.photopicker.entity.Photo;
import com.ody.photopicker.entity.PhotoDirectory;
import com.ody.photopicker.event.OnPhotoClickListener;
import com.ody.photopicker.utils.ImageCaptureManager;
import com.ody.photopicker.utils.MediaStoreHelper;
import com.ody.photopicker.utils.PermissionsConstant;
import com.ody.photopicker.utils.PermissionsUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static android.app.Activity.RESULT_OK;
import static com.ody.photopicker.PhotoPicker.DEFAULT_COLUMN_NUMBER;
import static com.ody.photopicker.PhotoPicker.EXTRA_PREVIEW_ENABLED;
import static com.ody.photopicker.PhotoPicker.EXTRA_SHOW_GIF;
import static com.ody.photopicker.utils.MediaStoreHelper.INDEX_ALL_PHOTOS;
/**
* Created by Samuel on 15/5/31.
*/
public class PhotoPickerFragment extends Fragment {
private ImageCaptureManager captureManager;
private PhotoGridAdapter photoGridAdapter;
private PopupDirectoryListAdapter listAdapter;
//所有photos的路径
private List<PhotoDirectory> directories;
//传入的已选照片
private ArrayList<String> originalPhotos;
private int SCROLL_THRESHOLD = 30;
int column;
//目录弹出框的一次最多显示的目录数目
public static int COUNT_MAX = 4;
private final static String EXTRA_CAMERA = "camera";
private final static String EXTRA_COLUMN = "column";
private final static String EXTRA_COUNT = "count";
private final static String EXTRA_GIF = "gif";
private final static String EXTRA_ORIGIN = "origin";
private ListPopupWindow listPopupWindow;
public static PhotoPickerFragment newInstance(boolean showCamera, boolean showGif,
boolean previewEnable, int column, int maxCount, ArrayList<String> originalPhotos) {
Bundle args = new Bundle();
args.putBoolean(EXTRA_CAMERA, showCamera);
args.putBoolean(EXTRA_GIF, showGif);
args.putBoolean(EXTRA_PREVIEW_ENABLED, previewEnable);
args.putInt(EXTRA_COLUMN, column);
args.putInt(EXTRA_COUNT, maxCount);
args.putStringArrayList(EXTRA_ORIGIN, originalPhotos);
PhotoPickerFragment fragment = new PhotoPickerFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
directories = new ArrayList<>();
originalPhotos = getArguments().getStringArrayList(EXTRA_ORIGIN);
column = getArguments().getInt(EXTRA_COLUMN, DEFAULT_COLUMN_NUMBER);
boolean showCamera = getArguments().getBoolean(EXTRA_CAMERA, true);
boolean previewEnable = getArguments().getBoolean(EXTRA_PREVIEW_ENABLED, true);
photoGridAdapter = new PhotoGridAdapter(getActivity(), directories, originalPhotos, column);
photoGridAdapter.setShowCamera(showCamera);
photoGridAdapter.setPreviewEnable(previewEnable);
listAdapter = new PopupDirectoryListAdapter(directories);
Bundle mediaStoreArgs = new Bundle();
boolean showGif = getArguments().getBoolean(EXTRA_GIF);
mediaStoreArgs.putBoolean(EXTRA_SHOW_GIF, showGif);
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs,
new MediaStoreHelper.PhotosResultCallback() {
@Override
public void onResultCallback(List<PhotoDirectory> dirs) {
directories.clear();
directories.addAll(dirs);
photoGridAdapter.notifyDataSetChanged();
listAdapter.notifyDataSetChanged();
adjustHeight();
}
});
captureManager = new ImageCaptureManager(getActivity());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.__picker_fragment_photo_picker, container, false);
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.rv_photos);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(column, OrientationHelper.VERTICAL);
layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(photoGridAdapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
final TextView btSwitchDirectory = (TextView) rootView.findViewById(R.id.button);
listPopupWindow = new ListPopupWindow(getActivity());
listPopupWindow.setWidth(ListPopupWindow.MATCH_PARENT);
listPopupWindow.setAnchorView(btSwitchDirectory);
listPopupWindow.setAdapter(listAdapter);
listPopupWindow.setModal(true);
listPopupWindow.setDropDownGravity(Gravity.BOTTOM);
listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listPopupWindow.dismiss();
PhotoDirectory directory = directories.get(position);
btSwitchDirectory.setText(directory.getName());
photoGridAdapter.setCurrentDirectoryIndex(position);
photoGridAdapter.notifyDataSetChanged();
}
});
photoGridAdapter.setOnPhotoClickListener(new OnPhotoClickListener() {
@Override
public void onClick(View v, int position, boolean showCamera) {
final int index = showCamera ? position - 1 : position;
List<String> photos = photoGridAdapter.getCurrentPhotoPaths();
int[] screenLocation = new int[2];
v.getLocationOnScreen(screenLocation);
ImagePagerFragment imagePagerFragment =
ImagePagerFragment.newInstance(photos, index, screenLocation, v.getWidth(),
v.getHeight());
((PhotoPickerActivity) getActivity()).addImagePagerFragment(imagePagerFragment);
}
});
photoGridAdapter.setOnCameraClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (!PermissionsUtils.checkCameraPermission(PhotoPickerFragment.this)) return;
if (!PermissionsUtils.checkWriteStoragePermission(PhotoPickerFragment.this)) return;
openCamera();
}
});
btSwitchDirectory.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listPopupWindow.isShowing()) {
listPopupWindow.dismiss();
} else if (!getActivity().isFinishing()) {
adjustHeight();
listPopupWindow.show();
}
}
});
return rootView;
}
private void openCamera() {
try {
Intent intent = captureManager.dispatchTakePictureIntent();
startActivityForResult(intent, ImageCaptureManager.REQUEST_TAKE_PHOTO);
} catch (IOException e) {
e.printStackTrace();
} catch (ActivityNotFoundException e) {
// TODO No Activity Found to handle Intent
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ImageCaptureManager.REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
if (captureManager == null) {
FragmentActivity activity = getActivity();
captureManager = new ImageCaptureManager(activity);
}
captureManager.galleryAddPic();
if (directories.size() > 0) {
String path = captureManager.getCurrentPhotoPath();
PhotoDirectory directory = directories.get(INDEX_ALL_PHOTOS);
directory.getPhotos().add(INDEX_ALL_PHOTOS, new Photo(path.hashCode(), path));
directory.setCoverPath(path);
photoGridAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
switch (requestCode) {
case PermissionsConstant.REQUEST_CAMERA:
case PermissionsConstant.REQUEST_EXTERNAL_WRITE:
if (PermissionsUtils.checkWriteStoragePermission(this) &&
PermissionsUtils.checkCameraPermission(this)) {
openCamera();
}
break;
}
}
}
public PhotoGridAdapter getPhotoGridAdapter() {
return photoGridAdapter;
}
@Override
public void onSaveInstanceState(Bundle outState) {
captureManager.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
captureManager.onRestoreInstanceState(savedInstanceState);
super.onViewStateRestored(savedInstanceState);
}
public ArrayList<String> getSelectedPhotoPaths() {
return photoGridAdapter.getSelectedPhotoPaths();
}
public void adjustHeight() {
if (listAdapter == null) return;
int count = listAdapter.getCount();
count = count < COUNT_MAX ? count : COUNT_MAX;
if (listPopupWindow != null) {
listPopupWindow.setHeight(count * getResources().getDimensionPixelOffset(R.dimen.__picker_item_directory_height));
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (directories == null) {
return;
}
for (PhotoDirectory directory : directories) {
directory.getPhotoPaths().clear();
directory.getPhotos().clear();
directory.setPhotos(null);
}
directories.clear();
directories = null;
}
}