* fix sharing of text/urls (fixes #908)

* share single files as drafts
This commit is contained in:
cyBerta 2019-05-14 18:00:00 +02:00 committed by B. Petersen
parent 85427d3c01
commit 0ea7181b58
No known key found for this signature in database
GPG key ID: 3B88E92DEA8E9AFC
4 changed files with 97 additions and 79 deletions

View file

@ -614,8 +614,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
} }
private void handleSharing() { private void handleSharing() {
ArrayList uriList = RelayUtil.getSharedUris(this); ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
if (uriList != null && uriList.size() > 0) { if (uriList == null || uriList.size() == 0) return;
if (uriList.size() > 1) {
String message = String.format(getString(R.string.share_multiple_attachments), uriList.size()); String message = String.format(getString(R.string.share_multiple_attachments), uriList.size());
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setMessage(message) .setMessage(message)
@ -625,6 +626,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
})) }))
.setPositiveButton(R.string.menu_send, (dialog, which) -> new RelayingTask(this, chatId).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)) .setPositiveButton(R.string.menu_send, (dialog, which) -> new RelayingTask(this, chatId).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR))
.show(); .show();
} else {
DcMsg message = createMessage(this, uriList.get(0));
dcContext.setDraft(chatId, message);
initializeDraft();
} }
} }
@ -1099,7 +1104,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
ArrayList<Uri> uris = getSharedUris(activity); ArrayList<Uri> uris = getSharedUris(activity);
try { try {
for(Uri uri : uris) { for(Uri uri : uris) {
DcMsg message = createMessage(uri); DcMsg message = createMessage(activityRef.get(), uri);
dcContext.sendMsg(chatId, message); dcContext.sendMsg(chatId, message);
} }
@ -1120,55 +1125,53 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
} }
} }
private DcMsg createMessage(Uri uri) throws NullPointerException { }
Context context = activityRef.get();
DcContext dcContext = DcHelper.getContext(context); private static DcMsg createMessage(Context context, Uri uri) throws NullPointerException {
DcMsg message; DcContext dcContext = DcHelper.getContext(context);
String mimeType = MediaUtil.getMimeType(context, uri); DcMsg message;
if (MediaUtil.isImageType(mimeType)) { String mimeType = MediaUtil.getMimeType(context, uri);
message = new DcMsg(dcContext, DcMsg.DC_MSG_IMAGE); if (MediaUtil.isImageType(mimeType)) {
} message = new DcMsg(dcContext, DcMsg.DC_MSG_IMAGE);
else if (MediaUtil.isAudioType(mimeType)) {
message = new DcMsg(dcContext,DcMsg.DC_MSG_AUDIO);
}
else if (MediaUtil.isVideoType(mimeType)) {
message = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
}
else {
message = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
}
message.setFile(getRealPathFromUri(uri), mimeType);
return message;
} }
else if (MediaUtil.isAudioType(mimeType)) {
private String getRealPathFromUri(Uri uri) throws NullPointerException { message = new DcMsg(dcContext,DcMsg.DC_MSG_AUDIO);
Context context = activityRef.get();
ApplicationDcContext dcContext = DcHelper.getContext(context);
try {
String filename = uri.getPathSegments().get(2); // Get real file name from Uri
String ext = "";
int i = filename.lastIndexOf(".");
if(i>=0) {
ext = filename.substring(i);
filename = filename.substring(0, i);
}
String path = dcContext.getBlobdirFile(filename, ext);
// copy content to this file
if(path != null) {
InputStream inputStream = PartAuthority.getAttachmentStream(context, uri);
OutputStream outputStream = new FileOutputStream(path);
Util.copy(inputStream, outputStream);
}
return path;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
} }
else if (MediaUtil.isVideoType(mimeType)) {
message = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
}
else {
message = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
}
message.setFile(getRealPathFromUri(context, uri), mimeType);
return message;
}
private static String getRealPathFromUri(Context context, Uri uri) throws NullPointerException {
ApplicationDcContext dcContext = DcHelper.getContext(context);
try {
String filename = uri.getPathSegments().get(2); // Get real file name from Uri
String ext = "";
int i = filename.lastIndexOf(".");
if(i>=0) {
ext = filename.substring(i);
filename = filename.substring(0, i);
}
String path = dcContext.getBlobdirFile(filename, ext);
// copy content to this file
if(path != null) {
InputStream inputStream = PartAuthority.getAttachmentStream(context, uri);
OutputStream outputStream = new FileOutputStream(path);
Util.copy(inputStream, outputStream);
}
return path;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
} }

View file

@ -8,6 +8,7 @@ import android.os.Process;
import android.provider.OpenableColumns; import android.provider.OpenableColumns;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.util.Log; import android.util.Log;
import android.webkit.MimeTypeMap;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider; import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.util.FileUtils; import org.thoughtcrime.securesms.util.FileUtils;
@ -20,6 +21,8 @@ import java.io.InputStream;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.HashSet; import java.util.HashSet;
import static org.thoughtcrime.securesms.util.MediaUtil.getMimeType;
public class ResolveMediaTask extends AsyncTask<Uri, Void, Uri> { public class ResolveMediaTask extends AsyncTask<Uri, Void, Uri> {
private static final String TAG = ResolveMediaTask.class.getSimpleName(); private static final String TAG = ResolveMediaTask.class.getSimpleName();
@ -135,12 +138,4 @@ public class ResolveMediaTask extends AsyncTask<Uri, Void, Uri> {
return "file".equals(uri.getScheme()); return "file".equals(uri.getScheme());
} }
private String getMimeType(Activity activityContext, @Nullable Uri uri) {
if (uri != null) {
final String mimeType = MediaUtil.getMimeType(activityContext.getApplicationContext(), uri);
if (mimeType != null) return mimeType;
}
return MediaUtil.getCorrectedMimeType(activityContext.getIntent().getType());
}
} }

View file

@ -54,6 +54,8 @@ import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.thoughtcrime.securesms.util.RelayUtil.setSharedText;
/** /**
* An activity to quickly share content with chats * An activity to quickly share content with chats
* *
@ -126,14 +128,12 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
resolvedExtras = new ArrayList<>(); resolvedExtras = new ArrayList<>();
List<Uri> streamExtras = new ArrayList<>(); List<Uri> streamExtras = new ArrayList<>();
if (Intent.ACTION_SEND.equals(getIntent().getAction())) { if (Intent.ACTION_SEND.equals(getIntent().getAction()) &&
streamExtras.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM)); getIntent().getParcelableExtra(Intent.EXTRA_STREAM) != null) {
} else { Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
streamExtras.add(uri);
} else if (getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM) != null) {
streamExtras = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM); streamExtras = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (streamExtras == null || streamExtras.isEmpty()) {
streamExtras = new ArrayList<>();
streamExtras.add(null); // force checking at least EXTRA_TEXT & Co.
}
} }
if (needsFilePermission(streamExtras)) { if (needsFilePermission(streamExtras)) {
@ -232,7 +232,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
if (hasResolvedDestination) { if (hasResolvedDestination) {
createConversation(chatId); createConversation(chatId);
} else { } else {
Intent composeIntent = new Intent(this, ConversationListActivity.class); Intent composeIntent = getBaseShareIntent(ConversationListActivity.class);
RelayUtil.setSharedUris(composeIntent, resolvedExtras); RelayUtil.setSharedUris(composeIntent, resolvedExtras);
startActivity(composeIntent); startActivity(composeIntent);
finish(); finish();
@ -316,18 +316,16 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
} }
private Intent getBaseShareIntent(final @NonNull Class<?> target) { private Intent getBaseShareIntent(final @NonNull Class<?> target) {
if (resolvedExtras.size() == 1) { final Intent intent = new Intent(this, target);
final Intent intent = new Intent(this, target); setSharedText(intent, getIntent().getStringExtra(Intent.EXTRA_TEXT));
final String textExtra = getIntent().getStringExtra(Intent.EXTRA_TEXT); if (resolvedExtras.size() > 0) {
intent.putExtra(ConversationActivity.TEXT_EXTRA, textExtra);
Uri data = resolvedExtras.get(0); Uri data = resolvedExtras.get(0);
if (data != null) { if (data != null) {
String mimeType = getMimeType(data); String mimeType = getMimeType(data);
intent.setDataAndType(data, mimeType); intent.setDataAndType(data, mimeType);
} }
return intent;
} }
return new Intent(this, target); return intent;
} }
private String getMimeType(@Nullable Uri uri) { private String getMimeType(@Nullable Uri uri) {

View file

@ -5,20 +5,20 @@ import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import org.thoughtcrime.securesms.ConversationActivity;
import java.util.ArrayList; import java.util.ArrayList;
import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA;
public class RelayUtil { public class RelayUtil {
private static final String FORWARDED_MESSAGE_IDS = "forwarded_message_ids"; private static final String FORWARDED_MESSAGE_IDS = "forwarded_message_ids";
private static final String SHARED_URIS = "shared_uris"; private static final String SHARED_URIS = "shared_uris";
private static final String IS_SHARING = "is_sharing";
public static final int REQUEST_RELAY = 100; public static final int REQUEST_RELAY = 100;
public static boolean isRelayingMessageContent(Activity activity) { public static boolean isRelayingMessageContent(Activity activity) {
try { return isForwarding(activity) || isSharing(activity);
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS) != null ||
activity.getIntent().getParcelableArrayListExtra(SHARED_URIS) != null;
} catch (NullPointerException npe) {
return false;
}
} }
public static boolean isForwarding(Activity activity) { public static boolean isForwarding(Activity activity) {
@ -31,7 +31,7 @@ public class RelayUtil {
public static boolean isSharing(Activity activity) { public static boolean isSharing(Activity activity) {
try { try {
return activity.getIntent().getParcelableArrayListExtra(SHARED_URIS) != null; return activity.getIntent().getBooleanExtra(IS_SHARING, false);
} catch (NullPointerException npe) { } catch (NullPointerException npe) {
return false; return false;
} }
@ -53,10 +53,20 @@ public class RelayUtil {
} }
} }
public static String getSharedText(Activity activity) {
try {
return activity.getIntent().getStringExtra(TEXT_EXTRA);
} catch (NullPointerException npe) {
return null;
}
}
public static void resetRelayingMessageContent(Activity activity) { public static void resetRelayingMessageContent(Activity activity) {
try { try {
activity.getIntent().removeExtra(FORWARDED_MESSAGE_IDS); activity.getIntent().removeExtra(FORWARDED_MESSAGE_IDS);
activity.getIntent().removeExtra(SHARED_URIS); activity.getIntent().removeExtra(SHARED_URIS);
activity.getIntent().removeExtra(IS_SHARING);
activity.getIntent().removeExtra(TEXT_EXTRA);
} catch (NullPointerException npe) { } catch (NullPointerException npe) {
npe.printStackTrace(); npe.printStackTrace();
} }
@ -66,7 +76,13 @@ public class RelayUtil {
if (isForwarding(currentActivity)) { if (isForwarding(currentActivity)) {
newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity)); newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity));
} else if (isSharing(currentActivity)) { } else if (isSharing(currentActivity)) {
newActivityIntent.putParcelableArrayListExtra(SHARED_URIS, getSharedUris(currentActivity)); newActivityIntent.putExtra(IS_SHARING, true);
if (getSharedUris(currentActivity) != null) {
newActivityIntent.putParcelableArrayListExtra(SHARED_URIS, getSharedUris(currentActivity));
}
if (getSharedText(currentActivity) != null) {
newActivityIntent.putExtra(TEXT_EXTRA, getSharedText(currentActivity));
}
} }
} }
@ -76,6 +92,12 @@ public class RelayUtil {
public static void setSharedUris(Intent composeIntent, ArrayList<Uri> uris) { public static void setSharedUris(Intent composeIntent, ArrayList<Uri> uris) {
composeIntent.putParcelableArrayListExtra(SHARED_URIS, uris); composeIntent.putParcelableArrayListExtra(SHARED_URIS, uris);
composeIntent.putExtra(IS_SHARING, true);
}
public static void setSharedText(Intent composeIntent, String text) {
composeIntent.putExtra(TEXT_EXTRA, text);
composeIntent.putExtra(IS_SHARING, true);
} }