diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java index c2be6e955c..dfa6729879 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java @@ -20,7 +20,7 @@ public final class PinValues { public void onEntrySuccess() { long nextInterval = SignalPinReminders.getNextInterval(getCurrentInterval()); - Log.w(TAG, "onEntrySuccess() nextInterval: " + nextInterval); + Log.i(TAG, "onEntrySuccess() nextInterval: " + nextInterval); store.beginWrite() .putLong(LAST_SUCCESSFUL_ENTRY, System.currentTimeMillis()) @@ -28,18 +28,29 @@ public final class PinValues { .apply(); } - public void onEntryFailure() { + public void onEntrySuccessWithWrongGuess() { long nextInterval = SignalPinReminders.getPreviousInterval(getCurrentInterval()); - Log.w(TAG, "onEntryFailure() nextInterval: " + nextInterval); + Log.i(TAG, "onEntrySuccessWithWrongGuess() nextInterval: " + nextInterval); + + store.beginWrite() + .putLong(LAST_SUCCESSFUL_ENTRY, System.currentTimeMillis()) + .putLong(NEXT_INTERVAL, nextInterval) + .apply(); + } + + public void onEntrySkipWithWrongGuess() { + long nextInterval = SignalPinReminders.getPreviousInterval(getCurrentInterval()); + Log.i(TAG, "onEntrySkipWithWrongGuess() nextInterval: " + nextInterval); store.beginWrite() .putLong(NEXT_INTERVAL, nextInterval) .apply(); } + public void onPinChange() { long nextInterval = SignalPinReminders.INITIAL_INTERVAL; - Log.w(TAG, "onPinChange() nextInterval: " + nextInterval); + Log.i(TAG, "onPinChange() nextInterval: " + nextInterval); store.beginWrite() .putLong(NEXT_INTERVAL, nextInterval) diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/SignalPinReminderDialog.java b/app/src/main/java/org/thoughtcrime/securesms/lock/SignalPinReminderDialog.java index 2240c72998..162714266e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/SignalPinReminderDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/SignalPinReminderDialog.java @@ -26,6 +26,7 @@ import androidx.core.app.DialogCompat; import com.google.android.material.textfield.TextInputLayout; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.lock.v2.CreateKbsPinActivity; @@ -41,6 +42,8 @@ public final class SignalPinReminderDialog { private static final String TAG = Log.tag(SignalPinReminderDialog.class); public static void show(@NonNull Context context, @NonNull Launcher launcher, @NonNull Callback mainCallback) { + Log.i(TAG, "Showing PIN reminder dialog."); + AlertDialog dialog = new AlertDialog.Builder(context, ThemeUtil.isDarkTheme(context) ? R.style.RationaleDialogDark_SignalAccent : R.style.RationaleDialogLight_SignalAccent) .setView(R.layout.kbs_pin_reminder_view) .setCancelable(false) @@ -55,11 +58,11 @@ public final class SignalPinReminderDialog { dialog.show(); dialog.getWindow().setLayout((int)(metrics.widthPixels * .80), ViewGroup.LayoutParams.WRAP_CONTENT); - TextInputLayout pinWrapper = (TextInputLayout) DialogCompat.requireViewById(dialog, R.id.pin_wrapper); - EditText pinEditText = (EditText) DialogCompat.requireViewById(dialog, R.id.pin); - TextView reminder = (TextView) DialogCompat.requireViewById(dialog, R.id.reminder); - View skip = DialogCompat.requireViewById(dialog, R.id.skip); - View submit = DialogCompat.requireViewById(dialog, R.id.submit); + EditText pinEditText = (EditText) DialogCompat.requireViewById(dialog, R.id.pin); + TextView pinStatus = (TextView) DialogCompat.requireViewById(dialog, R.id.pin_status); + TextView reminder = (TextView) DialogCompat.requireViewById(dialog, R.id.reminder); + View skip = DialogCompat.requireViewById(dialog, R.id.skip); + View submit = DialogCompat.requireViewById(dialog, R.id.submit); SpannableString reminderText = new SpannableString(context.getString(R.string.KbsReminderDialog__to_help_you_memorize_your_pin)); SpannableString forgotText = new SpannableString(context.getString(R.string.KbsReminderDialog__forgot_pin)); @@ -92,7 +95,7 @@ public final class SignalPinReminderDialog { reminder.setText(new SpannableStringBuilder(reminderText).append(" ").append(forgotText)); reminder.setMovementMethod(LinkMovementMethod.getInstance()); - PinVerifier.Callback callback = getPinWatcherCallback(context, dialog, pinWrapper, mainCallback); + PinVerifier.Callback callback = getPinWatcherCallback(context, dialog, pinEditText, pinStatus, mainCallback); PinVerifier verifier = SignalStore.kbsValues().isV2RegistrationLockEnabled() ? new V2PinVerifier() : new V1PinVerifier(context); @@ -102,16 +105,29 @@ public final class SignalPinReminderDialog { mainCallback.onReminderDismissed(callback.hadWrongGuess()); }); + submit.setEnabled(false); submit.setOnClickListener(v -> { Editable pinEditable = pinEditText.getText(); verifier.verifyPin(pinEditable == null ? null : pinEditable.toString(), callback); }); + + pinEditText.addTextChangedListener(new SimpleTextWatcher() { + @Override + public void onTextChanged(String text) { + if (text.length() >= KbsConstants.MINIMUM_POSSIBLE_PIN_LENGTH) { + submit.setEnabled(true); + } else { + submit.setEnabled(false); + } + } + }); } private static PinVerifier.Callback getPinWatcherCallback(@NonNull Context context, @NonNull AlertDialog dialog, - @NonNull TextInputLayout inputWrapper, + @NonNull EditText inputText, + @NonNull TextView statusText, @NonNull Callback mainCallback) { return new PinVerifier.Callback() { @@ -119,14 +135,17 @@ public final class SignalPinReminderDialog { @Override public void onPinCorrect() { + Log.i(TAG, "Correct PIN entry."); dialog.dismiss(); mainCallback.onReminderCompleted(hadWrongGuess); } @Override public void onPinWrong() { + Log.i(TAG, "Incorrect PIN entry."); hadWrongGuess = true; - inputWrapper.setError(context.getString(R.string.KbsReminderDialog__incorrect_pin_try_again)); + inputText.getText().clear(); + statusText.setText(context.getString(R.string.KbsReminderDialog__incorrect_pin_try_again)); } @Override 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 ac9bc3def1..9aa1487688 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -13,13 +13,12 @@ import org.thoughtcrime.securesms.database.model.MegaphoneRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.lock.RegistrationLockDialog; -import org.thoughtcrime.securesms.lock.RegistrationLockReminders; import org.thoughtcrime.securesms.lock.SignalPinReminderDialog; import org.thoughtcrime.securesms.lock.SignalPinReminders; import org.thoughtcrime.securesms.lock.v2.CreateKbsPinActivity; import org.thoughtcrime.securesms.lock.v2.KbsMigrationActivity; import org.thoughtcrime.securesms.lock.v2.PinUtil; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.FeatureFlags; import java.util.LinkedHashMap; @@ -42,6 +41,8 @@ import java.util.Objects; */ public final class Megaphones { + private static final String TAG = Log.tag(Megaphones.class); + private Megaphones() {} static @Nullable Megaphone getNextMegaphone(@NonNull Context context, @NonNull Map records) { @@ -81,7 +82,7 @@ public final class Megaphones { return new LinkedHashMap() {{ put(Event.REACTIONS, new ForeverSchedule(true)); put(Event.PINS_FOR_ALL, new PinsForAllSchedule()); - put(Event.PIN_REMINDER, new PinReminderSchedule()); + put(Event.PIN_REMINDER, new SignalPinReminderSchedule()); }}; } @@ -161,15 +162,17 @@ public final class Megaphones { SignalPinReminderDialog.show(controller.getMegaphoneActivity(), controller::onMegaphoneNavigationRequested, new SignalPinReminderDialog.Callback() { @Override public void onReminderDismissed(boolean includedFailure) { + Log.i(TAG, "[PinReminder] onReminderDismissed(" + includedFailure + ")"); if (includedFailure) { - SignalStore.pinValues().onEntryFailure(); + SignalStore.pinValues().onEntrySkipWithWrongGuess(); } } @Override public void onReminderCompleted(boolean includedFailure) { + Log.i(TAG, "[PinReminder] onReminderCompleted(" + includedFailure + ")"); if (includedFailure) { - SignalStore.pinValues().onEntryFailure(); + SignalStore.pinValues().onEntrySuccessWithWrongGuess(); } else { SignalStore.pinValues().onEntrySuccess(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinReminderSchedule.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule.java similarity index 90% rename from app/src/main/java/org/thoughtcrime/securesms/megaphone/PinReminderSchedule.java rename to app/src/main/java/org/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule.java index 0d6e587e7a..43c35ec7ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinReminderSchedule.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule.java @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.megaphone; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.util.FeatureFlags; -final class PinReminderSchedule implements MegaphoneSchedule { +final class SignalPinReminderSchedule implements MegaphoneSchedule { @Override public boolean shouldDisplay(int seenCount, long lastSeen, long firstVisible, long currentTime) { diff --git a/app/src/main/res/layout/kbs_pin_reminder_view.xml b/app/src/main/res/layout/kbs_pin_reminder_view.xml index a4a00aac43..7ad872a103 100644 --- a/app/src/main/res/layout/kbs_pin_reminder_view.xml +++ b/app/src/main/res/layout/kbs_pin_reminder_view.xml @@ -5,7 +5,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:padding="20dp"> + android:padding="20dp" + tools:layout_width="300dp"> - + + + app:layout_constraintEnd_toEndOf="parent" + tools:text="@string/KbsReminderDialog__incorrect_pin_try_again"> - - - +