mirror of
https://github.com/deltachat/deltachat-android.git
synced 2025-10-03 09:49:21 +02:00
share to single contacts (#900)
This commit is contained in:
parent
89866ec121
commit
6af9d59829
6 changed files with 77 additions and 169 deletions
|
@ -92,10 +92,9 @@
|
|||
<data android:mimeType="text/*"/>
|
||||
<data android:mimeType="*/*"/>
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.service.chooser.chooser_target_service"
|
||||
android:value=".service.DirectShareService" />
|
||||
android:value="org.thoughtcrime.securesms.service.DirectShareService" />
|
||||
|
||||
</activity>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
boolean hasResolvedDestination = chatId != -1 && address != null && distributionType != -1;
|
||||
|
||||
if (hasResolvedDestination) {
|
||||
createConversation(chatId);
|
||||
} else {
|
||||
Intent composeIntent = getBaseShareIntent(ConversationListActivity.class);
|
||||
RelayUtil.setSharedUris(composeIntent, resolvedExtras);
|
||||
if (chatId != -1) {
|
||||
RelayUtil.setDirectSharing(composeIntent, chatId);
|
||||
}
|
||||
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) {
|
||||
|
|
|
@ -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<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName,
|
||||
IntentFilter matchedFilter)
|
||||
{
|
||||
// TODO: return the first 10 entries of the chat List here.
|
||||
return Collections.EMPTY_LIST;
|
||||
// List<ChooserTarget> 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<ChooserTarget> 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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue