From 2883c1656090ef97feb8caf7225801a9760ffc90 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 10 Apr 2023 12:02:00 -0300 Subject: [PATCH] Extract 'invite to signal' into an InviteActions object. --- .../ConversationParentFragment.java | 34 +++++------- .../securesms/invites/InviteActions.kt | 53 +++++++++++++++++++ .../securesms/util/CommunicationActions.java | 16 +++++- 3 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/invites/InviteActions.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 15ce0867aa..fbd779d684 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -196,6 +196,7 @@ import org.thoughtcrime.securesms.groups.ui.invitesandrequests.ManagePendingAndR import org.thoughtcrime.securesms.groups.ui.migration.GroupsV1MigrationInitiationBottomSheetDialogFragment; import org.thoughtcrime.securesms.groups.ui.migration.GroupsV1MigrationSuggestionsDialog; import org.thoughtcrime.securesms.insights.InsightsLauncher; +import org.thoughtcrime.securesms.invites.InviteActions; import org.thoughtcrime.securesms.invites.InviteReminderModel; import org.thoughtcrime.securesms.invites.InviteReminderRepository; import org.thoughtcrime.securesms.jobs.ForceUpdateGroupV2Job; @@ -1142,27 +1143,18 @@ public class ConversationParentFragment extends Fragment @Override public void handleInviteLink() { - String inviteText = getString(R.string.ConversationActivity_lets_switch_to_signal, getString(R.string.install_url)); - - if (viewModel.isDefaultSmsApplication() && SignalStore.misc().getSmsExportPhase().isSmsSupported()) { - composeText.appendInvite(inviteText); - } else if (recipient.get().hasSmsAddress()) { - Intent intent = new Intent(Intent.ACTION_SENDTO); - intent.setData(Uri.parse("smsto:" + recipient.get().requireSmsAddress())); - intent.putExtra("sms_body", inviteText); - intent.putExtra(Intent.EXTRA_TEXT, inviteText); - startActivity(intent); - } else { - Intent sendIntent = new Intent(); - sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, inviteText); - sendIntent.setType("text/plain"); - if (sendIntent.resolveActivity(requireContext().getPackageManager()) != null) { - startActivity(Intent.createChooser(sendIntent, getString(R.string.InviteActivity_invite_to_signal))); - } else { - Toast.makeText(requireContext(), R.string.InviteActivity_no_app_to_share_to, Toast.LENGTH_LONG).show(); - } - } + InviteActions.INSTANCE.inviteUserToSignal( + requireContext(), + recipient.get(), + text -> { + composeText.appendInvite(text); + return Unit.INSTANCE; + }, + intent -> { + startActivity(intent); + return Unit.INSTANCE; + } + ); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/invites/InviteActions.kt b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteActions.kt new file mode 100644 index 0000000000..ff7e38dba7 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteActions.kt @@ -0,0 +1,53 @@ +package org.thoughtcrime.securesms.invites + +import android.content.Context +import android.content.Intent +import android.widget.Toast +import androidx.annotation.MainThread +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.util.CommunicationActions +import org.thoughtcrime.securesms.util.Util + +/** + * Handles 'invite to signal' actions. + */ +object InviteActions { + /** + * Called to send a message to a user to invite them to Signal. + * The invite can be sent in one of three ways: + * + * 1. If Signal is the user's default SMS app, we can simply append the message to the composer. + * 2. If the user has an sms address, we generate a SENDTO intent and request it to be launched. + * 3. Otherwise, we generate a share intent to allow the user to select how to send the invite. + */ + @MainThread + fun inviteUserToSignal( + context: Context, + recipient: Recipient, + appendInviteToComposer: ((String) -> Unit)?, + launchIntent: (Intent) -> Unit + ) { + val inviteText = context.getString( + R.string.ConversationActivity_lets_switch_to_signal, + context.getString(R.string.install_url) + ) + + if (appendInviteToComposer != null && Util.isDefaultSmsProvider(context) && SignalStore.misc().smsExportPhase.isSmsSupported()) { + appendInviteToComposer(inviteText) + } else if (recipient.hasSmsAddress()) { + launchIntent( + CommunicationActions.createIntentToComposeSmsThroughDefaultApp(recipient, inviteText) + ) + } else { + val intent = CommunicationActions.createIntentToShareTextViaShareSheet(inviteText) + + if (intent.resolveActivity(context.packageManager) != null) { + launchIntent(Intent.createChooser(intent, context.getString(R.string.InviteActivity_invite_to_signal))) + } else { + Toast.makeText(context, R.string.InviteActivity_no_app_to_share_to, Toast.LENGTH_LONG).show() + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java index 4e663bcca7..893e62c6f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java @@ -178,11 +178,25 @@ public class CommunicationActions { .show(); } - public static void composeSmsThroughDefaultApp(@NonNull Context context, @NonNull Recipient recipient, @Nullable String text) { + public static @NonNull Intent createIntentToShareTextViaShareSheet(@NonNull String text) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, text); + + return intent; + } + + public static @NonNull Intent createIntentToComposeSmsThroughDefaultApp(@NonNull Recipient recipient, @Nullable String text) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + recipient.requireSmsAddress())); if (text != null) { intent.putExtra("sms_body", text); } + + return intent; + } + + public static void composeSmsThroughDefaultApp(@NonNull Context context, @NonNull Recipient recipient, @Nullable String text) { + Intent intent = createIntentToComposeSmsThroughDefaultApp(recipient, text); context.startActivity(intent); }