From 6af9d598298f749751f5fec482ce0a7353c47a11 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 24 Jun 2019 10:48:16 +0200 Subject: [PATCH] share to single contacts (#900) --- AndroidManifest.xml | 3 +- .../securesms/ConversationActivity.java | 1 - .../securesms/ConversationListActivity.java | 5 + .../thoughtcrime/securesms/ShareActivity.java | 115 +----------------- .../securesms/service/DirectShareService.java | 95 ++++++--------- .../securesms/util/RelayUtil.java | 27 +++- 6 files changed, 77 insertions(+), 169 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f376ab29d..42c7e8cfd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -92,10 +92,9 @@ - + android:value="org.thoughtcrime.securesms.service.DirectShareService" /> diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 75b10abc2..5b229f564 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -53,7 +53,6 @@ import android.view.View.OnFocusChangeListener; import android.view.View.OnKeyListener; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; -import android.webkit.MimeTypeMap; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java index bbf430850..f68ccb023 100644 --- a/src/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java @@ -45,6 +45,8 @@ import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_ import static org.thoughtcrime.securesms.map.MapDataManager.ALL_CHATS_GLOBAL_MAP; import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; +import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId; +import static org.thoughtcrime.securesms.util.RelayUtil.isDirectSharing; import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding; import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent; @@ -90,6 +92,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit if (isRelayingMessageContent(this)) { title.setText(isForwarding(this) ? R.string.forward_to : R.string.chat_share_with_title); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + if (isDirectSharing(this)) { + openConversation(getDirectSharingChatId(this), -1); + } } } diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index e6fbf9cc9..7665c4e43 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -18,26 +18,19 @@ package org.thoughtcrime.securesms; import android.Manifest; -import android.app.Activity; import android.content.Intent; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; -import android.os.Parcel; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; -import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.widget.Toast; -import com.b44t.messenger.DcMsg; - import org.thoughtcrime.securesms.connect.ApplicationDcContext; import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.DynamicLanguage; @@ -45,11 +38,7 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.RelayUtil; -import org.thoughtcrime.securesms.util.Util; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -65,8 +54,6 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement private static final String TAG = ShareActivity.class.getSimpleName(); public static final String EXTRA_CHAT_ID = "chat_id"; - public static final String EXTRA_ADDRESS_MARSHALLED = "address_marshalled"; - public static final String EXTRA_DISTRIBUTION_TYPE = "distribution_type"; private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); @@ -214,104 +201,14 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement private void handleResolvedMedia(Intent intent) { int chatId = intent.getIntExtra(EXTRA_CHAT_ID, -1); - int distributionType = intent.getIntExtra(EXTRA_DISTRIBUTION_TYPE, -1); - Address address = null; - - if (intent.hasExtra(EXTRA_ADDRESS_MARSHALLED)) { - Parcel parcel = Parcel.obtain(); - byte[] marshalled = intent.getByteArrayExtra(EXTRA_ADDRESS_MARSHALLED); - parcel.unmarshall(marshalled, 0, marshalled.length); - parcel.setDataPosition(0); - address = parcel.readParcelable(getClassLoader()); - parcel.recycle(); + Intent composeIntent = getBaseShareIntent(ConversationListActivity.class); + RelayUtil.setSharedUris(composeIntent, resolvedExtras); + if (chatId != -1) { + RelayUtil.setDirectSharing(composeIntent, chatId); } + startActivity(composeIntent); + finish(); - boolean hasResolvedDestination = chatId != -1 && address != null && distributionType != -1; - - if (hasResolvedDestination) { - createConversation(chatId); - } else { - Intent composeIntent = getBaseShareIntent(ConversationListActivity.class); - RelayUtil.setSharedUris(composeIntent, resolvedExtras); - startActivity(composeIntent); - finish(); - } - } - - private void createConversation(int chatId) { - if (resolvedExtras.size() > 1) { - String message = String.format(getString(R.string.share_multiple_attachments), resolvedExtras.size()); - new AlertDialog.Builder(this) - .setMessage(message) - .setCancelable(false) - .setNegativeButton(android.R.string.cancel, ((dialog, which) -> { - finish(); - })) - .setPositiveButton(R.string.menu_send, (dialog, which) -> sendMultipleAttachmentsAndCreateConversation(chatId)) - .show(); - } else { - openConversation(chatId); - } - } - - private void sendMultipleAttachmentsAndCreateConversation(int chatId) { - for(Uri uri : resolvedExtras) { - DcMsg message = createMessage(uri); - dcContext.sendMsg(chatId, message); - } - openConversation(chatId); - } - - private void openConversation(int chatId) { - final Intent intent = getBaseShareIntent(ConversationActivity.class); - intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId); - startActivity(intent); - finish(); - } - - private DcMsg createMessage(Uri uri) { - DcMsg message; - String mimeType = MediaUtil.getMimeType(this, uri); - 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; - } - - private String getRealPathFromUri(Uri uri) { - 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(this, uri); - OutputStream outputStream = new FileOutputStream(path); - Util.copy(inputStream, outputStream); - } - - return path; - } - catch(Exception e) { - e.printStackTrace(); - return null; - } } private Intent getBaseShareIntent(final @NonNull Class target) { diff --git a/src/org/thoughtcrime/securesms/service/DirectShareService.java b/src/org/thoughtcrime/securesms/service/DirectShareService.java index 8f4a5de24..e01af3fed 100644 --- a/src/org/thoughtcrime/securesms/service/DirectShareService.java +++ b/src/org/thoughtcrime/securesms/service/DirectShareService.java @@ -3,23 +3,27 @@ package org.thoughtcrime.securesms.service; import android.content.ComponentName; import android.content.IntentFilter; -import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Icon; import android.os.Build; import android.os.Bundle; -import android.os.Parcel; import android.service.chooser.ChooserTarget; import android.service.chooser.ChooserTargetService; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.util.Log; +import com.b44t.messenger.DcChat; +import com.b44t.messenger.DcChatlist; +import com.b44t.messenger.DcContext; + import org.thoughtcrime.securesms.ShareActivity; +import org.thoughtcrime.securesms.connect.ApplicationDcContext; +import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.BitmapUtil; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -33,58 +37,39 @@ public class DirectShareService extends ChooserTargetService { public List onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) { - // TODO: return the first 10 entries of the chat List here. - return Collections.EMPTY_LIST; -// List results = new LinkedList<>(); -// ComponentName componentName = new ComponentName(this, ShareActivity.class); -// ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(this); -// Cursor cursor = threadDatabase.getDirectShareList(); -// -// try { -// ThreadDatabase.Reader reader = threadDatabase.readerFor(cursor); -// ThreadRecord record; -// -// while ((record = reader.getNext()) != null && results.size() < 10) { -// Recipient recipient = Recipient.from(this, record.getRecipient().getAddress(), false); -// String name = recipient.toShortString(); -// -// Bitmap avatar; -// -// if (recipient.getContactPhoto(getApplicationContext()) != null) { -// try { -// avatar = GlideApp.with(this) -// .asBitmap() -// .load(recipient.getContactPhoto(getApplicationContext())) -// .circleCrop() -// .submit(getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), -// getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width)) -// .get(); -// } catch (InterruptedException | ExecutionException e) { -// Log.w(TAG, e); -// avatar = getFallbackDrawable(recipient); -// } -// } else { -// avatar = getFallbackDrawable(recipient); -// } -// -// Parcel parcel = Parcel.obtain(); -// parcel.writeParcelable(recipient.getAddress(), 0); -// -// Bundle bundle = new Bundle(); -// bundle.putLong(ShareActivity.EXTRA_CHAT_ID, record.getChatId()); -// bundle.putByteArray(ShareActivity.EXTRA_ADDRESS_MARSHALLED, parcel.marshall()); -// bundle.putInt(ShareActivity.EXTRA_DISTRIBUTION_TYPE, record.getDistributionType()); -// bundle.setClassLoader(getClassLoader()); -// -// results.add(new ChooserTarget(name, Icon.createWithBitmap(avatar), 1.0f, componentName, bundle)); -// parcel.recycle(); -// -// } -// -// return results; -// } finally { -// if (cursor != null) cursor.close(); -// } + List results = new LinkedList<>(); + ComponentName componentName = new ComponentName(this, ShareActivity.class); + ApplicationDcContext dcContext = DcHelper.getContext(this); + + DcChatlist chatlist = dcContext.getChatlist(DcContext.DC_GCL_ADD_ALLDONE_HINT, null, 0); + int max = 4; + if (chatlist.getCnt() < max) { + max = chatlist.getCnt(); + } + for (int i = 0; i <= max; i++) { + DcChat chat = chatlist.getChat(i); + + Bundle bundle = new Bundle(); + bundle.putInt(ShareActivity.EXTRA_CHAT_ID, chat.getId()); + bundle.setClassLoader(getClassLoader()); + Recipient recipient = DcHelper.getContext(this).getRecipient(chat); + Bitmap avatar; + try { + avatar = GlideApp.with(this) + .asBitmap() + .load(recipient.getContactPhoto(this).getUri(this)) + .circleCrop() + .submit(getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), + getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width)) + .get(); + } catch (InterruptedException | ExecutionException | NullPointerException e) { + Log.w(TAG, e); + avatar = getFallbackDrawable(recipient); + } + results.add(new ChooserTarget(chat.getName(), Icon.createWithBitmap(avatar), 1.0f, componentName, bundle)); + } + + return results; } private Bitmap getFallbackDrawable(@NonNull Recipient recipient) { diff --git a/src/org/thoughtcrime/securesms/util/RelayUtil.java b/src/org/thoughtcrime/securesms/util/RelayUtil.java index 2fe53527a..7d2898051 100644 --- a/src/org/thoughtcrime/securesms/util/RelayUtil.java +++ b/src/org/thoughtcrime/securesms/util/RelayUtil.java @@ -5,8 +5,6 @@ import android.content.Intent; import android.net.Uri; import android.support.annotation.NonNull; -import org.thoughtcrime.securesms.ConversationActivity; - import java.util.ArrayList; import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA; @@ -16,6 +14,7 @@ public class RelayUtil { private static final String SHARED_URIS = "shared_uris"; private static final String IS_SHARING = "is_sharing"; public static final int REQUEST_RELAY = 100; + private static final String DIRECT_SHARING_CHAT_ID = "direct_sharing_chat_id"; public static boolean isRelayingMessageContent(Activity activity) { return isForwarding(activity) || isSharing(activity); @@ -37,6 +36,22 @@ public class RelayUtil { } } + public static boolean isDirectSharing(Activity activity) { + try { + return activity.getIntent().getIntExtra(DIRECT_SHARING_CHAT_ID, -1) != -1; + } catch (NullPointerException npe) { + return false; + } + } + + public static int getDirectSharingChatId(Activity activity) { + try { + return activity.getIntent().getIntExtra(DIRECT_SHARING_CHAT_ID, -1); + } catch (NullPointerException npe) { + return -1; + } + } + public static int[] getForwardedMessageIDs(Activity activity) { try { return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS); @@ -66,6 +81,7 @@ public class RelayUtil { activity.getIntent().removeExtra(FORWARDED_MESSAGE_IDS); activity.getIntent().removeExtra(SHARED_URIS); activity.getIntent().removeExtra(IS_SHARING); + activity.getIntent().removeExtra(DIRECT_SHARING_CHAT_ID); activity.getIntent().removeExtra(TEXT_EXTRA); } catch (NullPointerException npe) { npe.printStackTrace(); @@ -77,6 +93,9 @@ public class RelayUtil { newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity)); } else if (isSharing(currentActivity)) { newActivityIntent.putExtra(IS_SHARING, true); + if (isDirectSharing(currentActivity)) { + newActivityIntent.putExtra(DIRECT_SHARING_CHAT_ID, getDirectSharingChatId(currentActivity)); + } if (getSharedUris(currentActivity) != null) { newActivityIntent.putParcelableArrayListExtra(SHARED_URIS, getSharedUris(currentActivity)); } @@ -100,5 +119,9 @@ public class RelayUtil { composeIntent.putExtra(IS_SHARING, true); } + public static void setDirectSharing(Intent composeIntent, int chatId) { + composeIntent.putExtra(DIRECT_SHARING_CHAT_ID, chatId); + } + }