From d13c2526581aa106547e096448b25430f32fb507 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Dec 2021 22:10:57 +0100 Subject: [PATCH] Use debouncedClicks where applicable --- .../preview/AttachmentsPreviewFragment.kt | 2 +- .../contactsbook/ContactsBookFragment.kt | 2 +- .../restore/KeysBackupRestoreFromKeyFragment.kt | 4 ++-- .../KeysBackupRestoreFromPassphraseFragment.kt | 4 ++-- .../restore/KeysBackupRestoreSuccessFragment.kt | 2 +- .../setup/KeysBackupSetupStep1Fragment.kt | 4 ++-- .../setup/KeysBackupSetupStep2Fragment.kt | 4 ++-- .../setup/KeysBackupSetupStep3Fragment.kt | 10 +++++----- .../home/room/detail/RoomDetailFragment.kt | 6 +++--- .../vector/app/features/login/LoginFragment.kt | 4 ++-- .../login/LoginGenericTextInputFormFragment.kt | 4 ++-- .../features/login/LoginResetPasswordFragment.kt | 2 +- ...LoginResetPasswordMailConfirmationFragment.kt | 2 +- .../login/LoginResetPasswordSuccessFragment.kt | 2 +- .../login/LoginServerSelectionFragment.kt | 10 +++++----- .../features/login/LoginServerUrlFormFragment.kt | 6 +++--- .../login/LoginSignUpSignInSelectionFragment.kt | 4 ++-- .../features/login/terms/LoginTermsFragment.kt | 2 +- .../login2/created/AccountCreatedFragment.kt | 8 ++++---- .../RoomMemberProfileFragment.kt | 4 ++-- .../features/roomprofile/RoomProfileFragment.kt | 6 +++--- .../settings/VectorSettingsBaseFragment.kt | 16 ++++++++++++++++ .../settings/VectorSettingsGeneralFragment.kt | 2 +- .../VectorSettingsPreferencesFragment.kt | 2 +- .../VectorSettingsSecurityPrivacyFragment.kt | 2 +- .../app/features/share/IncomingShareFragment.kt | 2 +- 26 files changed, 66 insertions(+), 50 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt index 0e46cb2c78..5b9c3f7fb4 100644 --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt @@ -79,7 +79,7 @@ class AttachmentsPreviewFragment @Inject constructor( applyInsets() setupRecyclerViews() setupToolbar(views.attachmentPreviewerToolbar) - views.attachmentPreviewerSendButton.setOnClickListener { + views.attachmentPreviewerSendButton.debouncedClicks { setResultAndFinish() } } diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt index c1bccf855d..5310fccb3a 100644 --- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt +++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt @@ -77,7 +77,7 @@ class ContactsBookFragment @Inject constructor( } private fun setupConsentView() { - views.phoneBookSearchForMatrixContacts.setOnClickListener { + views.phoneBookSearchForMatrixContacts.debouncedClicks { contactsBookViewModel.handle(ContactsBookAction.UserConsentRequest) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt index 435ca6e608..40ad1372fb 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt @@ -58,8 +58,8 @@ class KeysBackupRestoreFromKeyFragment @Inject constructor() : views.keyInputLayout.error = newValue } - views.keysRestoreButton.setOnClickListener { onRestoreFromKey() } - views.keysBackupImport.setOnClickListener { onImport() } + views.keysRestoreButton.debouncedClicks { onRestoreFromKey() } + views.keysBackupImport.debouncedClicks { onImport() } views.keyTextEdit.doOnTextChanged { text, _, _, _ -> onRestoreKeyTextEditChange(text) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt index c023e66e44..631bc9ff4f 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseFragment.kt @@ -58,8 +58,8 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase return@setOnEditorActionListener false } - views.helperTextWithLink.setOnClickListener { onUseRecoveryKey() } - views.keysBackupRestoreWithPassphraseSubmit.setOnClickListener { onRestoreBackup() } + views.helperTextWithLink.debouncedClicks { onUseRecoveryKey() } + views.keysBackupRestoreWithPassphraseSubmit.debouncedClicks { onRestoreBackup() } views.keysBackupPassphraseEnterEdittext.doOnTextChanged { text, _, _, _ -> onPassphraseTextEditChange(text) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt index 66a7df14c3..c4663fd3bc 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt @@ -52,7 +52,7 @@ class KeysBackupRestoreSuccessFragment @Inject constructor() : VectorBaseFragmen views.successText.text = context?.getString(R.string.keys_backup_restore_success_title_already_up_to_date) views.successDetailsText.isVisible = false } - views.keysBackupSetupDoneButton.setOnClickListener { onDone() } + views.keysBackupSetupDoneButton.debouncedClicks { onDone() } } private fun onDone() { diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep1Fragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep1Fragment.kt index 08496c490f..7d8feba942 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep1Fragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep1Fragment.kt @@ -45,8 +45,8 @@ class KeysBackupSetupStep1Fragment @Inject constructor() : VectorBaseFragment onPassphraseChanged() } views.keysBackupSetupStep2PassphraseConfirmEditText.doOnTextChanged { _, _, _, _ -> onConfirmPassphraseChanged() } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep3Fragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep3Fragment.kt index 2befc4e79d..c1cd87b4c8 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep3Fragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep3Fragment.kt @@ -85,9 +85,9 @@ class KeysBackupSetupStep3Fragment @Inject constructor() : VectorBaseFragment(R.id.keys_backup_setup_save)?.setOnClickListener { + dialog.findViewById(R.id.keys_backup_setup_save)?.debouncedClicks { val userId = viewModel.userId val timestamp = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date()) selectTxtFileToWrite( @@ -139,7 +139,7 @@ class KeysBackupSetupStep3Fragment @Inject constructor() : VectorBaseFragment(R.id.keys_backup_setup_share)?.setOnClickListener { + dialog.findViewById(R.id.keys_backup_setup_share)?.debouncedClicks { startSharePlainTextIntent( fragment = this, activityResultLauncher = null, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 8335c635e4..de8e0dfa9a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -898,7 +898,7 @@ class RoomDetailFragment @Inject constructor( } private fun setupJumpToReadMarkerView() { - views.jumpToReadMarkerView.setOnClickListener { + views.jumpToReadMarkerView.debouncedClicks { onJumpToReadMarkerClicked() } views.jumpToReadMarkerView.setOnCloseIconClickListener { @@ -954,7 +954,7 @@ class RoomDetailFragment @Inject constructor( super.onCreateOptionsMenu(menu, inflater) // We use a custom layout for this menu item, so we need to set a ClickListener menu.findItem(R.id.open_matrix_apps)?.let { menuItem -> - menuItem.actionView.setOnClickListener { + menuItem.actionView.debouncedClicks { onOptionsItemSelected(menuItem) } } @@ -1463,7 +1463,7 @@ class RoomDetailFragment @Inject constructor( callback = this@RoomDetailFragment isVisible = true render(inviter, VectorInviteView.Mode.LARGE, mainState.changeMembershipState) - setOnClickListener { } + setOnClickListener(null) } Unit } else if (mainState.asyncInviter.complete) { diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt index 0978621f28..9ca8a1dbec 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt @@ -81,7 +81,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment + headerViews.memberProfileAvatarView.debouncedClicks { view -> onAvatarClicked(view, userMatrixItem) } - views.matrixProfileToolbarAvatarImageView.setOnClickListener { view -> + views.matrixProfileToolbarAvatarImageView.debouncedClicks { view -> onAvatarClicked(view, userMatrixItem) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 4dac4be489..2091fe04a1 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -146,12 +146,12 @@ class RoomProfileFragment @Inject constructor( headerViews.roomProfileNameView, views.matrixProfileToolbarTitleView ).forEach { - it.setOnClickListener { + it.debouncedClicks { roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomSettings) } } // Shortcut to room alias - headerViews.roomProfileAliasView.setOnClickListener { + headerViews.roomProfileAliasView.debouncedClicks { roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings) } // Open Avatar @@ -159,7 +159,7 @@ class RoomProfileFragment @Inject constructor( headerViews.roomProfileAvatarView, views.matrixProfileToolbarAvatarImageView ).forEach { view -> - view.setOnClickListener { onAvatarClicked(view) } + view.debouncedClicks { onAvatarClicked(view) } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsBaseFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsBaseFragment.kt index 0a12a86ff0..0e1614326c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsBaseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsBaseFragment.kt @@ -20,14 +20,19 @@ import android.content.Context import android.os.Bundle import android.view.View import androidx.annotation.CallSuper +import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceFragmentCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.extensions.singletonEntryPoint +import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.utils.toast +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.session.Session +import reactivecircus.flowbinding.android.view.clicks import timber.log.Timber abstract class VectorSettingsBaseFragment : PreferenceFragmentCompat() { @@ -42,6 +47,17 @@ abstract class VectorSettingsBaseFragment : PreferenceFragmentCompat() { protected lateinit var session: Session protected lateinit var errorFormatter: ErrorFormatter + /* ========================================================================================== + * Views + * ========================================================================================== */ + + protected fun View.debouncedClicks(onClicked: () -> Unit) { + clicks() + .throttleFirst(300) + .onEach { onClicked() } + .launchIn(viewLifecycleOwner.lifecycleScope) + } + abstract val preferenceXmlRes: Int @CallSuper diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt index 8d950b4e32..27548dc756 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt @@ -418,7 +418,7 @@ class VectorSettingsGeneralFragment @Inject constructor( } } - updateButton.setOnClickListener { + updateButton.debouncedClicks { // Hide passwords during processing views.changePasswordOldPwdText.hidePassword() views.changePasswordNewPwdText.hidePassword() diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt index 2a3ea799a5..dbea253649 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt @@ -197,7 +197,7 @@ class VectorSettingsPreferencesFragment @Inject constructor( .forEachIndexed { i, v -> v.isChecked = i == index - v.setOnClickListener { + v.debouncedClicks { dialog.dismiss() FontScale.updateFontScale(activity, i) vectorConfiguration.applyToApplicationContext() diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index 438382ab3c..3f25907be0 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -446,7 +446,7 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( val importDialog = builder.show() - views.dialogE2eKeysImportButton.setOnClickListener { + views.dialogE2eKeysImportButton.debouncedClicks { val password = views.dialogE2eKeysPassphraseEditText.text.toString() displayLoadingView() diff --git a/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt b/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt index d5fd3050e9..e1efef4d5a 100644 --- a/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt +++ b/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt @@ -118,7 +118,7 @@ class IncomingShareFragment @Inject constructor( return true } }) - views.sendShareButton.setOnClickListener { + views.sendShareButton.debouncedClicks { handleSendShare() } }