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