diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6696c2783..9ae3193a4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -243,6 +243,9 @@
+
+
getDirectShareExtras(extraShortcutId),
+ extras -> {
+ if (extras != null) {
+ addShortcutExtrasToIntent(extras);
+ handleDestination();
+ }
+ }
+ );
+ }
+ }
+
+ /**
+ * @param extraShortcutId EXTRA_SHORTCUT_ID String as included in direct share intent
+ * @return shortcutExtras or null
+ */
+ @WorkerThread
+ private @Nullable Bundle getDirectShareExtras(@NonNull String extraShortcutId) {
+ Bundle shortcutExtras = getShortcutExtrasFor(extraShortcutId);
+ if (shortcutExtras == null) {
+ shortcutExtras = createExtrasFromExtraShortcutId(extraShortcutId);
+ }
+ return shortcutExtras;
+ }
+
+ /**
+ * Search for dynamic shortcut originally declared in {@link ConversationUtil} and return extras
+ *
+ * @param extraShortcutId EXTRA_SHORTCUT_ID String as included in direct share intent
+ * @return shortcutExtras or null
+ */
+ @WorkerThread
+ private @Nullable Bundle getShortcutExtrasFor(@NonNull String extraShortcutId) {
+ List shortcuts = ShortcutManagerCompat.getDynamicShortcuts(this);
+ for (ShortcutInfoCompat shortcutInfo : shortcuts) {
+ if (extraShortcutId.equals(shortcutInfo.getId())) {
+ return shortcutInfo.getIntent().getExtras();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param extraShortcutId EXTRA_SHORTCUT_ID string as included in direct share intent
+ */
+ @WorkerThread
+ private @Nullable Bundle createExtrasFromExtraShortcutId(@NonNull String extraShortcutId) {
+ Bundle extras = new Bundle();
+ RecipientId recipientId = ConversationUtil.getRecipientId(extraShortcutId);
+ Long threadId = null;
+ int distributionType = ThreadDatabase.DistributionTypes.DEFAULT;
+
+ if (recipientId != null) {
+ threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdFor(recipientId);
+ extras.putString(EXTRA_RECIPIENT_ID, recipientId.serialize());
+ extras.putLong(EXTRA_THREAD_ID, threadId != null ? threadId : -1);
+ extras.putInt(EXTRA_DISTRIBUTION_TYPE, distributionType);
+ return extras;
+ }
+ return null;
+ }
+
+ /**
+ * @param shortcutExtras as found by {@link ShareActivity#getShortcutExtrasFor)} or
+ * {@link ShareActivity#createExtrasFromExtraShortcutId)}
+ */
+ private void addShortcutExtrasToIntent(@NonNull Bundle shortcutExtras) {
+ getIntent().putExtra(EXTRA_RECIPIENT_ID, shortcutExtras.getString(EXTRA_RECIPIENT_ID, null));
+ getIntent().putExtra(EXTRA_THREAD_ID, shortcutExtras.getLong(EXTRA_THREAD_ID, -1));
+ getIntent().putExtra(EXTRA_DISTRIBUTION_TYPE, shortcutExtras.getInt(EXTRA_DISTRIBUTION_TYPE, -1));
+ }
+
private void initializeToolbar() {
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -400,13 +484,9 @@ public class ShareActivity extends PassphraseRequiredActivity
Intent intent = getIntent();
long threadId = intent.getLongExtra(EXTRA_THREAD_ID, -1);
int distributionType = intent.getIntExtra(EXTRA_DISTRIBUTION_TYPE, -1);
- RecipientId recipientId = null;
+ RecipientId recipientId = RecipientId.from(intent.getStringExtra(EXTRA_RECIPIENT_ID));
- if (intent.hasExtra(EXTRA_RECIPIENT_ID)) {
- recipientId = RecipientId.from(intent.getStringExtra(EXTRA_RECIPIENT_ID));
- }
-
- boolean hasPreexistingDestination = threadId != -1 && recipientId != null && distributionType != -1;
+ boolean hasPreexistingDestination = threadId != -1 && distributionType != -1;
if (hasPreexistingDestination) {
if (contactsFragment.getView() != null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java
index fbd72da10..80c904b8a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java
@@ -39,6 +39,8 @@ public final class ConversationUtil {
private static final String TAG = Log.tag(ConversationUtil.class);
+ private static final String CATEGORY_SHARE_TARGET = "org.thoughtcrime.securesms.sharing.CATEGORY_SHARE_TARGET";
+
private ConversationUtil() {}
@@ -204,7 +206,7 @@ public final class ConversationUtil {
.setLongLabel(longName)
.setIcon(AvatarUtil.getIconCompatForShortcut(context, resolved))
.setPersons(persons)
- .setCategories(Collections.singleton("android.shortcut.conversation"))
+ .setCategories(Collections.singleton(CATEGORY_SHARE_TARGET))
.setActivity(new ComponentName(context, "org.thoughtcrime.securesms.RoutingActivity"))
.setRank(rank)
.build();
diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml
new file mode 100644
index 000000000..db9c955bb
--- /dev/null
+++ b/app/src/main/res/xml/shortcuts.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file