Add CameraActivity

pull/384/head
Alex Baker 10 years ago
parent 126db3f98e
commit 876a474872

@ -119,6 +119,10 @@
android:name=".activities.AddAttachmentActivity" android:name=".activities.AddAttachmentActivity"
android:theme="@style/TranslucentDialog" /> android:theme="@style/TranslucentDialog" />
<activity
android:name=".activities.CameraActivity"
android:theme="@style/TranslucentDialog" />
<!-- Activity that displays task list --> <!-- Activity that displays task list -->
<activity <activity
android:name="com.todoroo.astrid.activity.TaskListActivity" android:name="com.todoroo.astrid.activity.TaskListActivity"

@ -5,38 +5,26 @@
*/ */
package com.todoroo.astrid.actfm; package com.todoroo.astrid.actfm;
import android.app.Activity;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Toast;
import com.todoroo.astrid.activity.TaskEditFragment;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.CameraActivity;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.preferences.DeviceInfo; import org.tasks.preferences.DeviceInfo;
import org.tasks.preferences.Preferences;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject; import javax.inject.Inject;
import timber.log.Timber;
public class ActFmCameraModule { public class ActFmCameraModule {
protected static final int REQUEST_CODE_CAMERA = 1;
private static File lastTempFile = null;
private final Fragment fragment; private final Fragment fragment;
private final Preferences preferences;
private DeviceInfo deviceInfo; private DeviceInfo deviceInfo;
private DialogBuilder dialogBuilder; private DialogBuilder dialogBuilder;
@ -45,9 +33,8 @@ public class ActFmCameraModule {
} }
@Inject @Inject
public ActFmCameraModule(Fragment fragment, Preferences preferences, DeviceInfo deviceInfo, DialogBuilder dialogBuilder) { public ActFmCameraModule(Fragment fragment, DeviceInfo deviceInfo, DialogBuilder dialogBuilder) {
this.fragment = fragment; this.fragment = fragment;
this.preferences = preferences;
this.deviceInfo = deviceInfo; this.deviceInfo = deviceInfo;
this.dialogBuilder = dialogBuilder; this.dialogBuilder = dialogBuilder;
} }
@ -61,14 +48,7 @@ public class ActFmCameraModule {
runnables.add(new Runnable() { runnables.add(new Runnable() {
@Override @Override
public void run() { public void run() {
lastTempFile = getFilename(".jpeg"); fragment.startActivityForResult(new Intent(fragment.getActivity(), CameraActivity.class), TaskEditFragment.REQUEST_CODE_CAMERA);
if (lastTempFile == null) {
Toast.makeText(fragment.getActivity(), R.string.external_storage_unavailable, Toast.LENGTH_LONG).show();
} else {
final Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(lastTempFile));
fragment.startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA);
}
} }
}); });
options.add(fragment.getString(R.string.take_a_picture)); options.add(fragment.getString(R.string.take_a_picture));
@ -104,41 +84,4 @@ public class ActFmCameraModule {
.show().setOwnerActivity(fragment.getActivity()); .show().setOwnerActivity(fragment.getActivity());
} }
} }
private File getFilename(String extension) {
AtomicReference<String> 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;
}
} }

@ -31,12 +31,10 @@ import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.Toast;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback;
import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
@ -71,6 +69,7 @@ import com.todoroo.astrid.utility.Flags;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.AddAttachmentActivity; import org.tasks.activities.AddAttachmentActivity;
import org.tasks.activities.CameraActivity;
import org.tasks.activities.TimePickerActivity; import org.tasks.activities.TimePickerActivity;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingFragment; import org.tasks.injection.InjectingFragment;
@ -96,7 +95,6 @@ import butterknife.ButterKnife;
import timber.log.Timber; import timber.log.Timber;
import static com.todoroo.andlib.utility.AndroidUtilities.preGingerbreadMR1; 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 * 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_CODE_RECORD = 30;
public static final int REQUEST_ADD_ATTACHMENT = 50; public static final int REQUEST_ADD_ATTACHMENT = 50;
public static final int REQUEST_CODE_CAMERA = 60;
// --- result codes // --- result codes
@ -728,18 +727,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
startActivityForResult(recordAudio, REQUEST_CODE_RECORD); 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 @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
hideKeyboard(); hideKeyboard();
@ -836,8 +823,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
Timber.e("Invalid geofence"); Timber.e("Invalid geofence");
} }
} }
} else if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
return;
} else if (requestCode == REQUEST_CODE_RECORD && resultCode == Activity.RESULT_OK) { } else if (requestCode == REQUEST_CODE_RECORD && resultCode == Activity.RESULT_OK) {
String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE); String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE);
String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME); String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME);
@ -847,15 +832,14 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
File file = new File(path); File file = new File(path);
String extension = path.substring(path.lastIndexOf('.') + 1); String extension = path.substring(path.lastIndexOf('.') + 1);
filesControlSet.createNewFileAttachment(path, file.getName(), TaskAttachment.FILE_TYPE_IMAGE + extension); filesControlSet.createNewFileAttachment(path, file.getName(), TaskAttachment.FILE_TYPE_IMAGE + extension);
} } else if (requestCode == REQUEST_CODE_CAMERA) {
actFmCameraModule.activityResult(requestCode, resultCode, data, new CameraResultCallback() { if (editNotes != null && resultCode == Activity.RESULT_OK) {
@Override Uri uri = data.getParcelableExtra(CameraActivity.EXTRA_URI);
public void handleCameraResult(Uri uri) { editNotes.setPictureUri(uri);
attachImage(uri);
} }
}); } else {
super.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data); }
} }
@Override @Override

@ -18,7 +18,6 @@ import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.util.TypedValue;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; 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.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback;
import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback;
import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
@ -87,8 +85,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private final int cameraButton; private final int cameraButton;
private static boolean respondToPicture = false;
private final List<UpdatesChangedListener> listeners = new LinkedList<>(); private final List<UpdatesChangedListener> listeners = new LinkedList<>();
public interface UpdatesChangedListener { public interface UpdatesChangedListener {
@ -242,7 +238,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
} else { } else {
actFmCameraModule.showPictureLauncher(null); actFmCameraModule.showPictureLauncher(null);
} }
respondToPicture = true;
} }
}); });
if(!TextUtils.isEmpty(task.getNotes())) { if(!TextUtils.isEmpty(task.getNotes())) {
@ -464,8 +459,8 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
@Override @Override
public void timerStarted(Task t) { public void timerStarted(Task t) {
addComment(String.format("%s %s", //$NON-NLS-1$ addComment(String.format("%s %s", //$NON-NLS-1$
getContext().getString(R.string.TEA_timer_comment_started), getContext().getString(R.string.TEA_timer_comment_started),
DateUtilities.getTimeString(getContext(), newDateTime())), DateUtilities.getTimeString(getContext(), newDateTime())),
UserActivity.ACTION_TASK_COMMENT, UserActivity.ACTION_TASK_COMMENT,
t.getUuid(), t.getUuid(),
false); false);
@ -483,29 +478,13 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
false); false);
} }
/* public void setPictureUri(Uri uri) {
* Call back from edit task when picture is added if (activity != null) {
*/ activity.getIntent().putExtra(TaskEditFragment.TOKEN_PICTURE_IN_PROGRESS, uri.toString());
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;
} }
pendingCommentPicture = uri;
setPictureButtonToPendingPicture();
commentField.requestFocus();
} }
private void setPictureButtonToPendingPicture() { private void setPictureButtonToPendingPicture() {

@ -1,6 +1,5 @@
package org.tasks.activities; package org.tasks.activities;
import android.content.ClipData;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@ -29,8 +28,6 @@ import javax.inject.Inject;
import timber.log.Timber; import timber.log.Timber;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
public class AddAttachmentActivity extends InjectingAppCompatActivity implements DialogInterface.OnCancelListener, AddAttachmentDialog.AddAttachmentCallback { public class AddAttachmentActivity extends InjectingAppCompatActivity implements DialogInterface.OnCancelListener, AddAttachmentDialog.AddAttachmentCallback {
private static final String FRAG_TAG_ATTACHMENT_DIALOG = "frag_tag_attachment_dialog"; 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"; public static final String EXTRA_PATH = "extra_path";
@Deprecated private static File lastTempFile = null;
@Inject Preferences preferences; @Inject Preferences preferences;
@Override @Override
@ -65,20 +60,7 @@ public class AddAttachmentActivity extends InjectingAppCompatActivity implements
@Override @Override
public void takePicture() { public void takePicture() {
lastTempFile = getFilename(".jpeg"); startActivityForResult(new Intent(this, CameraActivity.class), REQUEST_CAMERA);
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);
}
} }
@Override @Override
@ -100,13 +82,12 @@ public class AddAttachmentActivity extends InjectingAppCompatActivity implements
protected void onActivityResult(int requestCode, int resultCode, final Intent data) { protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
if (requestCode == REQUEST_CAMERA) { if (requestCode == REQUEST_CAMERA) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
if (lastTempFile != null) { Uri uri = data.getParcelableExtra(CameraActivity.EXTRA_URI);
Timber.i("Saved %s", lastTempFile.getAbsolutePath()); final File file = new File(uri.getPath());
setResult(RESULT_OK, new Intent() {{ Timber.i("Saved %s", file.getAbsolutePath());
putExtra(EXTRA_PATH, lastTempFile.getAbsolutePath()); setResult(RESULT_OK, new Intent() {{
}}); putExtra(EXTRA_PATH, file.getAbsolutePath());
lastTempFile = null; }});
}
} }
finish(); finish();
} else if (requestCode == REQUEST_GALLERY) { } else if (requestCode == REQUEST_GALLERY) {

@ -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<String> 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;
}
}

@ -25,6 +25,7 @@ import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.activities.AddAttachmentActivity; import org.tasks.activities.AddAttachmentActivity;
import org.tasks.activities.CalendarSelectionActivity; import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.activities.CameraActivity;
import org.tasks.activities.ClearAllDataActivity; import org.tasks.activities.ClearAllDataActivity;
import org.tasks.activities.ClearGtaskDataActivity; import org.tasks.activities.ClearGtaskDataActivity;
import org.tasks.activities.DeleteAllCalendarEventsActivity; import org.tasks.activities.DeleteAllCalendarEventsActivity;
@ -98,7 +99,8 @@ import dagger.Provides;
UpgradeActivity.class, UpgradeActivity.class,
CalendarSelectionActivity.class, CalendarSelectionActivity.class,
AddAttachmentActivity.class, AddAttachmentActivity.class,
ShortcutActivity.class ShortcutActivity.class,
CameraActivity.class
}) })
public class ActivityModule { public class ActivityModule {

Loading…
Cancel
Save