Update PIN switch keyboard button to be more straightforward.

Addresses #12866.
This commit is contained in:
Nicholas 2023-06-23 10:00:19 -04:00 committed by Nicholas Tinsley
parent 2dd0221680
commit 8ae115028e
13 changed files with 132 additions and 64 deletions

View file

@ -7,7 +7,6 @@ import android.graphics.Typeface
import android.text.InputType import android.text.InputType
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
@ -18,6 +17,7 @@ import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.Navigation import androidx.navigation.Navigation
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
@ -208,15 +208,15 @@ class AccountSettingsFragment : DSLSettingsFragment(R.string.AccountSettingsFrag
val statusText = DialogCompat.requireViewById(dialog, R.id.reminder_disable_status) as TextView val statusText = DialogCompat.requireViewById(dialog, R.id.reminder_disable_status) as TextView
val cancelButton = DialogCompat.requireViewById(dialog, R.id.reminder_disable_cancel) val cancelButton = DialogCompat.requireViewById(dialog, R.id.reminder_disable_cancel)
val turnOffButton = DialogCompat.requireViewById(dialog, R.id.reminder_disable_turn_off) val turnOffButton = DialogCompat.requireViewById(dialog, R.id.reminder_disable_turn_off)
val changeKeyboard = DialogCompat.requireViewById(dialog, R.id.reminder_change_keyboard) as Button val changeKeyboard = DialogCompat.requireViewById(dialog, R.id.reminder_change_keyboard) as MaterialButton
changeKeyboard.setOnClickListener { changeKeyboard.setOnClickListener {
if (pinEditText.inputType and InputType.TYPE_CLASS_NUMBER == 0) { if (pinEditText.inputType and InputType.TYPE_CLASS_NUMBER == 0) {
pinEditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD pinEditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD
changeKeyboard.setText(R.string.PinRestoreEntryFragment_enter_alphanumeric_pin) changeKeyboard.setIconResource(PinKeyboardType.ALPHA_NUMERIC.iconResource)
} else { } else {
pinEditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD pinEditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
changeKeyboard.setText(R.string.PinRestoreEntryFragment_enter_numeric_pin) changeKeyboard.setIconResource(PinKeyboardType.NUMERIC.iconResource)
} }
pinEditText.typeface = Typeface.DEFAULT pinEditText.typeface = Typeface.DEFAULT
} }
@ -230,11 +230,11 @@ class AccountSettingsFragment : DSLSettingsFragment(R.string.AccountSettingsFrag
when (SignalStore.pinValues().keyboardType) { when (SignalStore.pinValues().keyboardType) {
PinKeyboardType.NUMERIC -> { PinKeyboardType.NUMERIC -> {
pinEditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD pinEditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD
changeKeyboard.setText(R.string.PinRestoreEntryFragment_enter_alphanumeric_pin) changeKeyboard.setIconResource(PinKeyboardType.ALPHA_NUMERIC.iconResource)
} }
PinKeyboardType.ALPHA_NUMERIC -> { PinKeyboardType.ALPHA_NUMERIC -> {
pinEditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD pinEditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
changeKeyboard.setText(R.string.PinRestoreEntryFragment_enter_numeric_pin) changeKeyboard.setIconResource(PinKeyboardType.NUMERIC.iconResource)
} }
} }

View file

@ -14,12 +14,15 @@ import android.view.inputmethod.EditorInfo;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import com.google.android.material.button.MaterialButton;
import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.LoggingFragment;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
@ -36,7 +39,7 @@ public abstract class BaseKbsPinFragment<ViewModel extends BaseKbsPinViewModel>
private LearnMoreTextView description; private LearnMoreTextView description;
private EditText input; private EditText input;
private TextView label; private TextView label;
private TextView keyboardToggle; private MaterialButton keyboardToggle;
private CircularProgressMaterialButton confirm; private CircularProgressMaterialButton confirm;
private ViewModel viewModel; private ViewModel viewModel;
@ -69,6 +72,7 @@ public abstract class BaseKbsPinFragment<ViewModel extends BaseKbsPinViewModel>
viewModel.getKeyboard().observe(getViewLifecycleOwner(), keyboardType -> { viewModel.getKeyboard().observe(getViewLifecycleOwner(), keyboardType -> {
updateKeyboard(keyboardType); updateKeyboard(keyboardType);
keyboardToggle.setText(resolveKeyboardToggleText(keyboardType)); keyboardToggle.setText(resolveKeyboardToggleText(keyboardType));
keyboardToggle.setIconResource(keyboardType.getOther().getIconResource());
}); });
description.setOnLinkClickListener(v -> { description.setOnLinkClickListener(v -> {

View file

@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.lock.v2;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.R;
public enum PinKeyboardType { public enum PinKeyboardType {
NUMERIC("numeric"), NUMERIC("numeric"),
ALPHA_NUMERIC("alphaNumeric"); ALPHA_NUMERIC("alphaNumeric");
@ -30,4 +32,9 @@ public enum PinKeyboardType {
return NUMERIC; return NUMERIC;
} }
public int getIconResource() {
if (this == ALPHA_NUMERIC) return R.drawable.ic_keyboard_24;
else return R.drawable.ic_number_pad_conversation_filter_24;
}
} }

View file

@ -14,12 +14,12 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.autofill.HintConstants; import androidx.autofill.HintConstants;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
@ -52,7 +52,7 @@ public class PinRestoreEntryFragment extends LoggingFragment {
private View skipButton; private View skipButton;
private CircularProgressMaterialButton pinButton; private CircularProgressMaterialButton pinButton;
private TextView errorLabel; private TextView errorLabel;
private TextView keyboardToggle; private MaterialButton keyboardToggle;
private PinRestoreViewModel viewModel; private PinRestoreViewModel viewModel;
@Override @Override
@ -102,12 +102,12 @@ public class PinRestoreEntryFragment extends LoggingFragment {
keyboardToggle.setOnClickListener((v) -> { keyboardToggle.setOnClickListener((v) -> {
PinKeyboardType keyboardType = getPinEntryKeyboardType(); PinKeyboardType keyboardType = getPinEntryKeyboardType();
keyboardToggle.setIconResource(keyboardType.getIconResource());
updateKeyboard(keyboardType.getOther()); updateKeyboard(keyboardType.getOther());
keyboardToggle.setText(resolveKeyboardToggleText(keyboardType));
}); });
PinKeyboardType keyboardType = getPinEntryKeyboardType().getOther(); keyboardToggle.setIconResource(getPinEntryKeyboardType().getOther().getIconResource());
keyboardToggle.setText(resolveKeyboardToggleText(keyboardType));
} }
private void initViewModel() { private void initViewModel() {
@ -260,14 +260,6 @@ public class PinRestoreEntryFragment extends LoggingFragment {
pinEntry.getText().clear(); pinEntry.getText().clear();
} }
private @StringRes static int resolveKeyboardToggleText(@NonNull PinKeyboardType keyboard) {
if (keyboard == PinKeyboardType.ALPHA_NUMERIC) {
return R.string.PinRestoreEntryFragment_enter_alphanumeric_pin;
} else {
return R.string.PinRestoreEntryFragment_enter_numeric_pin;
}
}
private void enableAndFocusPinEntry() { private void enableAndFocusPinEntry() {
pinEntry.setEnabled(true); pinEntry.setEnabled(true);
pinEntry.setFocusable(true); pinEntry.setFocusable(true);

View file

@ -10,10 +10,11 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
@ -49,7 +50,7 @@ public abstract class BaseRegistrationLockFragment extends LoggingFragment {
private View forgotPin; private View forgotPin;
protected CircularProgressMaterialButton pinButton; protected CircularProgressMaterialButton pinButton;
private TextView errorLabel; private TextView errorLabel;
private TextView keyboardToggle; private MaterialButton keyboardToggle;
private long timeRemaining; private long timeRemaining;
private BaseRegistrationViewModel viewModel; private BaseRegistrationViewModel viewModel;
@ -101,11 +102,11 @@ public abstract class BaseRegistrationLockFragment extends LoggingFragment {
PinKeyboardType keyboardType = getPinEntryKeyboardType(); PinKeyboardType keyboardType = getPinEntryKeyboardType();
updateKeyboard(keyboardType.getOther()); updateKeyboard(keyboardType.getOther());
keyboardToggle.setText(resolveKeyboardToggleText(keyboardType)); keyboardToggle.setIconResource(keyboardType.getIconResource());
}); });
PinKeyboardType keyboardType = getPinEntryKeyboardType().getOther(); PinKeyboardType keyboardType = getPinEntryKeyboardType().getOther();
keyboardToggle.setText(resolveKeyboardToggleText(keyboardType)); keyboardToggle.setIconResource(keyboardType.getIconResource());
disposables.bindTo(getViewLifecycleOwner().getLifecycle()); disposables.bindTo(getViewLifecycleOwner().getLifecycle());
viewModel = getViewModel(); viewModel = getViewModel();
@ -274,14 +275,6 @@ public abstract class BaseRegistrationLockFragment extends LoggingFragment {
pinEntry.getText().clear(); pinEntry.getText().clear();
} }
private @StringRes static int resolveKeyboardToggleText(@NonNull PinKeyboardType keyboard) {
if (keyboard == PinKeyboardType.ALPHA_NUMERIC) {
return R.string.RegistrationLockFragment__enter_alphanumeric_pin;
} else {
return R.string.RegistrationLockFragment__enter_numeric_pin;
}
}
private void enableAndFocusPinEntry() { private void enableAndFocusPinEntry() {
pinEntry.setEnabled(true); pinEntry.setEnabled(true);
pinEntry.setFocusable(true); pinEntry.setFocusable(true);

View file

@ -5,7 +5,6 @@ import android.text.InputType
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.Toast import android.widget.Toast
import androidx.annotation.StringRes
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
@ -74,13 +73,12 @@ class ReRegisterWithPinFragment : LoggingFragment(R.layout.pin_restore_entry_fra
} }
binding.pinRestoreKeyboardToggle.setOnClickListener { binding.pinRestoreKeyboardToggle.setOnClickListener {
val keyboardType: PinKeyboardType = getPinEntryKeyboardType() val currentKeyboardType: PinKeyboardType = getPinEntryKeyboardType()
updateKeyboard(keyboardType.other) updateKeyboard(currentKeyboardType.other)
binding.pinRestoreKeyboardToggle.setText(resolveKeyboardToggleText(keyboardType)) binding.pinRestoreKeyboardToggle.setIconResource(currentKeyboardType.iconResource)
} }
val keyboardType: PinKeyboardType = getPinEntryKeyboardType().other binding.pinRestoreKeyboardToggle.setIconResource(getPinEntryKeyboardType().other.iconResource)
binding.pinRestoreKeyboardToggle.setText(resolveKeyboardToggleText(keyboardType))
reRegisterViewModel.updateTokenData(registrationViewModel.keyBackupCurrentToken) reRegisterViewModel.updateTokenData(registrationViewModel.keyBackupCurrentToken)
@ -212,15 +210,6 @@ class ReRegisterWithPinFragment : LoggingFragment(R.layout.pin_restore_entry_fra
binding.pinRestorePinInput.text?.clear() binding.pinRestorePinInput.text?.clear()
} }
@StringRes
private fun resolveKeyboardToggleText(keyboard: PinKeyboardType): Int {
return if (keyboard == PinKeyboardType.ALPHA_NUMERIC) {
R.string.RegistrationLockFragment__enter_alphanumeric_pin
} else {
R.string.RegistrationLockFragment__enter_numeric_pin
}
}
private fun onNeedHelpClicked() { private fun onNeedHelpClicked() {
val message = if (reRegisterViewModel.isLocalVerification) R.string.ReRegisterWithPinFragment_need_help_local else R.string.PinRestoreEntryFragment_your_pin_is_a_d_digit_code val message = if (reRegisterViewModel.isLocalVerification) R.string.ReRegisterWithPinFragment_need_help_local else R.string.PinRestoreEntryFragment_your_pin_is_a_d_digit_code

View file

@ -1,5 +1,43 @@
<vector android:autoMirrored="true" android:height="24dp" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@color/signal_icon_tint_primary" android:pathData="M20,4.5A1.538,1.538 0,0 1,21.5 6L21.5,17.5A1.538,1.538 0,0 1,20 19L4,19a1.538,1.538 0,0 1,-1.5 -1.5L2.5,6A1.538,1.538 0,0 1,4 4.5L20,4.5M20,3L4,3A2.946,2.946 0,0 0,1 6L1,17.5a2.946,2.946 0,0 0,3 3L20,20.5a2.946,2.946 0,0 0,3 -3L23,6A2.946,2.946 0,0 0,20 3ZM16.5,15h-9v2h9ZM7.5,12h0A1.538,1.538 0,0 0,6 10.5L6,10.5A1.538,1.538 0,0 0,4.5 12h0A1.538,1.538 0,0 0,6 13.5L6,13.5A1.538,1.538 0,0 0,7.5 12ZM11.5,12h0A1.538,1.538 0,0 0,10 10.5h0A1.538,1.538 0,0 0,8.5 12h0A1.538,1.538 0,0 0,10 13.5h0A1.538,1.538 0,0 0,11.5 12ZM15.5,12h0A1.538,1.538 0,0 0,14 10.5h0A1.538,1.538 0,0 0,12.5 12h0A1.538,1.538 0,0 0,14 13.5h0A1.538,1.538 0,0 0,15.5 12ZM19.5,12h0A1.538,1.538 0,0 0,18 10.5h0A1.538,1.538 0,0 0,16.5 12h0A1.538,1.538 0,0 0,18 13.5h0A1.538,1.538 0,0 0,19.5 12ZM7.5,8h0A1.538,1.538 0,0 0,6 6.5L6,6.5A1.538,1.538 0,0 0,4.5 8h0A1.538,1.538 0,0 0,6 9.5L6,9.5A1.538,1.538 0,0 0,7.5 8ZM11.5,8h0A1.538,1.538 0,0 0,10 6.5h0A1.538,1.538 0,0 0,8.5 8h0A1.538,1.538 0,0 0,10 9.5h0A1.538,1.538 0,0 0,11.5 8ZM15.5,8h0A1.538,1.538 0,0 0,14 6.5h0A1.538,1.538 0,0 0,12.5 8h0A1.538,1.538 0,0 0,14 9.5h0A1.538,1.538 0,0 0,15.5 8ZM19.5,8h0A1.538,1.538 0,0 0,18 6.5h0A1.538,1.538 0,0 0,16.5 8h0A1.538,1.538 0,0 0,18 9.5h0A1.538,1.538 0,0 0,19.5 8Z"/> android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:pathData="M12,9.75C12.69,9.75 13.25,9.19 13.25,8.5C13.25,7.81 12.69,7.25 12,7.25C11.31,7.25 10.75,7.81 10.75,8.5C10.75,9.19 11.31,9.75 12,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M13.25,12C13.25,12.69 12.69,13.25 12,13.25C11.31,13.25 10.75,12.69 10.75,12C10.75,11.31 11.31,10.75 12,10.75C12.69,10.75 13.25,11.31 13.25,12Z" />
<path
android:fillColor="#000000"
android:pathData="M8.5,9.75C9.19,9.75 9.75,9.19 9.75,8.5C9.75,7.81 9.19,7.25 8.5,7.25C7.81,7.25 7.25,7.81 7.25,8.5C7.25,9.19 7.81,9.75 8.5,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M9.75,12C9.75,12.69 9.19,13.25 8.5,13.25C7.81,13.25 7.25,12.69 7.25,12C7.25,11.31 7.81,10.75 8.5,10.75C9.19,10.75 9.75,11.31 9.75,12Z" />
<path
android:fillColor="#000000"
android:pathData="M15.5,9.75C16.19,9.75 16.75,9.19 16.75,8.5C16.75,7.81 16.19,7.25 15.5,7.25C14.81,7.25 14.25,7.81 14.25,8.5C14.25,9.19 14.81,9.75 15.5,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M16.75,12C16.75,12.69 16.19,13.25 15.5,13.25C14.81,13.25 14.25,12.69 14.25,12C14.25,11.31 14.81,10.75 15.5,10.75C16.19,10.75 16.75,11.31 16.75,12Z" />
<path
android:fillColor="#000000"
android:pathData="M19,9.75C19.69,9.75 20.25,9.19 20.25,8.5C20.25,7.81 19.69,7.25 19,7.25C18.31,7.25 17.75,7.81 17.75,8.5C17.75,9.19 18.31,9.75 19,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M20.25,12C20.25,12.69 19.69,13.25 19,13.25C18.31,13.25 17.75,12.69 17.75,12C17.75,11.31 18.31,10.75 19,10.75C19.69,10.75 20.25,11.31 20.25,12Z" />
<path
android:fillColor="#000000"
android:pathData="M5,9.75C5.69,9.75 6.25,9.19 6.25,8.5C6.25,7.81 5.69,7.25 5,7.25C4.31,7.25 3.75,7.81 3.75,8.5C3.75,9.19 4.31,9.75 5,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M6.25,12C6.25,12.69 5.69,13.25 5,13.25C4.31,13.25 3.75,12.69 3.75,12C3.75,11.31 4.31,10.75 5,10.75C5.69,10.75 6.25,11.31 6.25,12Z" />
<path
android:fillColor="#000000"
android:pathData="M8.25,15C7.698,15 7.25,15.448 7.25,16C7.25,16.552 7.698,17 8.25,17H15.75C16.302,17 16.75,16.552 16.75,16C16.75,15.448 16.302,15 15.75,15H8.25Z" />
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="M17.737,3.625H6.263C5.454,3.625 4.794,3.625 4.258,3.669C3.704,3.714 3.206,3.811 2.741,4.047C2.012,4.419 1.419,5.012 1.047,5.741C0.811,6.206 0.714,6.704 0.669,7.258C0.625,7.794 0.625,8.454 0.625,9.263V14.737C0.625,15.546 0.625,16.206 0.669,16.742C0.714,17.296 0.811,17.794 1.047,18.259C1.419,18.988 2.012,19.581 2.741,19.953C3.206,20.19 3.704,20.286 4.258,20.331C4.794,20.375 5.454,20.375 6.263,20.375H17.737C18.546,20.375 19.206,20.375 19.742,20.331C20.296,20.286 20.794,20.19 21.259,19.953C21.988,19.581 22.581,18.988 22.953,18.259C23.19,17.794 23.286,17.296 23.331,16.742C23.375,16.206 23.375,15.546 23.375,14.737V9.263C23.375,8.454 23.375,7.794 23.331,7.258C23.286,6.704 23.19,6.206 22.953,5.741C22.581,5.012 21.988,4.419 21.259,4.047C20.794,3.811 20.296,3.714 19.742,3.669C19.206,3.625 18.546,3.625 17.737,3.625ZM3.535,5.607C3.712,5.516 3.955,5.449 4.401,5.413C4.857,5.376 5.445,5.375 6.3,5.375H17.7C18.555,5.375 19.143,5.376 19.599,5.413C20.045,5.449 20.288,5.516 20.465,5.607C20.865,5.81 21.19,6.135 21.393,6.535C21.484,6.712 21.551,6.955 21.587,7.401C21.624,7.857 21.625,8.445 21.625,9.3V14.7C21.625,15.554 21.624,16.143 21.587,16.599C21.551,17.045 21.484,17.288 21.393,17.465C21.19,17.865 20.865,18.19 20.465,18.393C20.288,18.484 20.045,18.551 19.599,18.587C19.143,18.624 18.555,18.625 17.7,18.625H6.3C5.445,18.625 4.857,18.624 4.401,18.587C3.955,18.551 3.712,18.484 3.535,18.393C3.135,18.19 2.81,17.865 2.607,17.465C2.516,17.288 2.449,17.045 2.413,16.599C2.376,16.143 2.375,15.554 2.375,14.7V9.3C2.375,8.445 2.376,7.857 2.413,7.401C2.449,6.955 2.516,6.712 2.607,6.535C2.81,6.135 3.135,5.81 3.535,5.607Z" />
</vector> </vector>

View file

@ -1,5 +1,36 @@
<vector android:autoMirrored="true" android:height="24dp" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@color/signal_icon_tint_primary" android:pathData="M8.5,4.75h0A1.8,1.8 0,0 0,6.75 3h0A1.8,1.8 0,0 0,5 4.75L5,4.75A1.8,1.8 0,0 0,6.75 6.5h0A1.8,1.8 0,0 0,8.5 4.75ZM13.75,4.75h0A1.8,1.8 0,0 0,12 3h0a1.8,1.8 0,0 0,-1.75 1.75h0A1.8,1.8 0,0 0,12 6.5h0A1.8,1.8 0,0 0,13.75 4.75ZM19,4.75h0A1.8,1.8 0,0 0,17.25 3h0A1.8,1.8 0,0 0,15.5 4.75h0A1.8,1.8 0,0 0,17.25 6.5h0A1.8,1.8 0,0 0,19 4.75ZM8.5,9.75h0A1.8,1.8 0,0 0,6.75 8h0A1.8,1.8 0,0 0,5 9.75L5,9.75A1.8,1.8 0,0 0,6.75 11.5h0A1.8,1.8 0,0 0,8.5 9.75ZM13.75,9.75h0A1.8,1.8 0,0 0,12 8h0a1.8,1.8 0,0 0,-1.75 1.75h0A1.8,1.8 0,0 0,12 11.5h0A1.8,1.8 0,0 0,13.75 9.75ZM19,9.75h0A1.8,1.8 0,0 0,17.25 8h0A1.8,1.8 0,0 0,15.5 9.75h0a1.8,1.8 0,0 0,1.75 1.75h0A1.8,1.8 0,0 0,19 9.75ZM8.5,14.75h0A1.8,1.8 0,0 0,6.75 13h0A1.8,1.8 0,0 0,5 14.75L5,14.75A1.8,1.8 0,0 0,6.75 16.5h0A1.8,1.8 0,0 0,8.5 14.75ZM13.75,14.75h0A1.8,1.8 0,0 0,12 13h0a1.8,1.8 0,0 0,-1.75 1.75h0A1.8,1.8 0,0 0,12 16.5h0A1.8,1.8 0,0 0,13.75 14.75ZM19,14.75h0A1.8,1.8 0,0 0,17.25 13h0a1.8,1.8 0,0 0,-1.75 1.75h0a1.8,1.8 0,0 0,1.75 1.75h0A1.8,1.8 0,0 0,19 14.75ZM13.75,19.75h0A1.8,1.8 0,0 0,12 18h0a1.8,1.8 0,0 0,-1.75 1.75h0A1.8,1.8 0,0 0,12 21.5h0A1.8,1.8 0,0 0,13.75 19.75Z"/> android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:pathData="M8.375,4.75C8.375,5.647 7.647,6.375 6.75,6.375C5.853,6.375 5.125,5.647 5.125,4.75C5.125,3.853 5.853,3.125 6.75,3.125C7.647,3.125 8.375,3.853 8.375,4.75Z" />
<path
android:fillColor="#000000"
android:pathData="M12,6.375C12.898,6.375 13.625,5.647 13.625,4.75C13.625,3.853 12.898,3.125 12,3.125C11.102,3.125 10.375,3.853 10.375,4.75C10.375,5.647 11.102,6.375 12,6.375Z" />
<path
android:fillColor="#000000"
android:pathData="M17.25,6.375C18.147,6.375 18.875,5.647 18.875,4.75C18.875,3.853 18.147,3.125 17.25,3.125C16.353,3.125 15.625,3.853 15.625,4.75C15.625,5.647 16.353,6.375 17.25,6.375Z" />
<path
android:fillColor="#000000"
android:pathData="M12,21.375C12.898,21.375 13.625,20.647 13.625,19.75C13.625,18.853 12.898,18.125 12,18.125C11.102,18.125 10.375,18.853 10.375,19.75C10.375,20.647 11.102,21.375 12,21.375Z" />
<path
android:fillColor="#000000"
android:pathData="M13.625,14.75C13.625,15.648 12.898,16.375 12,16.375C11.102,16.375 10.375,15.648 10.375,14.75C10.375,13.852 11.102,13.125 12,13.125C12.898,13.125 13.625,13.852 13.625,14.75Z" />
<path
android:fillColor="#000000"
android:pathData="M17.25,16.375C18.147,16.375 18.875,15.648 18.875,14.75C18.875,13.852 18.147,13.125 17.25,13.125C16.353,13.125 15.625,13.852 15.625,14.75C15.625,15.648 16.353,16.375 17.25,16.375Z" />
<path
android:fillColor="#000000"
android:pathData="M8.375,14.75C8.375,15.648 7.647,16.375 6.75,16.375C5.853,16.375 5.125,15.648 5.125,14.75C5.125,13.852 5.853,13.125 6.75,13.125C7.647,13.125 8.375,13.852 8.375,14.75Z" />
<path
android:fillColor="#000000"
android:pathData="M12,11.375C12.898,11.375 13.625,10.648 13.625,9.75C13.625,8.853 12.898,8.125 12,8.125C11.102,8.125 10.375,8.853 10.375,9.75C10.375,10.648 11.102,11.375 12,11.375Z" />
<path
android:fillColor="#000000"
android:pathData="M18.875,9.75C18.875,10.648 18.147,11.375 17.25,11.375C16.353,11.375 15.625,10.648 15.625,9.75C15.625,8.853 16.353,8.125 17.25,8.125C18.147,8.125 18.875,8.853 18.875,9.75Z" />
<path
android:fillColor="#000000"
android:pathData="M6.75,11.375C7.647,11.375 8.375,10.648 8.375,9.75C8.375,8.853 7.647,8.125 6.75,8.125C5.853,8.125 5.125,8.853 5.125,9.75C5.125,10.648 5.853,11.375 6.75,11.375Z" />
</vector> </vector>

View file

@ -102,6 +102,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
app:icon="@drawable/ic_keyboard_24"
app:iconGravity="textStart"
app:iconPadding="8dp"
app:layout_constraintBottom_toTopOf="@id/edit_kbs_pin_confirm" app:layout_constraintBottom_toTopOf="@id/edit_kbs_pin_confirm"
app:layout_constraintTop_toBottomOf="@id/edit_kbs_pin_input_label" app:layout_constraintTop_toBottomOf="@id/edit_kbs_pin_input_label"
app:layout_constraintVertical_bias="0.0" app:layout_constraintVertical_bias="0.0"

View file

@ -78,11 +78,14 @@
style="@style/Signal.Widget.Button.Large.Secondary" style="@style/Signal.Widget.Button.Large.Secondary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/RegistrationLockFragment__switch_keyboard"
app:icon="@drawable/ic_keyboard_24"
app:iconGravity="textStart"
app:iconPadding="8dp"
app:layout_constraintBottom_toTopOf="@id/kbs_lock_pin_confirm" app:layout_constraintBottom_toTopOf="@id/kbs_lock_pin_confirm"
app:layout_constraintTop_toBottomOf="@id/kbs_lock_forgot_pin" app:layout_constraintTop_toBottomOf="@id/kbs_lock_forgot_pin"
app:layout_constraintVertical_bias="0.0" app:layout_constraintVertical_bias="0.0"
tools:layout_editor_absoluteX="32dp" tools:layout_editor_absoluteX="32dp" />
tools:text="Create Alphanumeric Pin" />
<org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton <org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton
android:id="@+id/kbs_lock_pin_confirm" android:id="@+id/kbs_lock_pin_confirm"

View file

@ -52,7 +52,10 @@
style="@style/Signal.Widget.Button.Medium.Secondary" style="@style/Signal.Widget.Button.Medium.Secondary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/PinRestoreEntryFragment_enter_alphanumeric_pin" android:text="@string/RegistrationLockFragment__switch_keyboard"
app:icon="@drawable/ic_keyboard_24"
app:iconGravity="textStart"
app:iconPadding="8dp"
app:layout_constraintTop_toBottomOf="@+id/reminder_disable_pin" app:layout_constraintTop_toBottomOf="@+id/reminder_disable_pin"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />

View file

@ -97,10 +97,13 @@
style="@style/Signal.Widget.Button.Large.Secondary" style="@style/Signal.Widget.Button.Large.Secondary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/RegistrationLockFragment__switch_keyboard"
app:icon="@drawable/ic_keyboard_24"
app:iconGravity="textStart"
app:iconPadding="8dp"
app:layout_constraintTop_toBottomOf="@id/pin_restore_forgot_pin" app:layout_constraintTop_toBottomOf="@id/pin_restore_forgot_pin"
app:layout_constraintVertical_bias="0.0" app:layout_constraintVertical_bias="0.0"
tools:layout_editor_absoluteX="32dp" tools:layout_editor_absoluteX="32dp" />
tools:text="Create Alphanumeric Pin" />
<org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton <org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton
android:id="@+id/pin_restore_pin_confirm" android:id="@+id/pin_restore_pin_confirm"

View file

@ -1629,8 +1629,8 @@
<item quantity="other">You have %1$d attempts remaining. If you run out of attempts, you can create a new PIN. You can register and use your account but you\'ll lose some saved settings like your profile information.</item> <item quantity="other">You have %1$d attempts remaining. If you run out of attempts, you can create a new PIN. You can register and use your account but you\'ll lose some saved settings like your profile information.</item>
</plurals> </plurals>
<string name="PinRestoreEntryFragment_signal_registration_need_help_with_pin">Signal Registration - Need Help with PIN for Android</string> <string name="PinRestoreEntryFragment_signal_registration_need_help_with_pin">Signal Registration - Need Help with PIN for Android</string>
<string name="PinRestoreEntryFragment_enter_alphanumeric_pin">Enter alphanumeric PIN</string> <!-- Button label to prompt the user to switch between an alphanumeric and numeric-only keyboards -->
<string name="PinRestoreEntryFragment_enter_numeric_pin">Enter numeric PIN</string> <string name="PinRestoreEntryFragment_switch_keyboard">Switch keyboard</string>
<!-- PinRestoreLockedFragment --> <!-- PinRestoreLockedFragment -->
<string name="PinRestoreLockedFragment_create_your_pin">Create your PIN</string> <string name="PinRestoreLockedFragment_create_your_pin">Create your PIN</string>
@ -3449,7 +3449,9 @@
<!-- BaseKbsPinFragment --> <!-- BaseKbsPinFragment -->
<string name="BaseKbsPinFragment__next">Next</string> <string name="BaseKbsPinFragment__next">Next</string>
<!-- Button label to prompt them to create a password ("PIN") using numbers and letters rather than only numbers. -->
<string name="BaseKbsPinFragment__create_alphanumeric_pin">Create alphanumeric PIN</string> <string name="BaseKbsPinFragment__create_alphanumeric_pin">Create alphanumeric PIN</string>
<!-- Button label to prompt them to return to creating a numbers-only password ("PIN") -->
<string name="BaseKbsPinFragment__create_numeric_pin">Create numeric PIN</string> <string name="BaseKbsPinFragment__create_numeric_pin">Create numeric PIN</string>
<string name="BaseKbsPinFragment__learn_more_url" translatable="false">https://support.signal.org/hc/articles/360007059792</string> <string name="BaseKbsPinFragment__learn_more_url" translatable="false">https://support.signal.org/hc/articles/360007059792</string>
@ -3511,8 +3513,8 @@
<string name="RegistrationLockFragment__enter_the_pin_you_created">Enter the PIN you created for your account. This is different from your SMS verification code.</string> <string name="RegistrationLockFragment__enter_the_pin_you_created">Enter the PIN you created for your account. This is different from your SMS verification code.</string>
<!-- Info text shown above a pin entry text box describing what pin they should be entering. --> <!-- Info text shown above a pin entry text box describing what pin they should be entering. -->
<string name="RegistrationLockFragment__enter_the_pin_you_created_for_your_account">Enter the PIN you created for your account.</string> <string name="RegistrationLockFragment__enter_the_pin_you_created_for_your_account">Enter the PIN you created for your account.</string>
<string name="RegistrationLockFragment__enter_alphanumeric_pin">Enter alphanumeric PIN</string> <!-- Button label to prompt the user to switch between an alphanumeric and numeric-only keyboards -->
<string name="RegistrationLockFragment__enter_numeric_pin">Enter numeric PIN</string> <string name="RegistrationLockFragment__switch_keyboard">Switch keyboard</string>
<string name="RegistrationLockFragment__incorrect_pin_try_again">Incorrect PIN. Try again.</string> <string name="RegistrationLockFragment__incorrect_pin_try_again">Incorrect PIN. Try again.</string>
<string name="RegistrationLockFragment__forgot_pin">Forgot PIN?</string> <string name="RegistrationLockFragment__forgot_pin">Forgot PIN?</string>
<string name="RegistrationLockFragment__incorrect_pin">Incorrect PIN</string> <string name="RegistrationLockFragment__incorrect_pin">Incorrect PIN</string>