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