From dcfa7e3b365ffbd763db38fc3003c297e998f30a Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 1 Feb 2021 11:58:33 -0500 Subject: [PATCH] Allow contact support from registration lock and screen lock screens. --- .../securesms/PassphrasePromptActivity.java | 23 +++++++++++++++--- .../fragments/RegistrationLockFragment.java | 24 +++++++++++++++++-- .../{log_submit.xml => passphrase_prompt.xml} | 3 +++ app/src/main/res/values/strings.xml | 3 +++ 4 files changed, 48 insertions(+), 5 deletions(-) rename app/src/main/res/menu/{log_submit.xml => passphrase_prompt.xml} (69%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java index 23a19dc753..5509d40aba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java @@ -57,8 +57,10 @@ import org.thoughtcrime.securesms.crypto.InvalidPassphraseException; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.crypto.MasterSecretUtil; import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity; +import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.DynamicIntroTheme; import org.thoughtcrime.securesms.util.DynamicLanguage; +import org.thoughtcrime.securesms.util.SupportEmailUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; /** @@ -137,7 +139,7 @@ public class PassphrasePromptActivity extends PassphraseActivity { MenuInflater inflater = this.getMenuInflater(); menu.clear(); - inflater.inflate(R.menu.log_submit, menu); + inflater.inflate(R.menu.passphrase_prompt, menu); super.onCreateOptionsMenu(menu); return true; @@ -146,8 +148,12 @@ public class PassphrasePromptActivity extends PassphraseActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); - switch (item.getItemId()) { - case R.id.menu_submit_debug_logs: handleLogSubmit(); return true; + if (item.getItemId() == R.id.menu_submit_debug_logs) { + handleLogSubmit(); + return true; + } else if (item.getItemId() == R.id.menu_contact_support) { + sendEmailToSupport(); + return true; } return false; @@ -294,6 +300,17 @@ public class PassphrasePromptActivity extends PassphraseActivity { } } + private void sendEmailToSupport() { + String body = SupportEmailUtil.generateSupportEmailBody(this, + R.string.PassphrasePromptActivity_signal_android_lock_screen, + null, + null); + CommunicationActions.openEmail(this, + SupportEmailUtil.getSupportEmailAddress(this), + getString(R.string.PassphrasePromptActivity_signal_android_lock_screen), + body); + } + private class PassphraseActionListener implements TextView.OnEditorActionListener { @Override public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent keyEvent) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java index 8891b9d87c..2596cf193b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java @@ -29,7 +29,9 @@ import org.thoughtcrime.securesms.pin.PinRestoreRepository.TokenData; import org.thoughtcrime.securesms.registration.service.CodeVerificationRequest; import org.thoughtcrime.securesms.registration.service.RegistrationService; import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel; +import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.ServiceUtil; +import org.thoughtcrime.securesms.util.SupportEmailUtil; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import java.util.concurrent.TimeUnit; @@ -47,6 +49,7 @@ public final class RegistrationLockFragment extends BaseRegistrationFragment { private TextView errorLabel; private TextView keyboardToggle; private long timeRemaining; + private boolean isV1RegistrationLock; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -67,9 +70,10 @@ public final class RegistrationLockFragment extends BaseRegistrationFragment { RegistrationLockFragmentArgs args = RegistrationLockFragmentArgs.fromBundle(requireArguments()); - timeRemaining = args.getTimeRemaining(); + timeRemaining = args.getTimeRemaining(); + isV1RegistrationLock = args.getIsV1RegistrationLock(); - if (args.getIsV1RegistrationLock()) { + if (isV1RegistrationLock) { keyboardToggle.setVisibility(View.GONE); } @@ -117,6 +121,7 @@ public final class RegistrationLockFragment extends BaseRegistrationFragment { .setTitle(R.string.RegistrationLockFragment__not_many_tries_left) .setMessage(getTriesRemainingDialogMessage(triesRemaining, daysRemaining)) .setPositiveButton(android.R.string.ok, null) + .setNeutralButton(R.string.PinRestoreEntryFragment_contact_support, (dialog, which) -> sendEmailToSupport()) .show(); } @@ -264,6 +269,7 @@ public final class RegistrationLockFragment extends BaseRegistrationFragment { .setTitle(R.string.RegistrationLockFragment__forgot_your_pin) .setMessage(requireContext().getResources().getQuantityString(R.plurals.RegistrationLockFragment__for_your_privacy_and_security_there_is_no_way_to_recover, lockoutDays, lockoutDays)) .setPositiveButton(android.R.string.ok, null) + .setNeutralButton(R.string.PinRestoreEntryFragment_contact_support, (dialog, which) -> sendEmailToSupport()) .show(); } @@ -320,4 +326,18 @@ public final class RegistrationLockFragment extends BaseRegistrationFragment { Navigation.findNavController(requireView()).navigate(RegistrationLockFragmentDirections.actionSuccessfulRegistration()); }); } + + private void sendEmailToSupport() { + int subject = isV1RegistrationLock ? R.string.RegistrationLockFragment__signal_registration_need_help_with_pin_for_android_v1_pin + : R.string.RegistrationLockFragment__signal_registration_need_help_with_pin_for_android_v2_pin; + + String body = SupportEmailUtil.generateSupportEmailBody(requireContext(), + subject, + null, + null); + CommunicationActions.openEmail(requireContext(), + SupportEmailUtil.getSupportEmailAddress(requireContext()), + getString(subject), + body); + } } diff --git a/app/src/main/res/menu/log_submit.xml b/app/src/main/res/menu/passphrase_prompt.xml similarity index 69% rename from app/src/main/res/menu/log_submit.xml rename to app/src/main/res/menu/passphrase_prompt.xml index abd321d48d..a3ee2a9b9a 100644 --- a/app/src/main/res/menu/log_submit.xml +++ b/app/src/main/res/menu/passphrase_prompt.xml @@ -4,4 +4,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86013f71e4..4580b94940 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1278,6 +1278,7 @@ Submit passphrase Invalid passphrase! Unlock Signal + Signal Android - Lock Screen Map @@ -2563,6 +2564,8 @@ Incorrect PIN Forgot your PIN? Not many tries left! + Signal Registration - Need Help with PIN for Android (v1 PIN) + Signal Registration - Need Help with PIN for Android (v2 PIN) For your privacy and security, there is no way to recover your PIN. If you can\'t remember your PIN, you can re-verify with SMS after %1$d day of inactivity. In this case, your account will be wiped and all content deleted.