kopia lustrzana https://github.com/ryukoposting/Signal-Android
113 wiersze
5.0 KiB
Java
113 wiersze
5.0 KiB
Java
package org.thoughtcrime.securesms.payments.backup.confirm;
|
|
|
|
import android.app.Activity;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Bundle;
|
|
import android.view.View;
|
|
import android.widget.EditText;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.appcompat.content.res.AppCompatResources;
|
|
import androidx.appcompat.widget.Toolbar;
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.core.graphics.drawable.DrawableCompat;
|
|
import androidx.fragment.app.Fragment;
|
|
import androidx.lifecycle.ViewModelProvider;
|
|
import androidx.navigation.Navigation;
|
|
|
|
import com.google.android.material.textfield.TextInputLayout;
|
|
|
|
import org.thoughtcrime.securesms.R;
|
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
|
import org.thoughtcrime.securesms.util.ViewUtil;
|
|
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
|
|
|
|
public class PaymentsRecoveryPhraseConfirmFragment extends Fragment {
|
|
|
|
/**
|
|
* The minimum number of characters required to show an error mark.
|
|
*/
|
|
private static final int ERROR_THRESHOLD = 1;
|
|
|
|
private Drawable validWordCheckMark;
|
|
private Drawable invalidWordX;
|
|
|
|
public PaymentsRecoveryPhraseConfirmFragment() {
|
|
super(R.layout.payments_recovery_phrase_confirm_fragment);
|
|
}
|
|
|
|
@Override
|
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
|
Toolbar toolbar = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_toolbar);
|
|
EditText word1 = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_word_1);
|
|
EditText word2 = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_word_2);
|
|
View seePhraseAgain = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_see_again);
|
|
View done = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_done);
|
|
TextInputLayout wordWrapper1 = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_word1_wrapper);
|
|
TextInputLayout wordWrapper2 = view.findViewById(R.id.payments_recovery_phrase_confirm_fragment_word2_wrapper);
|
|
|
|
PaymentsRecoveryPhraseConfirmFragmentArgs args = PaymentsRecoveryPhraseConfirmFragmentArgs.fromBundle(requireArguments());
|
|
|
|
validWordCheckMark = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_check_circle_24);
|
|
invalidWordX = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_circle_x_24);
|
|
|
|
DrawableCompat.setTint(validWordCheckMark, ContextCompat.getColor(requireContext(), R.color.signal_accent_green));
|
|
DrawableCompat.setTint(invalidWordX, ContextCompat.getColor(requireContext(), R.color.signal_alert_primary));
|
|
|
|
PaymentsRecoveryPhraseConfirmViewModel viewModel = new ViewModelProvider(requireActivity()).get(PaymentsRecoveryPhraseConfirmViewModel.class);
|
|
|
|
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(requireView()).popBackStack());
|
|
|
|
word1.addTextChangedListener(new AfterTextChanged(e -> viewModel.validateWord1(e.toString())));
|
|
word2.addTextChangedListener(new AfterTextChanged(e -> viewModel.validateWord2(e.toString())));
|
|
seePhraseAgain.setOnClickListener(v -> Navigation.findNavController(requireView()).popBackStack());
|
|
done.setOnClickListener(v -> {
|
|
SignalStore.paymentsValues().setUserConfirmedMnemonic(true);
|
|
ViewUtil.hideKeyboard(requireContext(), view);
|
|
Toast.makeText(requireContext(), R.string.PaymentRecoveryPhraseConfirmFragment__recovery_phrase_confirmed, Toast.LENGTH_SHORT).show();
|
|
|
|
if (args.getFinishOnConfirm()) {
|
|
requireActivity().setResult(Activity.RESULT_OK);
|
|
requireActivity().finish();
|
|
} else {
|
|
Navigation.findNavController(view).popBackStack(R.id.paymentsHome, false);
|
|
}
|
|
});
|
|
|
|
viewModel.getViewState().observe(getViewLifecycleOwner(), viewState -> {
|
|
updateValidity(word1, viewState.isWord1Valid());
|
|
updateValidity(word2, viewState.isWord2Valid());
|
|
done.setEnabled(viewState.areAllWordsValid());
|
|
|
|
String hint1 = getString(R.string.PaymentRecoveryPhraseConfirmFragment__word_d, viewState.getWord1Index() + 1);
|
|
String hint2 = getString(R.string.PaymentRecoveryPhraseConfirmFragment__word_d, viewState.getWord2Index() + 1);
|
|
|
|
wordWrapper1.setHint(hint1);
|
|
wordWrapper2.setHint(hint2);
|
|
});
|
|
|
|
viewModel.updateRandomIndices();
|
|
}
|
|
|
|
private void updateValidity(TextView word, boolean isValid) {
|
|
if (isValid) {
|
|
setEndDrawable(word, validWordCheckMark);
|
|
} else if (word.getText().length() >= ERROR_THRESHOLD) {
|
|
setEndDrawable(word, invalidWordX);
|
|
} else {
|
|
word.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
|
|
}
|
|
}
|
|
|
|
private void setEndDrawable(@NonNull TextView word, @NonNull Drawable invalidWordX) {
|
|
if (word.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) {
|
|
word.setCompoundDrawablesWithIntrinsicBounds(null, null, invalidWordX, null);
|
|
} else {
|
|
word.setCompoundDrawablesWithIntrinsicBounds(invalidWordX, null, null, null);
|
|
}
|
|
}
|
|
}
|