diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index edfc81462..4da8aa513 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -190,6 +190,7 @@
+
diff --git a/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java b/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java
index c80d932fd..c412ecb40 100644
--- a/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java
+++ b/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java
@@ -1,7 +1,11 @@
package com.todoroo.astrid.activity;
+import static android.content.Intent.ACTION_SEND;
+import static android.content.Intent.ACTION_SEND_MULTIPLE;
import static com.google.common.collect.Lists.newArrayList;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
+import static org.tasks.files.FileHelper.copyToUri;
+import static org.tasks.files.FileHelper.getFilename;
import static org.tasks.intents.TaskIntents.getTaskListIntent;
import android.content.Context;
@@ -9,13 +13,18 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.core.app.TaskStackBuilder;
+import com.google.common.base.Strings;
+import com.google.common.io.Files;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskCreator;
import java.util.ArrayList;
import javax.inject.Inject;
import org.tasks.data.TaskAttachment;
+import org.tasks.files.FileHelper;
import org.tasks.injection.ActivityComponent;
+import org.tasks.injection.ForApplication;
import org.tasks.injection.InjectingAppCompatActivity;
+import org.tasks.preferences.Preferences;
import timber.log.Timber;
/**
@@ -24,7 +33,15 @@ import timber.log.Timber;
*/
public final class ShareLinkActivity extends InjectingAppCompatActivity {
+ @Inject @ForApplication Context context;
@Inject TaskCreator taskCreator;
+ @Inject Preferences preferences;
+
+ private static TaskStackBuilder getEditTaskStack(Context context, Task task) {
+ Intent intent = getTaskListIntent(context, null);
+ intent.putExtra(MainActivity.OPEN_TASK, task);
+ return TaskStackBuilder.create(context).addNextIntent(intent);
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -57,11 +74,20 @@ public final class ShareLinkActivity extends InjectingAppCompatActivity {
Task task = taskCreator.createWithValues(text.toString());
getEditTaskStack(this, task).startActivities();
}
- } else if (action.equals(Intent.ACTION_SEND) || action.equals(Intent.ACTION_SEND_MULTIPLE)) {
+ } else if (ACTION_SEND.equals(action)) {
String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
Task task = taskCreator.createWithValues(subject);
task.setNotes(intent.getStringExtra(Intent.EXTRA_TEXT));
- task.putTransitory(TaskAttachment.KEY, getAttachments(intent));
+ if (hasAttachments(intent)) {
+ task.putTransitory(TaskAttachment.KEY, copyAttachment(intent));
+ }
+ getEditTaskStack(this, task).startActivities();
+ } else if (ACTION_SEND_MULTIPLE.equals(action)) {
+ Task task = taskCreator.createWithValues(intent.getStringExtra(Intent.EXTRA_SUBJECT));
+ task.setNotes(intent.getStringExtra(Intent.EXTRA_TEXT));
+ if (hasAttachments(intent)) {
+ task.putTransitory(TaskAttachment.KEY, copyMultipleAttachments(intent));
+ }
getEditTaskStack(this, task).startActivities();
} else {
Timber.e("Unhandled intent: %s", intent);
@@ -69,26 +95,33 @@ public final class ShareLinkActivity extends InjectingAppCompatActivity {
finish();
}
- private static TaskStackBuilder getEditTaskStack(Context context, Task task) {
- Intent intent = getTaskListIntent(context, null);
- intent.putExtra(MainActivity.OPEN_TASK, task);
- return TaskStackBuilder.create(context).addNextIntent(intent);
+ private ArrayList copyAttachment(Intent intent) {
+ Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
+ String filename = getFilename(context, uri);
+ if (Strings.isNullOrEmpty(filename)) {
+ String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
+ filename =
+ Strings.isNullOrEmpty(subject)
+ ? uri.getLastPathSegment()
+ : subject.substring(0, Math.min(subject.length(), FileHelper.MAX_FILENAME_LENGTH));
+ }
+ String basename = Files.getNameWithoutExtension(filename);
+ return newArrayList(copyToUri(context, preferences.getAttachmentsDirectory(), uri, basename));
}
- private ArrayList getAttachments(Intent intent) {
- String type = intent.getType();
- if (type != null) {
- String action = intent.getAction();
- if (action.equals(Intent.ACTION_SEND)) {
- if (type.startsWith("image/")) {
- return newArrayList(intent.getParcelableExtra(Intent.EXTRA_STREAM));
- }
- } else if (action.equals(Intent.ACTION_SEND_MULTIPLE)) {
- if (type.startsWith("image/")) {
- return intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
- }
+ private ArrayList copyMultipleAttachments(Intent intent) {
+ ArrayList result = new ArrayList<>();
+ ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+ if (uris != null) {
+ for (Uri uri : uris) {
+ result.add(copyToUri(context, preferences.getAttachmentsDirectory(), uri));
}
}
- return new ArrayList<>();
+ return result;
+ }
+
+ private boolean hasAttachments(Intent intent) {
+ String type = intent.getType();
+ return type != null && (type.startsWith("image/") || type.startsWith("application/"));
}
}
diff --git a/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.java b/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.java
index 856ea001f..12d870e6c 100644
--- a/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.java
+++ b/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.java
@@ -7,7 +7,6 @@
package com.todoroo.astrid.files;
import static android.app.Activity.RESULT_OK;
-import static org.tasks.data.TaskAttachment.createNewAttachment;
import static org.tasks.dialogs.AddAttachmentDialog.REQUEST_AUDIO;
import static org.tasks.dialogs.AddAttachmentDialog.REQUEST_CAMERA;
import static org.tasks.dialogs.AddAttachmentDialog.REQUEST_GALLERY;
@@ -76,7 +75,7 @@ public class FilesControlSet extends TaskEditControlFragment {
if (savedInstanceState == null) {
if (task.hasTransitory(TaskAttachment.KEY)) {
for (Uri uri : (ArrayList) task.getTransitory(TaskAttachment.KEY)) {
- copyToAttachmentDirectory(uri);
+ newAttachment(uri);
}
}
}
@@ -164,9 +163,12 @@ public class FilesControlSet extends TaskEditControlFragment {
}
private void copyToAttachmentDirectory(Uri input) {
- Uri output = copyToUri(context, preferences.getAttachmentsDirectory(), input);
+ newAttachment(copyToUri(context, preferences.getAttachmentsDirectory(), input));
+ }
+
+ private void newAttachment(Uri output) {
TaskAttachment attachment =
- createNewAttachment(taskUuid, output, FileHelper.getFilename(context, output));
+ new TaskAttachment(taskUuid, output, FileHelper.getFilename(context, output));
taskAttachmentDao.createNew(attachment);
addAttachment(attachment);
}
diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java
index cd86e4f89..8dd122d08 100644
--- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java
+++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java
@@ -164,7 +164,6 @@ public class TaskCreator {
break;
case GoogleTask.KEY:
case CaldavTask.KEY:
- case TaskAttachment.KEY:
task.putTransitory(key, value);
break;
default:
diff --git a/app/src/main/java/org/tasks/data/TaskAttachment.java b/app/src/main/java/org/tasks/data/TaskAttachment.java
index ab5634691..e8cd5a897 100644
--- a/app/src/main/java/org/tasks/data/TaskAttachment.java
+++ b/app/src/main/java/org/tasks/data/TaskAttachment.java
@@ -3,6 +3,7 @@ package org.tasks.data;
import android.net.Uri;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
+import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import com.google.common.base.Strings;
import com.todoroo.andlib.data.Table;
@@ -39,12 +40,13 @@ public final class TaskAttachment {
@ColumnInfo(name = "content_type")
private String contentType = "";
- public static TaskAttachment createNewAttachment(String taskUuid, Uri uri, String fileName) {
- TaskAttachment attachment = new TaskAttachment();
- attachment.setTaskId(taskUuid);
- attachment.setName(fileName);
- attachment.setUri(uri);
- return attachment;
+ public TaskAttachment() {}
+
+ @Ignore
+ public TaskAttachment(String taskUuid, Uri uri, String fileName) {
+ taskId = taskUuid;
+ name = fileName;
+ setUri(uri);
}
public Long getId() {
diff --git a/app/src/main/java/org/tasks/files/FileHelper.java b/app/src/main/java/org/tasks/files/FileHelper.java
index a40c4a3dc..6240e93a2 100644
--- a/app/src/main/java/org/tasks/files/FileHelper.java
+++ b/app/src/main/java/org/tasks/files/FileHelper.java
@@ -39,6 +39,8 @@ import timber.log.Timber;
public class FileHelper {
+ public static final int MAX_FILENAME_LENGTH = 40;
+
public static Intent newFilePickerIntent(Activity activity, Uri initial, String... mimeTypes) {
if (atLeastKitKat()) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
@@ -127,7 +129,7 @@ public class FileHelper {
}
}
- public static String getFilename(Context context, Uri uri) {
+ public @Nullable static String getFilename(Context context, Uri uri) {
switch (uri.getScheme()) {
case ContentResolver.SCHEME_FILE:
return uri.getLastPathSegment();
@@ -147,9 +149,8 @@ public class FileHelper {
public static String getExtension(Context context, Uri uri) {
if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
- String extension =
- MimeTypeMap.getSingleton()
- .getExtensionFromMimeType(context.getContentResolver().getType(uri));
+ String mimeType = context.getContentResolver().getType(uri);
+ String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
if (!Strings.isNullOrEmpty(extension)) {
return extension;
}
@@ -164,8 +165,11 @@ public class FileHelper {
}
public static String getMimeType(Context context, Uri uri) {
- String filename = getFilename(context, uri);
- String extension = Files.getFileExtension(filename);
+ String mimeType = context.getContentResolver().getType(uri);
+ if (!Strings.isNullOrEmpty(mimeType)) {
+ return mimeType;
+ }
+ String extension = getExtension(context, uri);
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
@@ -233,14 +237,20 @@ public class FileHelper {
}
public static Uri copyToUri(Context context, Uri destination, Uri input) {
- ContentResolver contentResolver = context.getContentResolver();
- MimeTypeMap mime = MimeTypeMap.getSingleton();
String filename = getFilename(context, input);
- String baseName = Files.getNameWithoutExtension(filename);
- String extension = Files.getFileExtension(filename);
- String mimeType = mime.getMimeTypeFromExtension(extension);
+ return copyToUri(context, destination, input, Files.getNameWithoutExtension(filename));
+ }
+
+ public static Uri copyToUri(Context context, Uri destination, Uri input, String basename) {
+ ContentResolver contentResolver = context.getContentResolver();
try {
- Uri output = newFile(context, destination, mimeType, baseName, extension);
+ Uri output =
+ newFile(
+ context,
+ destination,
+ getMimeType(context, input),
+ basename,
+ getExtension(context, input));
InputStream inputStream = contentResolver.openInputStream(input);
OutputStream outputStream = contentResolver.openOutputStream(output);
ByteStreams.copy(inputStream, outputStream);