package co.smartreceipts.android.imports; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import com.google.common.base.Preconditions; import java.io.File; import java.lang.ref.WeakReference; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.utils.IntentUtils; import co.smartreceipts.android.utils.cache.SmartReceiptsTemporaryFileCache; import co.smartreceipts.android.utils.log.Logger; public class CameraInteractionController { private final Context mContext; private final WeakReference<Fragment> mFragmentReference; public CameraInteractionController(@NonNull Fragment fragment) { mContext = Preconditions.checkNotNull(fragment.getContext()).getApplicationContext(); mFragmentReference = new WeakReference<>(Preconditions.checkNotNull(fragment)); } /** * Takes a photo for a given trip directory * * @return the Uri result of the photo */ @NonNull public Uri takePhoto() { return startPhotoIntent(new SmartReceiptsTemporaryFileCache(mContext).getFile(System.currentTimeMillis() + "x.jpg"), RequestCodes.NATIVE_NEW_RECEIPT_CAMERA_REQUEST); } /** * Takes a photo for a given receipt * * @return the Uri result of the photo */ @NonNull public Uri addPhoto() { return startPhotoIntent(new SmartReceiptsTemporaryFileCache(mContext).getFile(System.currentTimeMillis() + "x.jpg"), RequestCodes.NATIVE_ADD_PHOTO_CAMERA_REQUEST); } /** * Retakes a photo for a given receipt * * @param receipt the desired {@link Receipt} * @return the Uri result of the photo */ @NonNull public Uri retakePhoto(@NonNull Receipt receipt) { Preconditions.checkNotNull(receipt.getFile()); return startPhotoIntent(receipt.getFile(), RequestCodes.NATIVE_RETAKE_PHOTO_CAMERA_REQUEST); } @NonNull private Uri startPhotoIntent(@NonNull File saveLocation, int nativeCameraRequestCode) { final Fragment fragment = mFragmentReference.get(); if (fragment == null || !fragment.isResumed()) { Logger.warn(this, "Returning empty URI as save location"); return Uri.EMPTY; } final Intent intent = IntentUtils.getImageCaptureIntent(fragment.getActivity(), saveLocation); fragment.startActivityForResult(intent, nativeCameraRequestCode); final Uri uri = intent.getParcelableExtra(MediaStore.EXTRA_OUTPUT); Logger.debug(this, "Returning {} as save location", uri); return uri; } }