package com.quickblox.sample.core.utils.imagepick.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import com.quickblox.sample.core.utils.ImageUtils; import com.quickblox.sample.core.utils.imagepick.GetFilepathFromUriTask; import com.quickblox.sample.core.utils.imagepick.OnImagePickedListener; public class ImagePickHelperFragment extends Fragment { private static final String ARG_REQUEST_CODE = "requestCode"; private static final String ARG_PARENT_FRAGMENT = "parentFragment"; private static final String TAG = ImagePickHelperFragment.class.getSimpleName(); private OnImagePickedListener listener; public static ImagePickHelperFragment start(Fragment fragment, int requestCode) { Bundle args = new Bundle(); args.putInt(ARG_REQUEST_CODE, requestCode); args.putString(ARG_PARENT_FRAGMENT, fragment.getClass().getSimpleName()); return start(fragment.getActivity().getSupportFragmentManager(), args); } public static ImagePickHelperFragment start(FragmentActivity activity, int requestCode) { Bundle args = new Bundle(); args.putInt(ARG_REQUEST_CODE, requestCode); return start(activity.getSupportFragmentManager(), args); } private static ImagePickHelperFragment start(FragmentManager fm, Bundle args) { ImagePickHelperFragment fragment = (ImagePickHelperFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new ImagePickHelperFragment(); fm.beginTransaction().add(fragment, TAG).commitAllowingStateLoss(); fragment.setArguments(args); } return fragment; } public static void stop(FragmentManager fm) { Fragment fragment = fm.findFragmentByTag(TAG); if (fragment != null) { fm.beginTransaction().remove(fragment).commitAllowingStateLoss(); } } public ImagePickHelperFragment() {} @Override public void onAttach(Context context) { super.onAttach(context); Fragment fragment = ((AppCompatActivity) context).getSupportFragmentManager() .findFragmentByTag(getArguments().getString(ARG_PARENT_FRAGMENT)); if (fragment != null) { if (fragment instanceof OnImagePickedListener) { listener = (OnImagePickedListener) fragment; } } else { if (context instanceof OnImagePickedListener) { listener = (OnImagePickedListener) context; } } if (listener == null) { throw new IllegalStateException("Either activity or fragment should implement OnImagePickedListener"); } } @Override public void onDetach() { super.onDetach(); listener = null; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (isResultFromImagePick(requestCode, resultCode, data)) { if (requestCode == ImageUtils.CAMERA_REQUEST_CODE && (data == null || data.getData() == null)) { // Hacky way to get EXTRA_OUTPUT param to work. // When setting EXTRA_OUTPUT param in the camera intent there is a chance that data will return as null // So we just pass temporary camera file as a data, because RESULT_OK means that photo was written in the file. data = new Intent(); data.setData(Uri.fromFile(ImageUtils.getLastUsedCameraFile())); } new GetFilepathFromUriTask(getChildFragmentManager(), listener, getArguments().getInt(ARG_REQUEST_CODE)).execute(data); } else { stop(getChildFragmentManager()); if (listener != null) { listener.onImagePickClosed(getArguments().getInt(ARG_REQUEST_CODE)); } } } public void setListener(OnImagePickedListener listener) { this.listener = listener; } private boolean isResultFromImagePick(int requestCode, int resultCode, Intent data) { return resultCode == Activity.RESULT_OK && ((requestCode == ImageUtils.CAMERA_REQUEST_CODE) || (requestCode == ImageUtils.GALLERY_REQUEST_CODE && data != null)); } }