share to single contacts (#900)

This commit is contained in:
cyBerta 2019-06-24 10:48:16 +02:00 committed by B. Petersen
parent 89866ec121
commit 6af9d59829
No known key found for this signature in database
GPG key ID: 3B88E92DEA8E9AFC
6 changed files with 77 additions and 169 deletions

View file

@ -92,10 +92,9 @@
<data android:mimeType="text/*"/> <data android:mimeType="text/*"/>
<data android:mimeType="*/*"/> <data android:mimeType="*/*"/>
</intent-filter> </intent-filter>
<meta-data <meta-data
android:name="android.service.chooser.chooser_target_service" android:name="android.service.chooser.chooser_target_service"
android:value=".service.DirectShareService" /> android:value="org.thoughtcrime.securesms.service.DirectShareService" />
</activity> </activity>

View file

@ -53,7 +53,6 @@ import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener; import android.view.View.OnKeyListener;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.webkit.MimeTypeMap;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;

View file

@ -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.map.MapDataManager.ALL_CHATS_GLOBAL_MAP;
import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; 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.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent;
@ -90,6 +92,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (isRelayingMessageContent(this)) { if (isRelayingMessageContent(this)) {
title.setText(isForwarding(this) ? R.string.forward_to : R.string.chat_share_with_title); title.setText(isForwarding(this) ? R.string.forward_to : R.string.chat_share_with_title);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (isDirectSharing(this)) {
openConversation(getDirectSharingChatId(this), -1);
}
} }
} }

View file

@ -18,26 +18,19 @@
package org.thoughtcrime.securesms; package org.thoughtcrime.securesms;
import android.Manifest; import android.Manifest;
import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log; import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
import com.b44t.messenger.DcMsg;
import org.thoughtcrime.securesms.connect.ApplicationDcContext; import org.thoughtcrime.securesms.connect.ApplicationDcContext;
import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.database.Address;
import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.DynamicLanguage; 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.DynamicTheme;
import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.RelayUtil; 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.ArrayList;
import java.util.List; import java.util.List;
@ -65,8 +54,6 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
private static final String TAG = ShareActivity.class.getSimpleName(); private static final String TAG = ShareActivity.class.getSimpleName();
public static final String EXTRA_CHAT_ID = "chat_id"; 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 DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage();
@ -214,104 +201,14 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
private void handleResolvedMedia(Intent intent) { private void handleResolvedMedia(Intent intent) {
int chatId = intent.getIntExtra(EXTRA_CHAT_ID, -1); 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); Intent composeIntent = getBaseShareIntent(ConversationListActivity.class);
RelayUtil.setSharedUris(composeIntent, resolvedExtras); RelayUtil.setSharedUris(composeIntent, resolvedExtras);
if (chatId != -1) {
RelayUtil.setDirectSharing(composeIntent, chatId);
}
startActivity(composeIntent); startActivity(composeIntent);
finish(); 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) { private Intent getBaseShareIntent(final @NonNull Class<?> target) {

View file

@ -3,23 +3,27 @@ package org.thoughtcrime.securesms.service;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel;
import android.service.chooser.ChooserTarget; import android.service.chooser.ChooserTarget;
import android.service.chooser.ChooserTargetService; import android.service.chooser.ChooserTargetService;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import android.util.Log; 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.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.recipients.Recipient;
import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.BitmapUtil;
import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@ -33,58 +37,39 @@ public class DirectShareService extends ChooserTargetService {
public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName,
IntentFilter matchedFilter) IntentFilter matchedFilter)
{ {
// TODO: return the first 10 entries of the chat List here. List<ChooserTarget> results = new LinkedList<>();
return Collections.EMPTY_LIST; ComponentName componentName = new ComponentName(this, ShareActivity.class);
// List<ChooserTarget> results = new LinkedList<>(); ApplicationDcContext dcContext = DcHelper.getContext(this);
// ComponentName componentName = new ComponentName(this, ShareActivity.class);
// ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(this); DcChatlist chatlist = dcContext.getChatlist(DcContext.DC_GCL_ADD_ALLDONE_HINT, null, 0);
// Cursor cursor = threadDatabase.getDirectShareList(); int max = 4;
// if (chatlist.getCnt() < max) {
// try { max = chatlist.getCnt();
// ThreadDatabase.Reader reader = threadDatabase.readerFor(cursor); }
// ThreadRecord record; for (int i = 0; i <= max; i++) {
// DcChat chat = chatlist.getChat(i);
// while ((record = reader.getNext()) != null && results.size() < 10) {
// Recipient recipient = Recipient.from(this, record.getRecipient().getAddress(), false); Bundle bundle = new Bundle();
// String name = recipient.toShortString(); bundle.putInt(ShareActivity.EXTRA_CHAT_ID, chat.getId());
// bundle.setClassLoader(getClassLoader());
// Bitmap avatar; Recipient recipient = DcHelper.getContext(this).getRecipient(chat);
// Bitmap avatar;
// if (recipient.getContactPhoto(getApplicationContext()) != null) { try {
// try { avatar = GlideApp.with(this)
// avatar = GlideApp.with(this) .asBitmap()
// .asBitmap() .load(recipient.getContactPhoto(this).getUri(this))
// .load(recipient.getContactPhoto(getApplicationContext())) .circleCrop()
// .circleCrop() .submit(getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width),
// .submit(getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width))
// getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width)) .get();
// .get(); } catch (InterruptedException | ExecutionException | NullPointerException e) {
// } catch (InterruptedException | ExecutionException e) { Log.w(TAG, e);
// Log.w(TAG, e); avatar = getFallbackDrawable(recipient);
// avatar = getFallbackDrawable(recipient); }
// } results.add(new ChooserTarget(chat.getName(), Icon.createWithBitmap(avatar), 1.0f, componentName, bundle));
// } else { }
// avatar = getFallbackDrawable(recipient);
// } return results;
//
// 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();
// }
} }
private Bitmap getFallbackDrawable(@NonNull Recipient recipient) { private Bitmap getFallbackDrawable(@NonNull Recipient recipient) {

View file

@ -5,8 +5,6 @@ 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; 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 SHARED_URIS = "shared_uris";
private static final String IS_SHARING = "is_sharing"; private static final String IS_SHARING = "is_sharing";
public static final int REQUEST_RELAY = 100; 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) { public static boolean isRelayingMessageContent(Activity activity) {
return isForwarding(activity) || isSharing(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) { public static int[] getForwardedMessageIDs(Activity activity) {
try { try {
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS); return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS);
@ -66,6 +81,7 @@ public class RelayUtil {
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(IS_SHARING);
activity.getIntent().removeExtra(DIRECT_SHARING_CHAT_ID);
activity.getIntent().removeExtra(TEXT_EXTRA); activity.getIntent().removeExtra(TEXT_EXTRA);
} catch (NullPointerException npe) { } catch (NullPointerException npe) {
npe.printStackTrace(); npe.printStackTrace();
@ -77,6 +93,9 @@ public class RelayUtil {
newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity)); newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity));
} else if (isSharing(currentActivity)) { } else if (isSharing(currentActivity)) {
newActivityIntent.putExtra(IS_SHARING, true); newActivityIntent.putExtra(IS_SHARING, true);
if (isDirectSharing(currentActivity)) {
newActivityIntent.putExtra(DIRECT_SHARING_CHAT_ID, getDirectSharingChatId(currentActivity));
}
if (getSharedUris(currentActivity) != null) { if (getSharedUris(currentActivity) != null) {
newActivityIntent.putParcelableArrayListExtra(SHARED_URIS, getSharedUris(currentActivity)); newActivityIntent.putParcelableArrayListExtra(SHARED_URIS, getSharedUris(currentActivity));
} }
@ -100,5 +119,9 @@ public class RelayUtil {
composeIntent.putExtra(IS_SHARING, true); composeIntent.putExtra(IS_SHARING, true);
} }
public static void setDirectSharing(Intent composeIntent, int chatId) {
composeIntent.putExtra(DIRECT_SHARING_CHAT_ID, chatId);
}
} }