From 02c37e815cecb41a2378a8134130afd1f51bb5d1 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Wed, 18 Nov 2015 12:54:40 -0800 Subject: [PATCH] enable media forwarding fixes #1362 closes #4589 // FREEBIE --- .../securesms/ConversationActivity.java | 24 ++--- .../securesms/ConversationFragment.java | 11 ++- .../securesms/NewConversationActivity.java | 21 ++--- .../thoughtcrime/securesms/ShareActivity.java | 94 ++++++++++--------- .../securesms/SmsSendtoActivity.java | 6 +- .../securesms/mms/AttachmentManager.java | 12 +++ .../securesms/mms/PartAuthority.java | 12 +++ 7 files changed, 101 insertions(+), 79 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 1640ce217b..94afb48e66 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -154,11 +154,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity public static final String RECIPIENTS_EXTRA = "recipients"; public static final String THREAD_ID_EXTRA = "thread_id"; - public static final String DRAFT_TEXT_EXTRA = "draft_text"; - public static final String DRAFT_IMAGE_EXTRA = "draft_image"; - public static final String DRAFT_GIF_EXTRA = "draft_gif"; - public static final String DRAFT_AUDIO_EXTRA = "draft_audio"; - public static final String DRAFT_VIDEO_EXTRA = "draft_video"; + public static final String TEXT_EXTRA = "draft_text"; public static final String DISTRIBUTION_TYPE_EXTRA = "distribution_type"; private static final int PICK_IMAGE = 1; @@ -709,20 +705,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity ///// Initializers private void initializeDraft() { - String draftText = getIntent().getStringExtra(DRAFT_TEXT_EXTRA); - Uri draftGif = getIntent().getParcelableExtra(DRAFT_GIF_EXTRA); - Uri draftImage = getIntent().getParcelableExtra(DRAFT_IMAGE_EXTRA); - Uri draftAudio = getIntent().getParcelableExtra(DRAFT_AUDIO_EXTRA); - Uri draftVideo = getIntent().getParcelableExtra(DRAFT_VIDEO_EXTRA); + final String draftText = getIntent().getStringExtra(TEXT_EXTRA); + final Uri draftMedia = getIntent().getData(); + final MediaType draftMediaType = MediaType.from(getIntent().getType()); - if (draftText != null) composeText.setText(draftText); + if (draftText != null) composeText.setText(draftText); + if (draftMedia != null && draftMediaType != null) setMedia(draftMedia, draftMediaType); - if (draftGif != null) setMedia(draftGif, MediaType.GIF); - if (draftImage != null) setMedia(draftImage, MediaType.IMAGE); - else if (draftAudio != null) setMedia(draftAudio, MediaType.AUDIO); - else if (draftVideo != null) setMedia(draftVideo, MediaType.VIDEO); - - if (draftText == null && draftImage == null && draftAudio == null && draftVideo == null) { + if (draftText == null && draftMedia == null && draftMediaType == null) { initializeDraftFromDatabase(); } else { updateToggleButtonState(); diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java index 2a027a51ab..7dff8d6780 100644 --- a/src/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationFragment.java @@ -105,7 +105,8 @@ public class ConversationFragment extends Fragment loadMoreView = inflater.inflate(R.layout.load_more_header, container, false); loadMoreView.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { + @Override + public void onClick(View v) { Bundle args = new Bundle(); args.putLong("limit", 0); getLoaderManager().restartLoader(0, args, ConversationFragment.this); @@ -305,6 +306,14 @@ public class ConversationFragment extends Fragment private void handleForwardMessage(MessageRecord message) { Intent composeIntent = new Intent(getActivity(), ShareActivity.class); composeIntent.putExtra(Intent.EXTRA_TEXT, message.getDisplayBody().toString()); + if (message.isMms()) { + MediaMmsMessageRecord mediaMessage = (MediaMmsMessageRecord) message; + if (mediaMessage.containsMediaSlide()) { + Slide slide = mediaMessage.getSlideDeck().getSlides().get(0); + composeIntent.putExtra(Intent.EXTRA_STREAM, slide.getUri()); + composeIntent.setType(slide.getContentType()); + } + } startActivity(composeIntent); } diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index 4e7c62575d..675f02676a 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -52,21 +52,16 @@ public class NewConversationActivity extends ContactSelectionActivity { public void onContactSelected(String number) { Recipients recipients = RecipientFactory.getRecipientsFromString(this, number, true); - if (recipients != null) { - Intent intent = new Intent(this, ConversationActivity.class); - intent.putExtra(ConversationActivity.RECIPIENTS_EXTRA, recipients.getIds()); - intent.putExtra(ConversationActivity.DRAFT_TEXT_EXTRA, getIntent().getStringExtra(ConversationActivity.DRAFT_TEXT_EXTRA)); - intent.putExtra(ConversationActivity.DRAFT_AUDIO_EXTRA, getIntent().getParcelableExtra(ConversationActivity.DRAFT_AUDIO_EXTRA)); - intent.putExtra(ConversationActivity.DRAFT_VIDEO_EXTRA, getIntent().getParcelableExtra(ConversationActivity.DRAFT_VIDEO_EXTRA)); - intent.putExtra(ConversationActivity.DRAFT_IMAGE_EXTRA, getIntent().getParcelableExtra(ConversationActivity.DRAFT_IMAGE_EXTRA)); + Intent intent = new Intent(this, ConversationActivity.class); + intent.putExtra(ConversationActivity.RECIPIENTS_EXTRA, recipients.getIds()); + intent.setDataAndType(getIntent().getData(), getIntent().getType()); - long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipients); + long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipients); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, existingThread); - intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); - startActivity(intent); - finish(); - } + intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, existingThread); + intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); + startActivity(intent); + finish(); } @Override diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index ef0e614262..68e3af90d3 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -32,18 +32,16 @@ import android.view.ViewGroup; import android.webkit.MimeTypeMap; import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.providers.PersistentBlobProvider; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ViewUtil; import java.io.IOException; import java.io.InputStream; -import ws.com.google.android.mms.ContentType; - /** * An activity to quickly share content with contacts * @@ -110,35 +108,18 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity private void initializeMedia() { final Context context = this; isPassingAlongMedia = false; - fragmentContainer.setVisibility(View.GONE); - progressWheel.setVisibility(View.VISIBLE); - new AsyncTask() { - @Override - protected Uri doInBackground(Uri... uris) { - try { - if (uris.length != 1 || uris[0] == null) { - return null; - } - InputStream input = context.getContentResolver().openInputStream(uris[0]); - if (input == null) { - return null; - } - - return PersistentBlobProvider.getInstance(context).create(masterSecret, input); - } catch (IOException ioe) { - Log.w(TAG, ioe); - return null; - } - } - - @Override - protected void onPostExecute(Uri uri) { - resolvedExtra = uri; - ViewUtil.fadeIn(fragmentContainer, 300); - ViewUtil.fadeOut(progressWheel, 300); - } - }.execute(getIntent().getParcelableExtra(Intent.EXTRA_STREAM)); + Uri streamExtra = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + if (streamExtra != null && PartAuthority.isLocalUri(streamExtra)) { + isPassingAlongMedia = true; + resolvedExtra = streamExtra; + fragmentContainer.setVisibility(View.VISIBLE); + progressWheel.setVisibility(View.GONE); + } else { + fragmentContainer.setVisibility(View.GONE); + progressWheel.setVisibility(View.VISIBLE); + new ResolveMediaTask(context).execute(streamExtra); + } } @Override @@ -187,19 +168,8 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity final String textExtra = getIntent().getStringExtra(Intent.EXTRA_TEXT); final Uri streamExtra = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); final String type = streamExtra != null ? getMimeType(streamExtra) : getIntent().getType(); - - if (resolvedExtra != null) { - if (MediaUtil.isGif(type)) { - intent.putExtra(ConversationActivity.DRAFT_GIF_EXTRA, resolvedExtra); - } else if (ContentType.isImageType(type)) { - intent.putExtra(ConversationActivity.DRAFT_IMAGE_EXTRA, resolvedExtra); - } else if (ContentType.isAudioType(type)) { - intent.putExtra(ConversationActivity.DRAFT_AUDIO_EXTRA, resolvedExtra); - } else if (ContentType.isVideoType(type)) { - intent.putExtra(ConversationActivity.DRAFT_VIDEO_EXTRA, resolvedExtra); - } - } - intent.putExtra(ConversationActivity.DRAFT_TEXT_EXTRA, textExtra); + intent.putExtra(ConversationActivity.TEXT_EXTRA, textExtra); + if (resolvedExtra != null) intent.setDataAndType(resolvedExtra, type); return intent; } @@ -212,6 +182,40 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } - return type; + return type == null ? getIntent().getType() : type; + } + + private class ResolveMediaTask extends AsyncTask { + private final Context context; + + public ResolveMediaTask(Context context) { + this.context = context; + } + + @Override + protected Uri doInBackground(Uri... uris) { + try { + if (uris.length != 1 || uris[0] == null) { + return null; + } + + InputStream input = context.getContentResolver().openInputStream(uris[0]); + if (input == null) { + return null; + } + + return PersistentBlobProvider.getInstance(context).create(masterSecret, input); + } catch (IOException ioe) { + Log.w(TAG, ioe); + return null; + } + } + + @Override + protected void onPostExecute(Uri uri) { + resolvedExtra = uri; + ViewUtil.fadeIn(fragmentContainer, 300); + ViewUtil.fadeOut(progressWheel, 300); + } } } \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java index e36f161560..55bc8f5179 100644 --- a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java +++ b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java @@ -42,13 +42,13 @@ public class SmsSendtoActivity extends Activity { long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipients); final Intent nextIntent; - if (recipients == null || recipients.isEmpty()) { + if (recipients.isEmpty()) { nextIntent = new Intent(this, NewConversationActivity.class); - nextIntent.putExtra(ConversationActivity.DRAFT_TEXT_EXTRA, destination.getBody()); + nextIntent.putExtra(ConversationActivity.TEXT_EXTRA, destination.getBody()); Toast.makeText(this, R.string.ConversationActivity_specify_recipient, Toast.LENGTH_LONG).show(); } else { nextIntent = new Intent(this, ConversationActivity.class); - nextIntent.putExtra(ConversationActivity.DRAFT_TEXT_EXTRA, destination.getBody()); + nextIntent.putExtra(ConversationActivity.TEXT_EXTRA, destination.getBody()); nextIntent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); nextIntent.putExtra(ConversationActivity.RECIPIENTS_EXTRA, recipients.getIds()); } diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java index dd4c5d1c8e..42d4cbb313 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -27,6 +27,7 @@ import android.provider.ContactsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; @@ -46,6 +47,8 @@ import org.whispersystems.libaxolotl.util.guava.Optional; import java.io.IOException; import java.util.concurrent.ExecutionException; +import ws.com.google.android.mms.ContentType; + public class AttachmentManager { private final static String TAG = AttachmentManager.class.getSimpleName(); @@ -279,5 +282,14 @@ public class AttachmentManager { default: throw new AssertionError("unrecognized enum"); } } + + public static @Nullable MediaType from(final @Nullable String mimeType) { + if (TextUtils.isEmpty(mimeType)) return null; + if (MediaUtil.isGif(mimeType)) return GIF; + if (ContentType.isImageType(mimeType)) return IMAGE; + if (ContentType.isAudioType(mimeType)) return AUDIO; + if (ContentType.isVideoType(mimeType)) return VIDEO; + return null; + } } } diff --git a/src/org/thoughtcrime/securesms/mms/PartAuthority.java b/src/org/thoughtcrime/securesms/mms/PartAuthority.java index 53224c2025..ffca98b99f 100644 --- a/src/org/thoughtcrime/securesms/mms/PartAuthority.java +++ b/src/org/thoughtcrime/securesms/mms/PartAuthority.java @@ -76,4 +76,16 @@ public class PartAuthority { Uri uri = Uri.withAppendedPath(THUMB_CONTENT_URI, String.valueOf(attachmentId.getUniqueId())); return ContentUris.withAppendedId(uri, attachmentId.getRowId()); } + + public static boolean isLocalUri(final @NonNull Uri uri) { + int match = uriMatcher.match(uri); + switch (match) { + case PART_ROW: + case THUMB_ROW: + case PERSISTENT_ROW: + case SINGLE_USE_ROW: + return true; + } + return false; + } }