/* * Copyright 2012 The Stanford MobiSocial Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package mobisocial.musubi.ui; import java.io.File; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; 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.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; public class PhotoEditorActivity extends FragmentActivity { Uri mImageUri; static final String EXTRA_FILE_URI = "fileUri"; static final int REQUEST_GET_CONTENT = 1; static final int REQUEST_IMAGE_CAPTURE = 2; static final int REQUEST_EDIT_PHOTO = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); if (mImageUri == null) { showDialog(ChooseImageDialogFragment.newInstance()); } else { showDialog(EditImageDialogFragment.newInstance()); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_GET_CONTENT: { if (resultCode == RESULT_OK) { mImageUri = data.getData(); } break; } case REQUEST_IMAGE_CAPTURE: { mImageUri = getTempFileUri(); break; } case REQUEST_EDIT_PHOTO: if (resultCode == RESULT_OK) { // make sure edited content is at mImageUri } } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(EXTRA_FILE_URI, mImageUri); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mImageUri = savedInstanceState.getParcelable(EXTRA_FILE_URI); } void showDialog(DialogFragment dialog) { // DialogFragment.show() will take care of adding the fragment // in a transaction. We also want to remove any currently showing // dialog, so make our own transaction and take care of that here. FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } ft.addToBackStack(null); dialog.show(ft, "dialog"); } public static class EditImageDialogFragment extends DialogFragment { public static EditImageDialogFragment newInstance() { EditImageDialogFragment f = new EditImageDialogFragment(); Bundle args = new Bundle(); f.setArguments(args); return f; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String[] choices = new String[] { "PicSay", "Sketch" }; return new AlertDialog.Builder(getActivity()) .setTitle("Choose Editor") .setItems(choices, null) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { getActivity().finish(); dismiss(); } }).create(); } } public static class ChooseImageDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { public static ChooseImageDialogFragment newInstance() { ChooseImageDialogFragment f = new ChooseImageDialogFragment(); Bundle args = new Bundle(); f.setArguments(args); return f; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String[] choices = new String[] { "From Camera", "From Gallery" }; return new AlertDialog.Builder(getActivity()) .setTitle("Choose Image") .setItems(choices, this) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { getActivity().finish(); dismiss(); } }).create(); } @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); int requestCode = 0; switch (which) { case 0: { intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, getTempFileUri()); requestCode = REQUEST_IMAGE_CAPTURE; break; } case 1: { intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); requestCode = REQUEST_GET_CONTENT; break; } } getActivity().startActivityForResult(intent, requestCode); } } static Uri getTempFileUri() { return Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "edit-tmp")); } }