From 8f9e79ae37c4415995c9b16d504b96b318930e74 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 16 Apr 2020 13:37:15 -0400 Subject: [PATCH] Updated PIN strings. --- .../securesms/lock/v2/BaseKbsPinFragment.java | 10 +- .../lock/v2/ConfirmKbsPinFragment.java | 4 +- .../lock/v2/CreateKbsPinFragment.java | 15 +-- .../securesms/lock/v2/KbsSplashFragment.java | 2 +- .../securesms/megaphone/Megaphones.java | 2 +- .../pin/RegistrationLockV2Dialog.java | 107 ++++++++++++++++++ .../AppProtectionPreferenceFragment.java | 32 ++---- .../util/views/LearnMoreTextView.java | 95 ++++++++++++++++ .../main/res/layout/base_kbs_pin_fragment.xml | 8 +- .../layout/registration_lock_v2_dialog.xml | 20 ++++ app/src/main/res/values-ca/strings.xml | 4 - app/src/main/res/values-cs/strings.xml | 6 - app/src/main/res/values-cy/strings.xml | 6 - app/src/main/res/values-de/strings.xml | 4 - app/src/main/res/values-el/strings.xml | 4 - app/src/main/res/values-eo/strings.xml | 4 - app/src/main/res/values-es/strings.xml | 4 - app/src/main/res/values-eu/strings.xml | 4 - app/src/main/res/values-fa/strings.xml | 4 - app/src/main/res/values-fi/strings.xml | 4 - app/src/main/res/values-fr/strings.xml | 4 - app/src/main/res/values-hu/strings.xml | 4 - app/src/main/res/values-in/strings.xml | 3 - app/src/main/res/values-it/strings.xml | 4 - app/src/main/res/values-iw/strings.xml | 6 - app/src/main/res/values-ja/strings.xml | 3 - app/src/main/res/values-km/strings.xml | 3 - app/src/main/res/values-kn/strings.xml | 4 - app/src/main/res/values-ko/strings.xml | 3 - app/src/main/res/values-lt/strings.xml | 6 - app/src/main/res/values-nb/strings.xml | 4 - app/src/main/res/values-nl/strings.xml | 4 - app/src/main/res/values-nn/strings.xml | 4 - app/src/main/res/values-pa-rPK/strings.xml | 4 - app/src/main/res/values-pl/strings.xml | 6 - app/src/main/res/values-pt-rBR/strings.xml | 4 - app/src/main/res/values-pt/strings.xml | 4 - app/src/main/res/values-ro/strings.xml | 5 - app/src/main/res/values-ru/strings.xml | 6 - app/src/main/res/values-sk/strings.xml | 6 - app/src/main/res/values-sl/strings.xml | 6 - app/src/main/res/values-sq/strings.xml | 4 - app/src/main/res/values-sv/strings.xml | 4 - app/src/main/res/values-sw/strings.xml | 4 - app/src/main/res/values-th/strings.xml | 3 - app/src/main/res/values-tl/strings.xml | 4 - app/src/main/res/values-tr/strings.xml | 4 - app/src/main/res/values-vi/strings.xml | 3 - app/src/main/res/values-zh-rCN/strings.xml | 3 - app/src/main/res/values-zh-rTW/strings.xml | 3 - app/src/main/res/values/strings.xml | 24 ++-- 51 files changed, 268 insertions(+), 220 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/pin/RegistrationLockV2Dialog.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/views/LearnMoreTextView.java create mode 100644 app/src/main/res/layout/registration_lock_v2_dialog.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseKbsPinFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseKbsPinFragment.java index dc51927351..b3b070c548 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseKbsPinFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseKbsPinFragment.java @@ -18,12 +18,14 @@ import androidx.fragment.app.Fragment; import com.airbnb.lottie.LottieAnimationView; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.text.AfterTextChanged; +import org.thoughtcrime.securesms.util.views.LearnMoreTextView; abstract class BaseKbsPinFragment extends Fragment { private TextView title; - private TextView description; + private LearnMoreTextView description; private EditText input; private TextView label; private TextView keyboardToggle; @@ -57,6 +59,10 @@ abstract class BaseKbsPinFragment extends keyboardToggle.setText(resolveKeyboardToggleText(keyboardType)); }); + description.setOnLinkClickListener(v -> { + CommunicationActions.openBrowserLink(requireContext(), getString(R.string.BaseKbsPinFragment__learn_more_url)); + }); + initializeListeners(); } @@ -75,7 +81,7 @@ abstract class BaseKbsPinFragment extends return title; } - protected TextView getDescription() { + protected LearnMoreTextView getDescription() { return description; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/ConfirmKbsPinFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/ConfirmKbsPinFragment.java index 2cd8b2b17a..c5dd92bfe4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/ConfirmKbsPinFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/ConfirmKbsPinFragment.java @@ -62,11 +62,13 @@ public class ConfirmKbsPinFragment extends BaseKbsPinFragment { - private static final int PIN_LOCKOUT_DAYS = 7; - @Override protected void initializeViewStates() { CreateKbsPinFragmentArgs args = CreateKbsPinFragmentArgs.fromBundle(requireArguments()); @@ -29,18 +27,18 @@ public class CreateKbsPinFragment extends BaseKbsPinFragment onConfirmPin(e.getUserEntry(), e.getKeyboard(), args.getIsPinChange())); viewModel.getKeyboard().observe(getViewLifecycleOwner(), k -> { getLabel().setText(getLabelText(k)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java index 75e434476b..02c9db412d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java @@ -66,7 +66,7 @@ public final class KbsSplashFragment extends Fragment { private void setUpRegLockDisabled() { title.setText(R.string.KbsSplashFragment__introducing_pins); - description.setText(R.string.KbsSplashFragment__pins_add_another_level_of_security_to_your_account); + description.setText(R.string.KbsSplashFragment__pins_keep_information_stored_with_signal_encrypted); primaryAction.setText(R.string.KbsSplashFragment__create_your_pin); secondaryAction.setText(R.string.KbsSplashFragment__learn_more); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index c07ead50ab..932761fb3f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -138,7 +138,7 @@ public final class Megaphones { .setMandatory(true) .setImage(R.drawable.kbs_pin_megaphone) .setTitle(R.string.KbsMegaphone__create_a_pin) - .setBody(R.string.KbsMegaphone__pins_add_another_layer_of_security_to_your_signal_account) + .setBody(R.string.KbsMegaphone__pins_keep_information_thats_stored_with_signal_encrytped) .setActionButton(R.string.KbsMegaphone__create_pin, (megaphone, listener) -> { Intent intent = CreateKbsPinActivity.getIntentForPinCreate(ApplicationDependencies.getApplication()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/RegistrationLockV2Dialog.java b/app/src/main/java/org/thoughtcrime/securesms/pin/RegistrationLockV2Dialog.java new file mode 100644 index 0000000000..7b52b764ab --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/RegistrationLockV2Dialog.java @@ -0,0 +1,107 @@ +package org.thoughtcrime.securesms.pin; + +import android.content.Context; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; +import org.thoughtcrime.securesms.util.concurrent.SimpleTask; + +import java.io.IOException; +import java.util.Objects; + +public final class RegistrationLockV2Dialog { + + private static final String TAG = Log.tag(RegistrationLockV2Dialog.class); + + private RegistrationLockV2Dialog() {} + + public static void showEnableDialog(@NonNull Context context, @NonNull Runnable onSuccess) { + AlertDialog dialog = new AlertDialog.Builder(context) + .setTitle(R.string.RegistrationLockV2Dialog_turn_on_registration_lock) + .setView(R.layout.registration_lock_v2_dialog) + .setMessage(R.string.RegistrationLockV2Dialog_if_you_forget_your_signal_pin_when_registering_again) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.RegistrationLockV2Dialog_turn_on, null) + .create(); + dialog.setOnShowListener(d -> { + ProgressBar progress = Objects.requireNonNull(dialog.findViewById(R.id.reglockv2_dialog_progress)); + View positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + + positiveButton.setOnClickListener(v -> { + progress.setIndeterminate(true); + progress.setVisibility(View.VISIBLE); + + SimpleTask.run(SignalExecutors.UNBOUNDED, () -> { + try { + PinState.onEnableRegistrationLockForUserWithPin(); + Log.i(TAG, "Successfully enabled registration lock."); + return true; + } catch (IOException e) { + Log.w(TAG, "Failed to enable registration lock setting.", e); + return false; + } + }, (success) -> { + progress.setVisibility(View.GONE); + + if (!success) { + Toast.makeText(context, R.string.preferences_app_protection__failed_to_enable_registration_lock, Toast.LENGTH_LONG).show(); + } else { + onSuccess.run(); + } + + dialog.dismiss(); + }); + }); + }); + + dialog.show(); + } + + public static void showDisableDialog(@NonNull Context context, @NonNull Runnable onSuccess) { + AlertDialog dialog = new AlertDialog.Builder(context) + .setTitle(R.string.RegistrationLockV2Dialog_turn_off_registration_lock) + .setView(R.layout.registration_lock_v2_dialog) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.RegistrationLockV2Dialog_turn_off, null) + .create(); + dialog.setOnShowListener(d -> { + ProgressBar progress = Objects.requireNonNull(dialog.findViewById(R.id.reglockv2_dialog_progress)); + View positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + + positiveButton.setOnClickListener(v -> { + progress.setIndeterminate(true); + progress.setVisibility(View.VISIBLE); + + SimpleTask.run(SignalExecutors.UNBOUNDED, () -> { + try { + PinState.onDisableRegistrationLockForUserWithPin(); + Log.i(TAG, "Successfully disabled registration lock."); + return true; + } catch (IOException e) { + Log.w(TAG, "Failed to disable registration lock.", e); + return false; + } + }, (success) -> { + progress.setVisibility(View.GONE); + + if (!success) { + Toast.makeText(context, R.string.preferences_app_protection__failed_to_disable_registration_lock, Toast.LENGTH_LONG).show(); + } else { + onSuccess.run(); + } + + dialog.dismiss(); + }); + }); + }); + + dialog.show(); + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java index 75ff02fa29..f0711c8a45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java @@ -31,6 +31,7 @@ import org.thoughtcrime.securesms.lock.v2.CreateKbsPinActivity; import org.thoughtcrime.securesms.lock.v2.RegistrationLockUtil; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.pin.PinState; +import org.thoughtcrime.securesms.pin.RegistrationLockV2Dialog; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.storage.StorageSyncHelper; @@ -417,35 +418,16 @@ public class AppProtectionPreferenceFragment extends CorrectedPreferenceFragment @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean value = (boolean) newValue; - AlertDialog loading = SimpleProgressDialog.show(requireContext()); Log.i(TAG, "Getting ready to change registration lock setting to: " + value); - SimpleTask.run(SignalExecutors.UNBOUNDED, () -> { - try { - if (value) { - PinState.onEnableRegistrationLockForUserWithPin(); - Log.i(TAG, "Successfully enabled registration lock."); - } else { - PinState.onDisableRegistrationLockForUserWithPin(); - Log.i(TAG, "Successfully disabled registration lock."); - } - return true; - } catch (IOException e) { - Log.w(TAG, "Failed to change registration lock setting.", e); - return false; - } - }, (success) -> { - loading.dismiss(); + if (value) { + RegistrationLockV2Dialog.showEnableDialog(requireContext(), () -> ((CheckBoxPreference) preference).setChecked(true)); + } else { + RegistrationLockV2Dialog.showDisableDialog(requireContext(), () -> ((CheckBoxPreference) preference).setChecked(false)); + } - if (!success) { - int stringRes = value ? R.string.preferences_app_protection__failed_to_enable_registration_lock - : R.string.preferences_app_protection__failed_to_disable_registration_lock; - - Toast.makeText(requireContext(), stringRes, Toast.LENGTH_LONG).show(); - } - }); - return true; + return false; } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/views/LearnMoreTextView.java b/app/src/main/java/org/thoughtcrime/securesms/util/views/LearnMoreTextView.java new file mode 100644 index 0000000000..6ead2bc2cb --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/views/LearnMoreTextView.java @@ -0,0 +1,95 @@ +package org.thoughtcrime.securesms.util.views; + +import android.content.Context; +import android.graphics.Color; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.ThemeUtil; + +public class LearnMoreTextView extends AppCompatTextView { + + private OnClickListener linkListener; + private Spannable link; + private boolean visible; + private CharSequence baseText; + + public LearnMoreTextView(Context context) { + super(context); + init(); + } + + public LearnMoreTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + setMovementMethod(LinkMovementMethod.getInstance()); + + ClickableSpan clickable = new ClickableSpan() { + @Override + public void updateDrawState(@NonNull TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + ds.setColor(ThemeUtil.getThemedColor(getContext(), R.attr.colorAccent)); + } + + @Override + public void onClick(@NonNull View widget) { + if (linkListener != null) { + linkListener.onClick(widget); + } + } + }; + + link = new SpannableString(getContext().getString(R.string.LearnMoreTextView_learn_more)); + link.setSpan(clickable, 0, link.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + visible = true; + } + + @Override + public void setText(CharSequence text, BufferType type) { + baseText = text; + setTextInternal(baseText, type); + } + + @Override + public void setTextColor(int color) { + super.setTextColor(color); + } + + public void setOnLinkClickListener(@Nullable OnClickListener listener) { + this.linkListener = listener; + } + + public void setLearnMoreVisible(boolean visible) { + this.visible = visible; + setTextInternal(baseText, visible ? BufferType.SPANNABLE : BufferType.NORMAL); + } + + private void setTextInternal(CharSequence text, BufferType type) { + if (visible) { + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append(text).append(' ').append(link); + + super.setText(builder, BufferType.SPANNABLE); + } else { + super.setText(text, type); + } + } +} + diff --git a/app/src/main/res/layout/base_kbs_pin_fragment.xml b/app/src/main/res/layout/base_kbs_pin_fragment.xml index 8acfc0533c..a5e365b08a 100644 --- a/app/src/main/res/layout/base_kbs_pin_fragment.xml +++ b/app/src/main/res/layout/base_kbs_pin_fragment.xml @@ -20,9 +20,9 @@ app:layout_constraintBottom_toTopOf="@id/edit_kbs_pin_keyboard_toggle" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.20" - tools:text="Create your PIN" /> + tools:text="@string/CreateKbsPinFragment__create_your_pin" /> - + tools:text="@string/CreateKbsPinFragment__pins_keep_information_stored_with_signal_encrypted" /> + tools:text="PIN must be at least 4 digits" />