From 876a4748723c98c52de60b02b3a94dffe6f92c35 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 23 Dec 2015 11:20:07 -0600 Subject: [PATCH] Add CameraActivity --- src/main/AndroidManifest.xml | 4 + .../astrid/actfm/ActFmCameraModule.java | 67 +----------- .../astrid/activity/TaskEditFragment.java | 34 ++---- .../astrid/notes/EditNoteActivity.java | 37 ++----- .../activities/AddAttachmentActivity.java | 33 ++---- .../org/tasks/activities/CameraActivity.java | 103 ++++++++++++++++++ .../org/tasks/injection/ActivityModule.java | 4 +- 7 files changed, 139 insertions(+), 143 deletions(-) create mode 100644 src/main/java/org/tasks/activities/CameraActivity.java diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 581f5132c..e6919020e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -119,6 +119,10 @@ android:name=".activities.AddAttachmentActivity" android:theme="@style/TranslucentDialog" /> + + nameRef = new AtomicReference<>(); - if (!extension.startsWith(".")) { - extension = "." + extension; - } - try { - String path = preferences.getNewAttachmentPath(extension, nameRef); - File file = new File(path); - file.getParentFile().mkdirs(); - if (!file.createNewFile()) { - throw new RuntimeException("Failed to create " + file.getPath()); - } - return file; - } catch (IOException e) { - Timber.e(e, e.getMessage()); - } - return null; - } - - public interface CameraResultCallback { - void handleCameraResult(Uri uri); - } - - public boolean activityResult(int requestCode, int resultCode, Intent data, - CameraResultCallback cameraResult) { - if(requestCode == ActFmCameraModule.REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) { - if (lastTempFile != null) { - Uri uri = Uri.fromFile(lastTempFile); - lastTempFile = null; - fragment.getActivity().setResult(Activity.RESULT_OK); - cameraResult.handleCameraResult(uri); - } - return true; - } - return false; - } } diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index d67b918f2..f105af7d2 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -31,12 +31,10 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; -import android.widget.Toast; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.actfm.ActFmCameraModule; -import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback; import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.dao.MetadataDao; @@ -71,6 +69,7 @@ import com.todoroo.astrid.utility.Flags; import org.tasks.R; import org.tasks.activities.AddAttachmentActivity; +import org.tasks.activities.CameraActivity; import org.tasks.activities.TimePickerActivity; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.InjectingFragment; @@ -96,7 +95,6 @@ import butterknife.ButterKnife; import timber.log.Timber; import static com.todoroo.andlib.utility.AndroidUtilities.preGingerbreadMR1; -import static org.tasks.files.FileHelper.getPathFromUri; /** * This activity is responsible for creating new tasks and editing existing @@ -145,6 +143,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { public static final int REQUEST_CODE_RECORD = 30; public static final int REQUEST_ADD_ATTACHMENT = 50; + public static final int REQUEST_CODE_CAMERA = 60; // --- result codes @@ -728,18 +727,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { startActivityForResult(recordAudio, REQUEST_CODE_RECORD); } - private void attachImage(Uri uri) { - try { - String path = getPathFromUri(getActivity(), uri); - File file = new File(path); - String extension = path.substring(path.lastIndexOf('.') + 1); - filesControlSet.createNewFileAttachment(path, file.getName(), TaskAttachment.FILE_TYPE_IMAGE + extension); - } catch (Exception e) { - Timber.e(e, e.getMessage()); - Toast.makeText(getActivity(), R.string.file_err_copy, Toast.LENGTH_LONG).show(); - } - } - @Override public boolean onOptionsItemSelected(MenuItem item) { hideKeyboard(); @@ -836,8 +823,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { Timber.e("Invalid geofence"); } } - } else if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) { - return; } else if (requestCode == REQUEST_CODE_RECORD && resultCode == Activity.RESULT_OK) { String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE); String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME); @@ -847,15 +832,14 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { File file = new File(path); String extension = path.substring(path.lastIndexOf('.') + 1); filesControlSet.createNewFileAttachment(path, file.getName(), TaskAttachment.FILE_TYPE_IMAGE + extension); - } - actFmCameraModule.activityResult(requestCode, resultCode, data, new CameraResultCallback() { - @Override - public void handleCameraResult(Uri uri) { - attachImage(uri); + } else if (requestCode == REQUEST_CODE_CAMERA) { + if (editNotes != null && resultCode == Activity.RESULT_OK) { + Uri uri = data.getParcelableExtra(CameraActivity.EXTRA_URI); + editNotes.setPictureUri(uri); } - }); - - super.onActivityResult(requestCode, resultCode, data); + } else { + super.onActivityResult(requestCode, resultCode, data); + } } @Override diff --git a/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java b/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java index 8d8872780..a1ee6a7fa 100644 --- a/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java +++ b/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java @@ -18,7 +18,6 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.format.DateUtils; import android.text.util.Linkify; -import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -35,7 +34,6 @@ import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.actfm.ActFmCameraModule; -import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback; import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.TaskEditFragment; @@ -87,8 +85,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene private final int cameraButton; - private static boolean respondToPicture = false; - private final List listeners = new LinkedList<>(); public interface UpdatesChangedListener { @@ -242,7 +238,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene } else { actFmCameraModule.showPictureLauncher(null); } - respondToPicture = true; } }); if(!TextUtils.isEmpty(task.getNotes())) { @@ -464,8 +459,8 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene @Override public void timerStarted(Task t) { addComment(String.format("%s %s", //$NON-NLS-1$ - getContext().getString(R.string.TEA_timer_comment_started), - DateUtilities.getTimeString(getContext(), newDateTime())), + getContext().getString(R.string.TEA_timer_comment_started), + DateUtilities.getTimeString(getContext(), newDateTime())), UserActivity.ACTION_TASK_COMMENT, t.getUuid(), false); @@ -483,29 +478,13 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene false); } - /* - * Call back from edit task when picture is added - */ - public boolean activityResult(int requestCode, int resultCode, Intent data) { - - if (respondToPicture) { - respondToPicture = false; - CameraResultCallback callback = new CameraResultCallback() { - @Override - public void handleCameraResult(Uri uri) { - if (activity != null) { - activity.getIntent().putExtra(TaskEditFragment.TOKEN_PICTURE_IN_PROGRESS, uri.toString()); - } - pendingCommentPicture = uri; - setPictureButtonToPendingPicture(); - commentField.requestFocus(); - } - }; - - return actFmCameraModule.activityResult(requestCode, resultCode, data, callback); - } else { - return false; + public void setPictureUri(Uri uri) { + if (activity != null) { + activity.getIntent().putExtra(TaskEditFragment.TOKEN_PICTURE_IN_PROGRESS, uri.toString()); } + pendingCommentPicture = uri; + setPictureButtonToPendingPicture(); + commentField.requestFocus(); } private void setPictureButtonToPendingPicture() { diff --git a/src/main/java/org/tasks/activities/AddAttachmentActivity.java b/src/main/java/org/tasks/activities/AddAttachmentActivity.java index aa9954c1e..f2cbed1dc 100644 --- a/src/main/java/org/tasks/activities/AddAttachmentActivity.java +++ b/src/main/java/org/tasks/activities/AddAttachmentActivity.java @@ -1,6 +1,5 @@ package org.tasks.activities; -import android.content.ClipData; import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; @@ -29,8 +28,6 @@ import javax.inject.Inject; import timber.log.Timber; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; - public class AddAttachmentActivity extends InjectingAppCompatActivity implements DialogInterface.OnCancelListener, AddAttachmentDialog.AddAttachmentCallback { private static final String FRAG_TAG_ATTACHMENT_DIALOG = "frag_tag_attachment_dialog"; @@ -40,8 +37,6 @@ public class AddAttachmentActivity extends InjectingAppCompatActivity implements public static final String EXTRA_PATH = "extra_path"; - @Deprecated private static File lastTempFile = null; - @Inject Preferences preferences; @Override @@ -65,20 +60,7 @@ public class AddAttachmentActivity extends InjectingAppCompatActivity implements @Override public void takePicture() { - lastTempFile = getFilename(".jpeg"); - if (lastTempFile == null) { - Toast.makeText(this, R.string.external_storage_unavailable, Toast.LENGTH_LONG).show(); - } else { - Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - Uri uri = Uri.fromFile(lastTempFile); - intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); - if (atLeastLollipop()) { - intent.setClipData(ClipData.newRawUri(null, uri)); - } - startActivityForResult(intent, REQUEST_CAMERA); - } + startActivityForResult(new Intent(this, CameraActivity.class), REQUEST_CAMERA); } @Override @@ -100,13 +82,12 @@ public class AddAttachmentActivity extends InjectingAppCompatActivity implements protected void onActivityResult(int requestCode, int resultCode, final Intent data) { if (requestCode == REQUEST_CAMERA) { if (resultCode == RESULT_OK) { - if (lastTempFile != null) { - Timber.i("Saved %s", lastTempFile.getAbsolutePath()); - setResult(RESULT_OK, new Intent() {{ - putExtra(EXTRA_PATH, lastTempFile.getAbsolutePath()); - }}); - lastTempFile = null; - } + Uri uri = data.getParcelableExtra(CameraActivity.EXTRA_URI); + final File file = new File(uri.getPath()); + Timber.i("Saved %s", file.getAbsolutePath()); + setResult(RESULT_OK, new Intent() {{ + putExtra(EXTRA_PATH, file.getAbsolutePath()); + }}); } finish(); } else if (requestCode == REQUEST_GALLERY) { diff --git a/src/main/java/org/tasks/activities/CameraActivity.java b/src/main/java/org/tasks/activities/CameraActivity.java new file mode 100644 index 000000000..e2857ea8b --- /dev/null +++ b/src/main/java/org/tasks/activities/CameraActivity.java @@ -0,0 +1,103 @@ +package org.tasks.activities; + +import android.app.Activity; +import android.content.ClipData; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.widget.Toast; + +import org.tasks.R; +import org.tasks.injection.InjectingAppCompatActivity; +import org.tasks.preferences.Preferences; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicReference; + +import javax.inject.Inject; + +import timber.log.Timber; + +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; + +public class CameraActivity extends InjectingAppCompatActivity { + + private static final int REQUEST_CODE_CAMERA = 75; + private static final String EXTRA_OUTPUT = "extra_output"; + + public static final String EXTRA_URI = "extra_uri"; + + @Inject Preferences preferences; + @Inject Activity activity; + + private File output; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState != null) { + output = (File) savedInstanceState.getSerializable(EXTRA_OUTPUT); + } else { + output = getFilename(".jpeg"); + if (output == null) { + Toast.makeText(activity, R.string.external_storage_unavailable, Toast.LENGTH_LONG).show(); + } else { + final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + Uri uri = Uri.fromFile(output); + intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + if (atLeastLollipop()) { + intent.setClipData(ClipData.newRawUri(null, uri)); + } + activity.startActivityForResult(intent, REQUEST_CODE_CAMERA); + } + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_CAMERA) { + if (resultCode == RESULT_OK) { + if (output != null) { + final Uri uri = Uri.fromFile(output); + setResult(RESULT_OK, new Intent() {{ + putExtra(EXTRA_URI, uri); + }}); + } + } + finish(); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putSerializable(EXTRA_OUTPUT, output); + } + + private File getFilename(String extension) { + AtomicReference nameRef = new AtomicReference<>(); + if (!extension.startsWith(".")) { + extension = "." + extension; + } + try { + String path = preferences.getNewAttachmentPath(extension, nameRef); + File file = new File(path); + file.getParentFile().mkdirs(); + if (!file.createNewFile()) { + throw new RuntimeException("Failed to create " + file.getPath()); + } + return file; + } catch (IOException e) { + Timber.e(e, e.getMessage()); + } + return null; + } +} diff --git a/src/main/java/org/tasks/injection/ActivityModule.java b/src/main/java/org/tasks/injection/ActivityModule.java index 665ef0fde..2fe544488 100644 --- a/src/main/java/org/tasks/injection/ActivityModule.java +++ b/src/main/java/org/tasks/injection/ActivityModule.java @@ -25,6 +25,7 @@ import com.todoroo.astrid.widget.WidgetConfigActivity; import org.tasks.activities.AddAttachmentActivity; import org.tasks.activities.CalendarSelectionActivity; +import org.tasks.activities.CameraActivity; import org.tasks.activities.ClearAllDataActivity; import org.tasks.activities.ClearGtaskDataActivity; import org.tasks.activities.DeleteAllCalendarEventsActivity; @@ -98,7 +99,8 @@ import dagger.Provides; UpgradeActivity.class, CalendarSelectionActivity.class, AddAttachmentActivity.class, - ShortcutActivity.class + ShortcutActivity.class, + CameraActivity.class }) public class ActivityModule {