Copione merged onto master
continuous-integration/drone/push Build is passing Details

master
blallo 2020-02-11 17:17:58 +00:00
commit 82382224c8
6 changed files with 78 additions and 37 deletions

View File

@ -188,8 +188,8 @@ dependencyVerification {
configuration = '(play|website)(Debug|Release)RuntimeClasspath'
}
def canonicalVersionCode = 604
def canonicalVersionName = "4.55.7"
def canonicalVersionCode = 605
def canonicalVersionName = "4.55.8"
def postFixSize = 10
def abiPostFix = ['universal' : 0,

View File

@ -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)

View File

@ -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

View File

@ -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<Event, MegaphoneRecord> records) {
@ -81,7 +82,7 @@ public final class Megaphones {
return new LinkedHashMap<Event, MegaphoneSchedule>() {{
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();
}

View File

@ -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) {

View File

@ -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">
<TextView
android:id="@+id/pin_reminder_title"
@ -19,25 +20,32 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/pin_wrapper"
<EditText
android:id="@+id/pin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="105sp"
android:paddingTop="40dp"
android:gravity="center"
android:textColor="?attr/registration_lock_reminder_view_pin_text_color"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/pin_reminder_title"
tools:text="******"/>
<TextView
android:id="@+id/pin_status"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="80dp"
android:paddingTop="40dp"
android:paddingEnd="80dp"
app:layout_constraintTop_toBottomOf="@id/pin_reminder_title"
android:gravity="center"
android:textColor="@color/core_red"
app:layout_constraintTop_toBottomOf="@id/pin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
app:layout_constraintEnd_toEndOf="parent"
tools:text="@string/KbsReminderDialog__incorrect_pin_try_again">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/pin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="?attr/registration_lock_reminder_view_pin_text_color" />
</com.google.android.material.textfield.TextInputLayout>
</TextView>
<TextView
android:id="@+id/reminder"
@ -47,7 +55,7 @@
android:paddingTop="40dp"
android:paddingBottom="40dp"
style="@style/Signal.Text.Preview"
app:layout_constraintTop_toBottomOf="@id/pin_wrapper"
app:layout_constraintTop_toBottomOf="@id/pin_status"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="@string/KbsReminderDialog__to_help_you_memorize_your_pin" />