diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/PnpSafetyNumberEducationDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/PnpSafetyNumberEducationDialogFragment.kt index 193fffc1b5..0b91f52550 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/PnpSafetyNumberEducationDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/PnpSafetyNumberEducationDialogFragment.kt @@ -59,11 +59,7 @@ class PnpSafetyNumberEducationDialogFragment : FixedRoundedCornerBottomSheetDial companion object { @JvmStatic - fun showIfNeeded(fragmentManager: FragmentManager) { - if (SignalStore.uiHints().hasSeenSafetyNumberUpdateNux()) { - return - } - + fun show(fragmentManager: FragmentManager) { val fragment = PnpSafetyNumberEducationDialogFragment() if (fragmentManager.findFragmentByTag(BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) == null) { fragment.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt index 54da84900a..df180c0236 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt @@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible -import org.thoughtcrime.securesms.verify.PnpSafetyNumberEducationDialogFragment.Companion.showIfNeeded import java.nio.charset.StandardCharsets import java.util.Locale @@ -59,6 +58,8 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { private var callback: Callback? = null + private var animateCodeChanges = true + private var animateSuccessOnDraw = false private var animateFailureOnDraw = false private var currentVerifiedState = false @@ -82,6 +83,7 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { initializeViewModel() binding.safetyNumberUpdatingBannerText.text = Html.fromHtml(String.format(getString(R.string.verify_display_fragment__safety_numbers_are_updating_banner))) + binding.safetyNumberUpdatingBannerText.movementMethod = LinkMovementMethod.getInstance() updateVerifyButton(requireArguments().getBoolean(VERIFIED_STATE, false), false) @@ -141,7 +143,10 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { override fun onStart() { super.onStart() - showIfNeeded(childFragmentManager) + if (!viewModel.showedSafetyNumberEducationDialog) { + PnpSafetyNumberEducationDialogFragment.show(childFragmentManager) + viewModel.showedSafetyNumberEducationDialog = true + } } override fun onResume() { @@ -201,6 +206,8 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { } fun setScannedFingerprint(scanned: String) { + animateCodeChanges = false + val fingerprints = viewModel.getFingerprints().value var haveMatchingVersion = false if (fingerprints != null) { @@ -218,18 +225,25 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { Log.w(TAG, e) } catch (e: Exception) { Log.w(TAG, e) - Toast.makeText(activity, R.string.VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number, Toast.LENGTH_LONG).show() + showAlertDialog(R.string.VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number) animateFailureOnDraw = true return } } } if (!haveMatchingVersion) { - Toast.makeText(activity, R.string.VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal, Toast.LENGTH_LONG).show() + showAlertDialog(R.string.VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal) animateFailureOnDraw = true } } + private fun showAlertDialog(stringResId: Int) { + MaterialAlertDialogBuilder(requireContext()) + .setMessage(stringResId) + .setPositiveButton(R.string.VerifyDisplayFragment__scan_result_dialog_ok, null) + .show() + } + private fun getFormattedSafetyNumbers(fingerprint: Fingerprint): String { val segments = getSegments(fingerprint) val result = StringBuilder() @@ -249,12 +263,12 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { private fun handleCompareWithClipboard() { val clipboardData = Util.readTextFromClipboard(requireActivity()) if (clipboardData == null) { - Toast.makeText(requireActivity(), R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard, Toast.LENGTH_LONG).show() + showAlertDialog(R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard) return } val numericClipboardData = clipboardData.replace("\\D".toRegex(), "") if (TextUtils.isEmpty(numericClipboardData) || numericClipboardData.length != 60) { - Toast.makeText(requireActivity(), R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard, Toast.LENGTH_LONG).show() + showAlertDialog(R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard) return } var success = false @@ -276,10 +290,14 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { } private fun animateSuccess(position: Int) { + animateCodeChanges = false + safetyNumberAdapter.notifyItemChanged(position, true) } private fun animateFailure(position: Int) { + animateCodeChanges = false + safetyNumberAdapter.notifyItemChanged(position, false) } @@ -372,7 +390,7 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { override fun onBindViewHolder(holder: SafetyNumberQrViewHolder, position: Int) { val (version, _, _, _, _, fingerprint1) = fingerprints!![position] - holder.safetyNumberQrView.setFingerprintViews(fingerprint1, true) + holder.safetyNumberQrView.setFingerprintViews(fingerprint1, animateCodeChanges) holder.safetyNumberQrView.setSafetyNumberType(version == 2) holder.safetyNumberQrView.shareButton.setOnClickListener { v: View? -> handleShare(fingerprints!![position].fingerprint) } holder.safetyNumberQrView.qrCodeContainer.setOnClickListener { v: View? -> callback!!.onQrCodeContainerClicked() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt index 7b38adeff1..d1e00399ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt @@ -4,6 +4,7 @@ import android.Manifest import android.os.Bundle import android.view.View import android.widget.Toast +import androidx.activity.addCallback import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import org.signal.core.util.ThreadUtil @@ -120,4 +121,15 @@ class VerifyIdentityFragment : Fragment(R.layout.fragment_container), ScanListen override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { + if (childFragmentManager.backStackEntryCount > 0) { + childFragmentManager.popBackStack() + } else { + requireActivity().finish() + } + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifySafetyNumberViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifySafetyNumberViewModel.kt index bb85f8b44e..17011eb96c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifySafetyNumberViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifySafetyNumberViewModel.kt @@ -38,6 +38,7 @@ class VerifySafetyNumberViewModel( } val recipient: LiveRecipient = Recipient.live(recipientId) + var showedSafetyNumberEducationDialog = SignalStore.uiHints().hasSeenSafetyNumberUpdateNux() private val fingerprintListLiveData = MutableLiveData>() diff --git a/app/src/main/res/layout/safety_number_qr_view.xml b/app/src/main/res/layout/safety_number_qr_view.xml index f27d88f643..19a41aa121 100644 --- a/app/src/main/res/layout/safety_number_qr_view.xml +++ b/app/src/main/res/layout/safety_number_qr_view.xml @@ -77,6 +77,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" + android:gravity="center_horizontal" android:text="@string/verify_display_fragment__tap_to_scan" android:textColor="@color/qr_card_text_color" /> @@ -85,6 +86,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" + android:gravity="center_horizontal" android:text="@string/verify_display_fragment__successful_match" android:textColor="@color/qr_card_text_color" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3bb29ef7e4..9f7fed3af9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2150,6 +2150,8 @@ OK Learn more + + OK %1$02d:%2$02d