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);