package com.jdroid.android.picture;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.jdroid.android.R;
import com.jdroid.android.dialog.AbstractDialogFragment;
import com.jdroid.android.utils.AppUtils;
import com.jdroid.android.utils.DeviceUtils;
import com.jdroid.java.date.DateUtils;
import java.io.File;
public class PictureDialogFragment extends AbstractDialogFragment {
private static final String OUTPUT_FILE_URI_EXTRA = "outputFileUriExtra";
private static final String IMAGE_TYPE = "image/*";
private static final int CAMERA_REQUEST_CODE = 1;
private static final int GALLERY_REQUEST_CODE = 2;
private Uri outputFileUri;
public static Boolean display() {
return DeviceUtils.hasCamera();
}
public static void show(Fragment targetFragment) {
FragmentManager fm = targetFragment.getActivity().getSupportFragmentManager();
PictureDialogFragment pictureDialogFragment = new PictureDialogFragment();
pictureDialogFragment.setTargetFragment(targetFragment, 1);
pictureDialogFragment.show(fm, PictureDialogFragment.class.getSimpleName());
}
/**
* @see com.jdroid.android.dialog.AbstractDialogFragment#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
outputFileUri = savedInstanceState.getParcelable(OUTPUT_FILE_URI_EXTRA);
}
}
@Override
public Integer getContentFragmentLayout() {
return R.layout.jdroid_picture_dialog_fragment;
}
/**
* @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle)
*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getDialog().setTitle(R.string.jdroid_selectPhoto);
// Configure the take photo button.
Button camera = findView(R.id.camera);
if (DeviceUtils.hasCamera()) {
camera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
outputFileUri = getOutputMediaFileUri();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
});
} else {
camera.setVisibility(View.GONE);
}
// Configure the choose from library button.
Button gallery = findView(R.id.gallery);
gallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent imagePickerIntent = new Intent(Intent.ACTION_PICK);
imagePickerIntent.setType(IMAGE_TYPE);
startActivityForResult(imagePickerIntent, GALLERY_REQUEST_CODE);
}
});
}
/**
* @see android.support.v4.app.Fragment#onActivityResult(int, int, android.content.Intent)
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Uri path = null;
switch (requestCode) {
// Set the default path for the camera pictures if the picture is obtained from the camera.
case CAMERA_REQUEST_CODE:
path = outputFileUri;
break;
// Set the obtained path if the picture is obtained from the device's gallery.
case GALLERY_REQUEST_CODE:
path = data.getData();
break;
}
PicturePickerListener listener = (PicturePickerListener)getTargetFragment();
listener.onPicturePicked(path.toString());
dismissAllowingStateLoss();
}
}
/**
* @see android.support.v4.app.DialogFragment#onSaveInstanceState(android.os.Bundle)
*/
@Override
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putParcelable(OUTPUT_FILE_URI_EXTRA, outputFileUri);
}
private Uri getOutputMediaFileUri() {
// TODO To be safe, you should check that the SDCard is mounted using Environment.getExternalStorageState()
// before doing this.
// This location works best if you want the created images to be shared between applications and persist after
// your app has been uninstalled.
String appName = AppUtils.getApplicationName().trim().replace(" ", "_");
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
appName);
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
return null;
}
// Create a media file name
String timeStamp = DateUtils.format(DateUtils.now(), "yyyyMMdd_HHmmss");
File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".png");
return Uri.fromFile(mediaFile);
}
}