package org.wordpress.android.ui.photopicker; import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.MenuItem; import org.wordpress.android.BuildConfig; import org.wordpress.android.R; import org.wordpress.android.ui.RequestCodes; import org.wordpress.android.ui.media.WordPressMediaUtils; import org.wordpress.android.ui.photopicker.PhotoPickerFragment.PhotoPickerOption; import org.wordpress.android.util.AppLog; import org.wordpress.passcodelock.AppLockManager; import java.io.File; import java.util.EnumSet; import java.util.List; public class PhotoPickerActivity extends AppCompatActivity implements PhotoPickerFragment.PhotoPickerListener { private static final String PICKER_FRAGMENT_TAG = "picker_fragment_tag"; private static final String KEY_MEDIA_CAPTURE_PATH = "media_capture_path"; // the uri of the selected image will be returned as a string in EXTRA_MEDIA_URI public static final String EXTRA_MEDIA_URI = "picker_media_uri"; // the enum name of the source will be returned as a string in EXTRA_MEDIA_SOURCE public static final String EXTRA_MEDIA_SOURCE = "media_source"; private String mMediaCapturePath; public enum PhotoPickerMediaSource { ANDROID_CAMERA, ANDROID_PICKER, APP_PICKER; public static PhotoPickerMediaSource fromString(String strSource) { if (strSource != null) { for (PhotoPickerMediaSource source : PhotoPickerMediaSource.values()) { if (source.name().equalsIgnoreCase(strSource)) { return source; } } } return null; } } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.photo_picker_activity); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setNavigationIcon(R.drawable.ic_close_white_24dp); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowTitleEnabled(true); } // only show photos (no videos) and only from device (no wp media) EnumSet<PhotoPickerOption> options = EnumSet.of( PhotoPickerOption.PHOTOS_ONLY, PhotoPickerOption.DEVICE_ONLY); PhotoPickerFragment fragment = getPickerFragment(); if (fragment == null) { fragment = PhotoPickerFragment.newInstance(this, options); getFragmentManager().beginTransaction() .replace(R.id.fragment_container, fragment, PICKER_FRAGMENT_TAG) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commitAllowingStateLoss(); } else { fragment.setOptions(options); fragment.setPhotoPickerListener(this); } } private PhotoPickerFragment getPickerFragment() { Fragment fragment = getFragmentManager().findFragmentByTag(PICKER_FRAGMENT_TAG); if (fragment != null) { return (PhotoPickerFragment) fragment; } return null; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (!TextUtils.isEmpty(mMediaCapturePath)) { outState.putString(KEY_MEDIA_CAPTURE_PATH, mMediaCapturePath); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMediaCapturePath = savedInstanceState.getString(KEY_MEDIA_CAPTURE_PATH); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { setResult(RESULT_CANCELED); finish(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) { return; } switch (requestCode) { // user chose a photo from the device library case RequestCodes.PICTURE_LIBRARY: if (data != null) { Uri imageUri = data.getData(); mediaSelected(imageUri, PhotoPickerMediaSource.ANDROID_PICKER); } break; // user took a photo with the device camera case RequestCodes.TAKE_PHOTO: try { File f = new File(mMediaCapturePath); Uri capturedImageUri = Uri.fromFile(f); mediaSelected(capturedImageUri, PhotoPickerMediaSource.ANDROID_CAMERA); } catch (RuntimeException e) { AppLog.e(AppLog.T.MEDIA, e); } break; } } private void launchCamera() { WordPressMediaUtils.launchCamera(this, BuildConfig.APPLICATION_ID, new WordPressMediaUtils.LaunchCameraCallback() { @Override public void onMediaCapturePathReady(String mediaCapturePath) { mMediaCapturePath = mediaCapturePath; AppLockManager.getInstance().setExtendedTimeout(); } }); } private void launchPictureLibrary() { WordPressMediaUtils.launchPictureLibrary(this); AppLockManager.getInstance().setExtendedTimeout(); } private void mediaSelected(@NonNull Uri mediaUri, @NonNull PhotoPickerMediaSource source) { Intent intent = new Intent() .putExtra(EXTRA_MEDIA_URI, mediaUri.toString()) .putExtra(EXTRA_MEDIA_SOURCE, source.name()); setResult(RESULT_OK, intent); finish(); } @Override public void onPhotoPickerMediaChosen(@NonNull List<Uri> uriList) { if (uriList.size() > 0) { mediaSelected(uriList.get(0), PhotoPickerMediaSource.APP_PICKER); } } @Override public void onPhotoPickerIconClicked(@NonNull PhotoPickerFragment.PhotoPickerIcon icon) { switch (icon) { case ANDROID_CAPTURE_PHOTO: launchCamera(); break; case ANDROID_CHOOSE_PHOTO: launchPictureLibrary(); break; } } }