package in.srain.cube.photos; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.text.TextUtils; import android.widget.Toast; import com.hoollyzhang.hlib.R; import in.srain.cube.cache.DiskFileUtils; import in.srain.cube.diskcache.FileUtils; import java.io.File; import java.io.IOException; public final class SelectPhotoManager { private static final int REQUEST_CODE_CAMERA = 1; private static final int REQUEST_CODE_ALBUM = 2; private static final int REQUEST_CODE_CROP = 3; private static final int ACTION_TAKE_PHOTO = 0; private static final int ACTION_ALBUM = 1; private static final int ACTION_CANCEL = 2; private static SelectPhotoManager sInstance; private static String TEMP_PATH_NAME = "cube-tmp-photo"; private PhotoReadyHandler mPhotoReadyHandler; private File mTempDir; private File mTempFile; private Activity mActivity; private CropOption mCropOption; private SelectPhotoManager() { } public static SelectPhotoManager getInstance() { if (sInstance == null) { sInstance = new SelectPhotoManager(); } return sInstance; } public void setCropOption(CropOption option) { mCropOption = option; } public void setPhotoReadyHandler(PhotoReadyHandler handler) { mPhotoReadyHandler = handler; } public void start(final Activity activity) { DiskFileUtils.CacheDirInfo info = DiskFileUtils.getDiskCacheDir(activity, TEMP_PATH_NAME, 1024 * 1024 * 30); File path = info.path; try { FileUtils.deleteDirectoryQuickly(path); } catch (IOException e) { e.printStackTrace(); } if (!path.exists() && !path.mkdirs()) { Toast.makeText(activity, R.string.cube_photo_can_not_use_camera, Toast.LENGTH_SHORT).show(); return; } else { path.deleteOnExit(); } mTempDir = info.path; mActivity = activity; mTempFile = new File(mTempDir.getAbsolutePath(), Long.toString(System.nanoTime()) + ".jpg"); DialogInterface.OnClickListener clickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { final int action = i; switch (action) { case ACTION_TAKE_PHOTO: PhotoUtils.toCamera(activity, mTempFile, REQUEST_CODE_CAMERA); break; case ACTION_ALBUM: PhotoUtils.toAlbum(activity, REQUEST_CODE_ALBUM); break; case ACTION_CANCEL: // do nothing break; } dialog.dismiss(); } }; AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setItems(R.array.cube_photo_pick_options, clickListener); builder.show().setCanceledOnTouchOutside(true); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } String imgPath = null; if (requestCode == REQUEST_CODE_CAMERA) { imgPath = mTempFile.getPath(); if (!afterPhotoTaken(imgPath)) { sendMessage(PhotoReadyHandler.FROM_CAMERA, imgPath); } } else if (requestCode == REQUEST_CODE_ALBUM && data != null) { Uri imgUri = data.getData(); imgPath = PhotoUtils.uriToPath(mActivity, imgUri); if (!afterPhotoTaken(imgPath)) { sendMessage(PhotoReadyHandler.FROM_ALBUM, imgPath); } } else if (requestCode == REQUEST_CODE_CROP) { imgPath = mTempFile.getPath(); sendMessage(PhotoReadyHandler.FROM_CROP, imgPath); } } private void sendMessage(int from, String imgPath) { if (mPhotoReadyHandler != null) { mPhotoReadyHandler.onPhotoReady(from, imgPath); } } private boolean afterPhotoTaken(String imgPath) { if (TextUtils.isEmpty(imgPath)) { throw new RuntimeException(); } if (mCropOption == null) { return false; } File f = new File(imgPath); mTempFile = new File(mTempDir.getAbsolutePath(), Long.toString(System.nanoTime()) + "_cropped.jpg"); PhotoUtils.toCrop(mActivity, f, mTempFile, mCropOption, REQUEST_CODE_CROP); return true; } }