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; } }