diff --git a/CHANGES.md b/CHANGES.md index 514b0b9bdc..65e2184201 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Improvements 🙌: - VoIP : new tiles in timeline - Improve room profile UX - Upgrade Jitsi library from 2.9.3 to 3.1.0 + - a11y improvements Bugfix 🐛: - VoIP : fix audio devices output diff --git a/vector/lint.xml b/vector/lint.xml index 572f937406..28da13ca8d 100644 --- a/vector/lint.xml +++ b/vector/lint.xml @@ -17,6 +17,10 @@ + + + + diff --git a/vector/src/debug/res/layout/activity_test_material_theme.xml b/vector/src/debug/res/layout/activity_test_material_theme.xml index f6f12942fe..21a2d3fbf5 100644 --- a/vector/src/debug/res/layout/activity_test_material_theme.xml +++ b/vector/src/debug/res/layout/activity_test_material_theme.xml @@ -159,6 +159,7 @@ diff --git a/vector/src/main/assets/open_source_licenses.html b/vector/src/main/assets/open_source_licenses.html index 3c6a9c48a4..ffa328291c 100755 --- a/vector/src/main/assets/open_source_licenses.html +++ b/vector/src/main/assets/open_source_licenses.html @@ -21,6 +21,7 @@ div { padding: 4px; } + @@ -388,7 +389,7 @@ SOFTWARE.
  • dialogs / android-dialer
    - Copyright (c) 2017-present, dialog LLC + Copyright (c) 2017-present, dialog LLC <info@dlg.im>
  • @@ -570,20 +571,24 @@ Apache License
     
     
         CC-BY 4.0
    +
    +
    • Twitter/twemoji Graphics
    • -
    +
         ISC License
    +
    +
    • DanielMartinus / Konfetti
      Copyright (c) 2017 Dion Segijn
    • - +
    diff --git a/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt b/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt index 77ca68fcf1..e739cac95f 100644 --- a/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt +++ b/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt @@ -23,7 +23,6 @@ import im.vector.app.features.crypto.keysrequest.KeyRequestHandler import im.vector.app.features.crypto.verification.IncomingVerificationRequestHandler import im.vector.app.features.notifications.PushRuleTriggerListener import im.vector.app.features.session.SessionListener -import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.session.Session import timber.log.Timber import java.util.concurrent.atomic.AtomicReference @@ -31,8 +30,7 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class ActiveSessionHolder @Inject constructor(private val authenticationService: AuthenticationService, - private val sessionObservableStore: ActiveSessionDataSource, +class ActiveSessionHolder @Inject constructor(private val sessionObservableStore: ActiveSessionDataSource, private val keyRequestHandler: KeyRequestHandler, private val incomingVerificationRequestHandler: IncomingVerificationRequestHandler, private val callManager: WebRtcCallManager, diff --git a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt index e137eb1b70..23018fe758 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt @@ -61,7 +61,7 @@ class ExportKeysDialog { passwordVisible = !passwordVisible views.exportDialogEt.showPassword(passwordVisible) views.exportDialogEtConfirm.showPassword(passwordVisible) - views.exportDialogShowPassword.setImageResource(if (passwordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.exportDialogShowPassword.render(passwordVisible) } val exportDialog = builder.show() diff --git a/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt index 6d7b721976..1839a8b11c 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/PromptPasswordDialog.kt @@ -44,7 +44,7 @@ class PromptPasswordDialog { views.promptPasswordPasswordReveal.setOnClickListener { passwordVisible = !passwordVisible views.promptPassword.showPassword(passwordVisible) - views.promptPasswordPasswordReveal.setImageResource(if (passwordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.promptPasswordPasswordReveal.render(passwordVisible) } AlertDialog.Builder(activity) diff --git a/vector/src/main/java/im/vector/app/core/epoxy/profiles/BaseProfileMatrixItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/profiles/BaseProfileMatrixItem.kt index aa8075819e..ccb3bea25a 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/profiles/BaseProfileMatrixItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/profiles/BaseProfileMatrixItem.kt @@ -21,7 +21,6 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.extensions.setTextOrHide -import im.vector.app.features.crypto.util.toImageRes import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.util.MatrixItem @@ -47,6 +46,6 @@ abstract class BaseProfileMatrixItem : VectorEpoxy holder.subtitleView.setTextOrHide(matrixId) holder.editableView.isVisible = editable avatarRenderer.render(matrixItem, holder.avatarImageView) - holder.avatarDecorationImageView.setImageResource(userEncryptionTrustLevel.toImageRes()) + holder.avatarDecorationImageView.render(userEncryptionTrustLevel) } } diff --git a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt index e8fc671d33..6eb06722b9 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt @@ -23,6 +23,7 @@ import android.widget.TextView import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder +import im.vector.app.core.ui.views.ShieldImageView @EpoxyModelClass(layout = R.layout.item_profile_matrix_item) abstract class ProfileMatrixItem : BaseProfileMatrixItem() { @@ -31,7 +32,7 @@ abstract class ProfileMatrixItem : BaseProfileMatrixItem(R.id.matrixItemTitle) val subtitleView by bind(R.id.matrixItemSubtitle) val avatarImageView by bind(R.id.matrixItemAvatar) - val avatarDecorationImageView by bind(R.id.matrixItemAvatarDecoration) + val avatarDecorationImageView by bind(R.id.matrixItemAvatarDecoration) val editableView by bind(R.id.matrixItemEditable) } } diff --git a/vector/src/main/java/im/vector/app/core/extensions/LiveData.kt b/vector/src/main/java/im/vector/app/core/extensions/LiveData.kt index 192953f609..588063e2a4 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/LiveData.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/LiveData.kt @@ -19,17 +19,16 @@ package im.vector.app.core.extensions import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Observer import im.vector.app.core.utils.EventObserver import im.vector.app.core.utils.FirstThrottler import im.vector.app.core.utils.LiveEvent inline fun LiveData.observeK(owner: LifecycleOwner, crossinline observer: (T?) -> Unit) { - this.observe(owner, Observer { observer(it) }) + this.observe(owner, { observer(it) }) } inline fun LiveData.observeNotNull(owner: LifecycleOwner, crossinline observer: (T) -> Unit) { - this.observe(owner, Observer { it?.run(observer) }) + this.observe(owner, { it?.run(observer) }) } inline fun LiveData>.observeEvent(owner: LifecycleOwner, crossinline observer: (T) -> Unit) { diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index 5747f5158d..43c96d2468 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -40,7 +40,6 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentFactory import androidx.fragment.app.FragmentManager -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.bumptech.glide.util.Util @@ -208,12 +207,12 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScr navigator = screenComponent.navigator() activeSessionHolder = screenComponent.activeSessionHolder() vectorPreferences = vectorComponent.vectorPreferences() - configurationViewModel.activityRestarter.observe(this, Observer { + configurationViewModel.activityRestarter.observe(this) { if (!it.hasBeenHandled) { // Recreate the Activity because configuration has changed restart() } - }) + } pinLocker.getLiveState().observeNotNull(this) { if (this@VectorBaseActivity !is UnlockedActivity && it == PinLocker.State.LOCKED) { navigator.openPinCode(this, pinStartForActivityResult, PinMode.AUTH) diff --git a/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt b/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt index 3bd9ce713d..628356fcad 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt @@ -89,7 +89,7 @@ class KnownCallsViewHolder { this.pipWrapper = pipWrapper this.currentCallsView?.callback = interactionListener pipWrapper.setOnClickListener( - DebouncedClickListener({ _ -> + DebouncedClickListener({ interactionListener.onTapToReturnToCall() }) ) diff --git a/vector/src/main/java/im/vector/app/core/ui/views/ReadReceiptsView.kt b/vector/src/main/java/im/vector/app/core/ui/views/ReadReceiptsView.kt index 5fb0e5907d..8f8919fd47 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/ReadReceiptsView.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/ReadReceiptsView.kt @@ -56,6 +56,7 @@ class ReadReceiptsView @JvmOverloads constructor( private fun setupView() { inflate(context, R.layout.view_read_receipts, this) + contentDescription = context.getString(R.string.a11y_view_read_receipts) } fun render(readReceipts: List, avatarRenderer: AvatarRenderer, clickListener: OnClickListener) { diff --git a/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt new file mode 100644 index 0000000000..b4bcecad16 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/ui/views/RevealPasswordImageView.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.ui.views + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import im.vector.app.R + +class RevealPasswordImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr) { + + init { + render(false) + } + + fun render(isPasswordShown: Boolean) { + if (isPasswordShown) { + contentDescription = context.getString(R.string.a11y_hide_password) + setImageResource(R.drawable.ic_eye_closed) + } else { + contentDescription = context.getString(R.string.a11y_show_password) + setImageResource(R.drawable.ic_eye) + } + } +} diff --git a/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt new file mode 100644 index 0000000000..8b127307ce --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.ui.views + +import android.content.Context +import android.util.AttributeSet +import androidx.annotation.DrawableRes +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.view.isVisible +import im.vector.app.R +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel + +class ShieldImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr) { + + init { + if (isInEditMode) { + render(RoomEncryptionTrustLevel.Trusted) + } + } + + fun render(roomEncryptionTrustLevel: RoomEncryptionTrustLevel?) { + isVisible = roomEncryptionTrustLevel != null + + when (roomEncryptionTrustLevel) { + RoomEncryptionTrustLevel.Default -> { + contentDescription = context.getString(R.string.a11y_trust_level_default) + setImageResource(R.drawable.ic_shield_black) + } + RoomEncryptionTrustLevel.Warning -> { + contentDescription = context.getString(R.string.a11y_trust_level_warning) + setImageResource(R.drawable.ic_shield_warning) + } + RoomEncryptionTrustLevel.Trusted -> { + contentDescription = context.getString(R.string.a11y_trust_level_trusted) + setImageResource(R.drawable.ic_shield_trusted) + } + } + } +} + +@DrawableRes +fun RoomEncryptionTrustLevel.toDrawableRes(): Int { + return when (this) { + RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_black + RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted + } +} diff --git a/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt b/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt index 2a9482765c..c812d8d644 100644 --- a/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt +++ b/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt @@ -27,8 +27,8 @@ class CountUpTimer(private val intervalInMs: Long) { private val resumed: AtomicBoolean = AtomicBoolean(false) private val disposable = Observable.interval(intervalInMs, TimeUnit.MILLISECONDS) - .filter { _ -> resumed.get() } - .doOnNext { _ -> elapsedTime.addAndGet(intervalInMs) } + .filter { resumed.get() } + .doOnNext { elapsedTime.addAndGet(intervalInMs) } .subscribe { tickListener?.onTick(elapsedTime.get()) } diff --git a/vector/src/main/java/im/vector/app/core/utils/DataSource.kt b/vector/src/main/java/im/vector/app/core/utils/DataSource.kt index 06bdeb9277..fc4ee330bb 100644 --- a/vector/src/main/java/im/vector/app/core/utils/DataSource.kt +++ b/vector/src/main/java/im/vector/app/core/utils/DataSource.kt @@ -49,7 +49,7 @@ open class BehaviorDataSource(private val defaultValue: T? = null) : MutableD private fun createRelay(): BehaviorRelay { return if (defaultValue == null) { - BehaviorRelay.create() + BehaviorRelay.create() } else { BehaviorRelay.createDefault(defaultValue) } diff --git a/vector/src/main/java/im/vector/app/core/utils/DefaultSubscriber.kt b/vector/src/main/java/im/vector/app/core/utils/DefaultSubscriber.kt index 99c28becbc..a82e5a4e03 100644 --- a/vector/src/main/java/im/vector/app/core/utils/DefaultSubscriber.kt +++ b/vector/src/main/java/im/vector/app/core/utils/DefaultSubscriber.kt @@ -19,12 +19,11 @@ package im.vector.app.core.utils import io.reactivex.Completable import io.reactivex.Single import io.reactivex.disposables.Disposable -import io.reactivex.functions.Consumer import io.reactivex.internal.functions.Functions import timber.log.Timber fun Single.subscribeLogError(): Disposable { - return subscribe(Functions.emptyConsumer(), Consumer { Timber.e(it) }) + return subscribe(Functions.emptyConsumer(), { Timber.e(it) }) } fun Completable.subscribeLogError(): Disposable { diff --git a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt index 917f60dacb..4bdd54ae45 100644 --- a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt +++ b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt @@ -87,14 +87,7 @@ class PromptFragment : VectorBaseFragment() { } views.passwordField.showPassword(it.passwordVisible) - - if (it.passwordVisible) { - views.passwordReveal.setImageResource(R.drawable.ic_eye_closed) - views.passwordReveal.contentDescription = getString(R.string.a11y_hide_password) - } else { - views.passwordReveal.setImageResource(R.drawable.ic_eye) - views.passwordReveal.contentDescription = getString(R.string.a11y_show_password) - } + views.passwordReveal.render(it.passwordVisible) if (it.lastErrorCode != null) { when (it.flowType) { diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/RecyclerViewPresenter.kt b/vector/src/main/java/im/vector/app/features/autocomplete/RecyclerViewPresenter.kt index c4631300f1..7625eb6216 100644 --- a/vector/src/main/java/im/vector/app/features/autocomplete/RecyclerViewPresenter.kt +++ b/vector/src/main/java/im/vector/app/features/autocomplete/RecyclerViewPresenter.kt @@ -102,7 +102,7 @@ abstract class RecyclerViewPresenter(context: Context?) : AutocompletePresent return LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) } - private class Observer internal constructor(private val root: DataSetObserver) : RecyclerView.AdapterDataObserver() { + private class Observer constructor(private val root: DataSetObserver) : RecyclerView.AdapterDataObserver() { override fun onChanged() { root.onChanged() } diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt index b2ad0a7688..ecc607f08d 100644 --- a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt +++ b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt @@ -31,7 +31,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary class AutocompleteMemberPresenter @AssistedInject constructor(context: Context, @Assisted val roomId: String, - private val session: Session, + session: Session, private val controller: AutocompleteMemberController ) : RecyclerViewPresenter(context), AutocompleteClickListener { diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index ab3769d1f3..091dbeec24 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -383,7 +383,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro mode: String?): Intent { return Intent(context, VectorCallActivity::class.java).apply { // what could be the best flags? - flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + flags = FLAG_ACTIVITY_CLEAR_TOP putExtra(MvRx.KEY_ARG, CallArgs(roomId, callId, otherUserId, isIncomingCall, isVideoCall)) putExtra(EXTRA_MODE, mode) } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt index 80ae46262d..20ecbb4e5a 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt @@ -19,7 +19,6 @@ import android.app.Activity import android.content.Context import android.content.Intent import androidx.appcompat.app.AlertDialog -import androidx.lifecycle.Observer import im.vector.app.R import im.vector.app.core.extensions.addFragmentToBackstack import im.vector.app.core.extensions.observeEvent @@ -54,7 +53,7 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { viewModel = viewModelProvider.get(KeysBackupRestoreSharedViewModel::class.java) viewModel.initSession(session) - viewModel.keySourceModel.observe(this, Observer { keySource -> + viewModel.keySourceModel.observe(this) { keySource -> if (keySource != null && !keySource.isInQuadS && supportFragmentManager.fragments.isEmpty()) { val isBackupCreatedFromPassphrase = viewModel.keyVersionResult.value?.getAuthDataAsMegolmBackupAuthData()?.privateKeySalt != null @@ -64,7 +63,7 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { replaceFragment(R.id.container, KeysBackupRestoreFromKeyFragment::class.java) } } - }) + } viewModel.keyVersionResultError.observeEvent(this) { message -> AlertDialog.Builder(this) @@ -111,9 +110,9 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { } } - viewModel.loadingEvent.observe(this, Observer { + viewModel.loadingEvent.observe(this) { updateWaitingView(it) - }) + } viewModel.importRoomKeysFinishWithResult.observeEvent(this) { // set data? 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 2887a29776..1f8cf4d3a0 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 @@ -22,7 +22,6 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.core.widget.doOnTextChanged -import androidx.lifecycle.Observer import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.platform.VectorBaseFragment @@ -56,9 +55,9 @@ class KeysBackupRestoreFromKeyFragment @Inject constructor() } views.keyInputLayout.error = viewModel.recoveryCodeErrorText.value - viewModel.recoveryCodeErrorText.observe(viewLifecycleOwner, Observer { newValue -> + viewModel.recoveryCodeErrorText.observe(viewLifecycleOwner) { newValue -> views.keyInputLayout.error = newValue - }) + } views.keysRestoreButton.setOnClickListener { onRestoreFromKey() } views.keysBackupImport.setOnClickListener { onImport() } 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 6c139aaf45..0f0c9a23c7 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 @@ -24,7 +24,6 @@ import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.core.text.set import androidx.core.widget.doOnTextChanged -import androidx.lifecycle.Observer import im.vector.app.R import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.VectorBaseFragment @@ -51,17 +50,17 @@ class KeysBackupRestoreFromPassphraseFragment @Inject constructor() : VectorBase viewModel = fragmentViewModelProvider.get(KeysBackupRestoreFromPassphraseViewModel::class.java) sharedViewModel = activityViewModelProvider.get(KeysBackupRestoreSharedViewModel::class.java) - viewModel.passphraseErrorText.observe(viewLifecycleOwner, Observer { newValue -> + viewModel.passphraseErrorText.observe(viewLifecycleOwner) { newValue -> views.keysBackupPassphraseEnterTil.error = newValue - }) + } views.helperTextWithLink.text = spannableStringForHelperText() - viewModel.showPasswordMode.observe(viewLifecycleOwner, Observer { + viewModel.showPasswordMode.observe(viewLifecycleOwner) { val shouldBeVisible = it ?: false views.keysBackupPassphraseEnterEdittext.showPassword(shouldBeVisible) - views.keysBackupViewShowPassword.setImageResource(if (shouldBeVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) - }) + views.keysBackupViewShowPassword.render(shouldBeVisible) + } views.keysBackupPassphraseEnterEdittext.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt index ab8e725959..e042459437 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt @@ -21,7 +21,6 @@ import android.content.Intent import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.fragment.app.FragmentManager -import androidx.lifecycle.Observer import im.vector.app.R import im.vector.app.core.dialogs.ExportKeysDialog import im.vector.app.core.extensions.observeEvent @@ -49,20 +48,20 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { viewModel.showManualExport.value = intent.getBooleanExtra(EXTRA_SHOW_MANUAL_EXPORT, false) viewModel.initSession(session) - viewModel.isCreatingBackupVersion.observe(this, Observer { + viewModel.isCreatingBackupVersion.observe(this) { val isCreating = it ?: false if (isCreating) { showWaitingView() } else { hideWaitingView() } - }) + } - viewModel.loadingStatus.observe(this, Observer { + viewModel.loadingStatus.observe(this) { it?.let { updateWaitingView(it) } - }) + } viewModel.navigateEvent.observeEvent(this) { uxStateEvent -> when (uxStateEvent) { @@ -99,7 +98,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { } } - viewModel.prepareRecoverFailError.observe(this, Observer { error -> + viewModel.prepareRecoverFailError.observe(this) { error -> if (error != null) { AlertDialog.Builder(this) .setTitle(R.string.unknown_error) @@ -110,9 +109,9 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { } .show() } - }) + } - viewModel.creatingBackupError.observe(this, Observer { error -> + viewModel.creatingBackupError.observe(this) { error -> if (error != null) { AlertDialog.Builder(this) .setTitle(R.string.unexpected_error) @@ -123,7 +122,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { } .show() } - }) + } } private val saveStartForActivityResult = registerStartForActivityResult { activityResult -> 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 44996a159c..cf65a9942c 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 @@ -20,7 +20,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.lifecycle.Observer import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.utils.LiveEvent import im.vector.app.databinding.FragmentKeysBackupSetupStep1Binding @@ -40,12 +39,12 @@ class KeysBackupSetupStep1Fragment @Inject constructor() : VectorBaseFragment + viewModel.passwordStrength.observe(viewLifecycleOwner) { strength -> if (strength == null) { views.keysBackupSetupStep2PassphraseStrengthLevel.strength = 0 views.keysBackupSetupStep2PassphraseEnterTil.error = null @@ -91,9 +89,9 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment { newValue -> + viewModel.passphrase.observe(viewLifecycleOwner) { newValue -> if (newValue.isEmpty()) { viewModel.passwordStrength.value = null } else { @@ -104,28 +102,28 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -141,8 +139,8 @@ class KeysBackupSetupStep2Fragment @Inject constructor() : VectorBaseFragment onPassphraseChanged() } - views.keysBackupSetupStep2PassphraseConfirmEditText.doOnTextChanged { _, _, _, _ -> onConfirmPassphraseChanged() } + views.keysBackupSetupStep2PassphraseEnterEdittext.doOnTextChanged { _, _, _, _ -> onPassphraseChanged() } + views.keysBackupSetupStep2PassphraseConfirmEditText.doOnTextChanged { _, _, _, _ -> onConfirmPassphraseChanged() } } private fun toggleVisibilityMode() { 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 a41de109b0..9a3b5fa874 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 @@ -25,7 +25,6 @@ import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible -import androidx.lifecycle.Observer import arrow.core.Try import com.google.android.material.bottomsheet.BottomSheetDialog import im.vector.app.R @@ -61,7 +60,7 @@ class KeysBackupSetupStep3Fragment @Inject constructor() : VectorBaseFragment val shouldBeVisible = state.passphraseVisible views.ssssPassphraseEnterEdittext.showPassword(shouldBeVisible) - views.ssssViewShowPassword.setImageResource(if (shouldBeVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.ssssViewShowPassword.render(shouldBeVisible) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BackupToQuadSMigrationTask.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BackupToQuadSMigrationTask.kt index bbdd0fd5c5..8fbef016cf 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BackupToQuadSMigrationTask.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BackupToQuadSMigrationTask.kt @@ -97,7 +97,7 @@ class BackupToQuadSMigrationTask @Inject constructor( when { params.passphrase?.isNotEmpty() == true -> { reportProgress(params, R.string.bootstrap_progress_generating_ssss) - awaitCallback { + awaitCallback { quadS.generateKeyWithPassphrase( UUID.randomUUID().toString(), "ssss_key", diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt index 9862a97db2..2d26436556 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt @@ -109,7 +109,7 @@ class BootstrapConfirmPassphraseFragment @Inject constructor() if (state.step is BootstrapStep.ConfirmPassphrase) { val isPasswordVisible = state.step.isPasswordVisible views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false) - views.ssssViewShowPassword.setImageResource(if (isPasswordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.ssssViewShowPassword.render(isPasswordVisible) } } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt index 9d3f26cba8..7a5d6e5fd7 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt @@ -103,7 +103,7 @@ class BootstrapEnterPassphraseFragment @Inject constructor() if (state.step is BootstrapStep.SetupPassphrase) { val isPasswordVisible = state.step.isPasswordVisible views.ssssPassphraseEnterEdittext.showPassword(isPasswordVisible, updateCursor = false) - views.ssssViewShowPassword.setImageResource(if (isPasswordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.ssssViewShowPassword.render(isPasswordVisible) state.passphraseStrength.invoke()?.let { strength -> val score = strength.score diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt index 99507fd1c7..ca0942f59a 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt @@ -133,7 +133,7 @@ class BootstrapMigrateBackupFragment @Inject constructor( if (state.step is BootstrapStep.GetBackupSecretPassForMigration) { val isPasswordVisible = state.step.isPasswordVisible views.bootstrapMigrateEditText.showPassword(isPasswordVisible, updateCursor = false) - views.bootstrapMigrateShowPassword.setImageResource(if (isPasswordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.bootstrapMigrateShowPassword.render(isPasswordVisible) } views.bootstrapDescriptionText.text = getString(R.string.bootstrap_migration_enter_backup_password) diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSaveRecoveryKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSaveRecoveryKeyFragment.kt index f587f5e58f..d5e7305e11 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSaveRecoveryKeyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSaveRecoveryKeyFragment.kt @@ -62,8 +62,7 @@ class BootstrapSaveRecoveryKeyFragment @Inject constructor( } } - private fun downloadRecoveryKey() = withState(sharedViewModel) { _ -> - + private fun downloadRecoveryKey() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "text/plain" diff --git a/vector/src/main/java/im/vector/app/features/crypto/util/Extensions.kt b/vector/src/main/java/im/vector/app/features/crypto/util/Extensions.kt deleted file mode 100644 index c75bcb252b..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/util/Extensions.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.crypto.util - -import androidx.annotation.DrawableRes -import im.vector.app.R -import im.vector.app.core.extensions.exhaustive -import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel - -@DrawableRes -fun RoomEncryptionTrustLevel?.toImageRes(): Int { - return when (this) { - null -> 0 - RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_black - RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning - RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted - }.exhaustive -} diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt index b7f967e592..48f3f0a460 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt @@ -92,13 +92,11 @@ class IncomingVerificationRequestHandler @Inject constructor( } addButton( context.getString(R.string.ignore), - Runnable { - tx.cancel() - } + { tx.cancel() } ) addButton( context.getString(R.string.action_open), - Runnable { + { (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { it.navigator.performDeviceVerification(it, tx.otherUserId, tx.transactionId) } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt index eb20e815f6..8d15249c11 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt @@ -24,7 +24,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import androidx.core.view.isVisible import androidx.fragment.app.Fragment import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.fragmentViewModel @@ -49,6 +48,7 @@ import im.vector.app.features.crypto.verification.request.VerificationRequestFra import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.settings.VectorSettingsActivity import kotlinx.parcelize.Parcelize +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME @@ -162,23 +162,22 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { @EpoxyAttribute - var imageRes: Int = 0 - - @EpoxyAttribute - var contentDescription: String? = null + lateinit var roomEncryptionTrustLevel: RoomEncryptionTrustLevel override fun bind(holder: Holder) { super.bind(holder) - holder.image.setImageResource(imageRes) - - if (contentDescription == null) { - ViewCompat.setImportantForAccessibility(holder.image, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO) - } else { - ViewCompat.setImportantForAccessibility(holder.image, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES) - holder.image.contentDescription = contentDescription - } + holder.image.render(roomEncryptionTrustLevel) } class Holder : VectorEpoxyHolder() { - val image by bind(R.id.itemVerificationBigImage) + val image by bind(R.id.itemVerificationBigImage) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingController.kt index 8cb5068b63..4b7452b511 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingController.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingController.kt @@ -23,6 +23,7 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationBigImageItem import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationWaitingItem +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import javax.inject.Inject class VerificationQRWaitingController @Inject constructor( @@ -49,7 +50,7 @@ class VerificationQRWaitingController @Inject constructor( bottomSheetVerificationBigImageItem { id("image") - imageRes(R.drawable.ic_shield_trusted) + roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Trusted) } bottomSheetVerificationWaitingItem { diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherController.kt index cabce6410d..da382f75f1 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherController.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherController.kt @@ -25,6 +25,7 @@ import im.vector.app.features.crypto.verification.VerificationBottomSheetViewSta import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationBigImageItem import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import javax.inject.Inject class VerificationQrScannedByOtherController @Inject constructor( @@ -58,7 +59,7 @@ class VerificationQrScannedByOtherController @Inject constructor( bottomSheetVerificationBigImageItem { id("image") - imageRes(R.drawable.ic_shield_trusted) + roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Trusted) } dividerItem { diff --git a/vector/src/main/java/im/vector/app/features/grouplist/GroupListViewModel.kt b/vector/src/main/java/im/vector/app/features/grouplist/GroupListViewModel.kt index 3b096adbfb..4b187f83ca 100644 --- a/vector/src/main/java/im/vector/app/features/grouplist/GroupListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/grouplist/GroupListViewModel.kt @@ -29,7 +29,6 @@ import im.vector.app.R import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import io.reactivex.Observable -import io.reactivex.functions.BiFunction import kotlinx.coroutines.launch import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session @@ -123,7 +122,7 @@ class GroupListViewModel @AssistedInject constructor(@Assisted initialState: Gro session .rx() .liveGroupSummaries(groupSummariesQueryParams), - BiFunction { allCommunityGroup, communityGroups -> + { allCommunityGroup, communityGroups -> listOf(allCommunityGroup) + communityGroups } ) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 15e982492b..6a381ec049 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -285,10 +285,10 @@ class HomeActivity : dismissedAction = Runnable { homeActivityViewModel.handle(HomeActivityViewActions.PushPromptHasBeenReviewed) } - addButton(getString(R.string.dismiss), Runnable { + addButton(getString(R.string.dismiss), { homeActivityViewModel.handle(HomeActivityViewActions.PushPromptHasBeenReviewed) }, true) - addButton(getString(R.string.settings), Runnable { + addButton(getString(R.string.settings), { (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { // action(it) homeActivityViewModel.handle(HomeActivityViewActions.PushPromptHasBeenReviewed) diff --git a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt index f4f16502ab..988b4fbabe 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt @@ -32,7 +32,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.features.settings.VectorPreferences import io.reactivex.Observable -import io.reactivex.functions.Function3 import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session @@ -103,7 +102,7 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted session.rx().liveUserCryptoDevices(session.myUserId), session.rx().liveMyDevicesInfo(), session.rx().liveCrossSigningPrivateKeys(), - Function3 { cryptoList, infoList, pInfo -> + { cryptoList, infoList, pInfo -> // Timber.v("## Detector trigger ${cryptoList.map { "${it.deviceId} ${it.trustLevel}" }}") // Timber.v("## Detector trigger canCrossSign ${pInfo.get().selfSigned != null}") infoList diff --git a/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsController.kt b/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsController.kt index 4e6bb124ad..a406803bbb 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsController.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.breadcrumbs -import android.view.View import com.airbnb.epoxy.EpoxyController import im.vector.app.core.epoxy.zeroItem import im.vector.app.core.utils.DebouncedClickListener @@ -65,7 +64,7 @@ class BreadcrumbsController @Inject constructor( hasUnreadMessage(it.hasUnreadMessages) hasDraft(it.userDrafts.isNotEmpty()) itemClickListener( - DebouncedClickListener(View.OnClickListener { _ -> + DebouncedClickListener({ _ -> listener?.onBreadcrumbClicked(it.roomId) }) ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsItem.kt b/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsItem.kt index e1343f6f51..f39b7b6d0a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/breadcrumbs/BreadcrumbsItem.kt @@ -46,6 +46,7 @@ abstract class BreadcrumbsItem : VectorEpoxyModel() { holder.rootView.setOnClickListener(itemClickListener) holder.unreadIndentIndicator.isVisible = hasUnreadMessage avatarRenderer.render(matrixItem, holder.avatarImageView) + holder.avatarImageView.contentDescription = matrixItem.getBestName() holder.unreadCounterBadgeView.render(UnreadCounterBadgeView.State(unreadNotificationCount, showHighlighted)) holder.draftIndentIndicator.isVisible = hasDraft holder.typingIndicator.isVisible = hasTypingUsers diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/JumpToBottomViewVisibilityManager.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/JumpToBottomViewVisibilityManager.kt index d3f9b6eda5..2810b27aa6 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/JumpToBottomViewVisibilityManager.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/JumpToBottomViewVisibilityManager.kt @@ -60,9 +60,9 @@ class JumpToBottomViewVisibilityManager( } fun maybeShowJumpToBottomViewVisibilityWithDelay() { - debouncer.debounce("jump_to_bottom_visibility", 250, Runnable { + debouncer.debounce("jump_to_bottom_visibility", 250) { maybeShowJumpToBottomViewVisibility() - }) + } } private fun maybeShowJumpToBottomViewVisibility() { 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 8a219d0cba..93d8ed3737 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 @@ -124,7 +124,6 @@ import im.vector.app.features.call.conference.JitsiCallViewModel import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.command.Command import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivity -import im.vector.app.features.crypto.util.toImageRes import im.vector.app.features.crypto.verification.VerificationBottomSheet import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.composer.TextComposerView @@ -537,8 +536,18 @@ class RoomDetailFragment @Inject constructor( .Builder .fromRootView(views.rootConstraintLayout) .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) - .setOnEmojiPopupShownListener { views.composerLayout.views.composerEmojiButton.setImageResource(R.drawable.ic_keyboard) } - .setOnEmojiPopupDismissListener { views.composerLayout.views.composerEmojiButton.setImageResource(R.drawable.ic_insert_emoji) } + .setOnEmojiPopupShownListener { + views.composerLayout.views.composerEmojiButton.let { + it.setImageResource(R.drawable.ic_keyboard) + it.contentDescription = getString(R.string.a11y_close_emoji_picker) + } + } + .setOnEmojiPopupDismissListener { + views.composerLayout.views.composerEmojiButton.let { + it.setImageResource(R.drawable.ic_insert_emoji) + it.contentDescription = getString(R.string.a11y_open_emoji_picker) + } + } .build(views.composerLayout.views.composerEditText) views.composerLayout.views.composerEmojiButton.debouncedClicks { @@ -1193,10 +1202,7 @@ class RoomDetailFragment @Inject constructor( avatarRenderer.render(roomSummary.toMatrixItem(), views.roomToolbarAvatarImageView) renderSubTitle(typingMessage, roomSummary.topic) - views.roomToolbarDecorationImageView.let { - it.setImageResource(roomSummary.roomEncryptionTrustLevel.toImageRes()) - it.isVisible = roomSummary.roomEncryptionTrustLevel != null - } + views.roomToolbarDecorationImageView.render(roomSummary.roomEncryptionTrustLevel) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 9cced3d565..331be9d825 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -49,7 +49,6 @@ import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import io.reactivex.Observable -import io.reactivex.functions.BiFunction import io.reactivex.rxkotlin.subscribeBy import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.Dispatchers @@ -1331,7 +1330,7 @@ class RoomDetailViewModel @AssistedInject constructor( .combineLatest, RoomSummary, UnreadState>( timelineEvents.observeOn(Schedulers.computation()), room.rx().liveRoomSummary().unwrap(), - BiFunction { timelineEvents, roomSummary -> + { timelineEvents, roomSummary -> computeUnreadState(timelineEvents, roomSummary) } ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt index 5baec0a8f4..6c7721ca02 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt @@ -24,7 +24,6 @@ import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.core.text.toSpannable -import androidx.core.view.isVisible import androidx.transition.ChangeBounds import androidx.transition.Fade import androidx.transition.Transition @@ -41,8 +40,8 @@ import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel */ class TextComposerView @JvmOverloads constructor( context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { + attrs: AttributeSet? = null, + defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { interface Callback : ComposerEditText.Callback { fun onCloseRelatedMessage() @@ -143,16 +142,10 @@ class TextComposerView @JvmOverloads constructor( fun setRoomEncrypted(isEncrypted: Boolean, roomEncryptionTrustLevel: RoomEncryptionTrustLevel?) { if (isEncrypted) { views.composerEditText.setHint(R.string.room_message_placeholder) - views.composerShieldImageView.isVisible = true - val shieldRes = when (roomEncryptionTrustLevel) { - RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted - RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning - else -> R.drawable.ic_shield_black - } - views.composerShieldImageView.setImageResource(shieldRes) + views.composerShieldImageView.render(roomEncryptionTrustLevel) } else { views.composerEditText.setHint(R.string.room_message_placeholder) - views.composerShieldImageView.isVisible = false + views.composerShieldImageView.render(null) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt index 2120576bee..9d82103d3b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.detail.timeline.factory -import android.view.View import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.AvatarRenderer @@ -42,7 +41,7 @@ class DefaultItemFactory @Inject constructor(private val avatarSizeProvider: Ava avatarRenderer = avatarRenderer, informationData = informationData, text = text, - itemLongClickListener = View.OnLongClickListener { view -> + itemLongClickListener = { view -> callback?.onEventLongClicked(informationData, null, view) ?: false }, readReceiptsCallback = callback diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index b3fa7c0eda..e9cf8251de 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -322,7 +322,7 @@ class MessageItemFactory @Inject constructor( mode(ImageContentRenderer.Mode.STICKER) } else { clickListener( - DebouncedClickListener(View.OnClickListener { view -> + DebouncedClickListener({ view -> callback?.onImageMessageClicked(messageContent, data, view) })) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt index cd8c682f39..12c7c2318a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.detail.timeline.factory -import android.view.View import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.format.NoticeEventFormatter @@ -41,7 +40,7 @@ class NoticeItemFactory @Inject constructor(private val eventFormatter: NoticeEv avatarRenderer = avatarRenderer, informationData = informationData, noticeText = formattedText, - itemLongClickListener = View.OnLongClickListener { view -> + itemLongClickListener = { view -> callback?.onEventLongClicked(informationData, null, view) ?: false }, readReceiptsCallback = callback, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageItemAttributesFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageItemAttributesFactory.kt index c120fa671c..043fd9e896 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageItemAttributesFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageItemAttributesFactory.kt @@ -15,7 +15,6 @@ */ package im.vector.app.features.home.room.detail.timeline.helper -import android.view.View import im.vector.app.EmojiCompatFontProvider import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer @@ -39,13 +38,13 @@ class MessageItemAttributesFactory @Inject constructor( informationData = informationData, avatarRenderer = avatarRenderer, messageColorProvider = messageColorProvider, - itemLongClickListener = View.OnLongClickListener { view -> + itemLongClickListener = { view -> callback?.onEventLongClicked(informationData, messageContent, view) ?: false }, - itemClickListener = DebouncedClickListener(View.OnClickListener { view -> + itemClickListener = DebouncedClickListener({ view -> callback?.onEventCellClicked(informationData, messageContent, view) }), - memberClickListener = DebouncedClickListener(View.OnClickListener { + memberClickListener = DebouncedClickListener({ callback?.onMemberNameClicked(informationData) }), reactionPillCallback = callback, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt index 29aca2c4d5..a65f1e10f2 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt @@ -23,11 +23,13 @@ import android.widget.TextView import androidx.annotation.IdRes import androidx.core.view.isVisible import im.vector.app.R +import im.vector.app.core.ui.views.ShieldImageView import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.reactions.widget.ReactionButton +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.session.room.send.SendState /** @@ -39,7 +41,7 @@ abstract class AbsBaseMessageItem : BaseEventItem abstract val baseAttributes: Attributes - private val _readReceiptsClickListener = DebouncedClickListener(View.OnClickListener { + private val _readReceiptsClickListener = DebouncedClickListener({ baseAttributes.readReceiptsCallback?.onReadReceiptsClicked(baseAttributes.informationData.readReceipts) }) @@ -94,13 +96,12 @@ abstract class AbsBaseMessageItem : BaseEventItem when (baseAttributes.informationData.e2eDecoration) { E2EDecoration.NONE -> { - holder.e2EDecorationView.isVisible = false + holder.e2EDecorationView.render(null) } E2EDecoration.WARN_IN_CLEAR, E2EDecoration.WARN_SENT_BY_UNVERIFIED, E2EDecoration.WARN_SENT_BY_UNKNOWN -> { - holder.e2EDecorationView.setImageResource(R.drawable.ic_shield_warning) - holder.e2EDecorationView.isVisible = true + holder.e2EDecorationView.render(RoomEncryptionTrustLevel.Warning) } } @@ -123,7 +124,7 @@ abstract class AbsBaseMessageItem : BaseEventItem abstract class Holder(@IdRes stubId: Int) : BaseEventItem.BaseHolder(stubId) { val reactionsContainer by bind(R.id.reactionsContainer) - val e2EDecorationView by bind(R.id.messageE2EDecoration) + val e2EDecorationView by bind(R.id.messageE2EDecoration) } /** diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt index e0f67fdd30..d4b1b8859a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -42,10 +42,10 @@ abstract class AbsMessageItem : AbsBaseMessageItem @EpoxyAttribute lateinit var attributes: Attributes - private val _avatarClickListener = DebouncedClickListener(View.OnClickListener { + private val _avatarClickListener = DebouncedClickListener({ attributes.avatarCallback?.onAvatarClicked(attributes.informationData) }) - private val _memberNameClickListener = DebouncedClickListener(View.OnClickListener { + private val _memberNameClickListener = DebouncedClickListener({ attributes.avatarCallback?.onMemberNameClicked(attributes.informationData) }) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/DefaultItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/DefaultItem.kt index 8cd3c95141..cdc677334e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/DefaultItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/DefaultItem.kt @@ -32,7 +32,7 @@ abstract class DefaultItem : BaseEventItem() { @EpoxyAttribute lateinit var attributes: Attributes - private val _readReceiptsClickListener = DebouncedClickListener(View.OnClickListener { + private val _readReceiptsClickListener = DebouncedClickListener({ attributes.readReceiptsCallback?.onReadReceiptsClicked(attributes.informationData.readReceipts) }) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt index 34b9ae1b9d..6a665bb44f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt @@ -186,14 +186,14 @@ abstract class MergedRoomCreationItem : BasedMergedItem + holder.setAvatarButton.setOnClickListener(DebouncedClickListener({ attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionSetAvatar) })) } holder.addPeopleButton.isVisible = !isDirect if (!isDirect) { - holder.addPeopleButton.setOnClickListener(DebouncedClickListener({ _ -> + holder.addPeopleButton.setOnClickListener(DebouncedClickListener({ attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionInvitePeople) })) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt index a7db58deb1..ca5c3b2dea 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt @@ -143,7 +143,7 @@ abstract class MessagePollItem : AbsMessageItem() { override fun bindView(itemView: View) { super.bindView(itemView) val buttons = listOf(button1, button2, button3, button4, button5) - val clickListener = DebouncedClickListener(View.OnClickListener { + val clickListener = DebouncedClickListener({ val optionIndex = buttons.indexOf(it) if (optionIndex != -1 && pollId != null) { val compatValue = if (optionIndex < optionValues?.size ?: 0) optionValues?.get(optionIndex) else null diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/NoticeItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/NoticeItem.kt index 34ee8c69fa..bcf170dc4d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/NoticeItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/NoticeItem.kt @@ -19,15 +19,16 @@ package im.vector.app.features.home.room.detail.timeline.item import android.view.View import android.widget.ImageView import android.widget.TextView -import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.onClick +import im.vector.app.core.ui.views.ShieldImageView import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.TimelineEventController +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel @EpoxyModelClass(layout = R.layout.item_timeline_event_base_noinfo) abstract class NoticeItem : BaseEventItem() { @@ -35,7 +36,7 @@ abstract class NoticeItem : BaseEventItem() { @EpoxyAttribute lateinit var attributes: Attributes - private val _readReceiptsClickListener = DebouncedClickListener(View.OnClickListener { + private val _readReceiptsClickListener = DebouncedClickListener({ attributes.readReceiptsCallback?.onReadReceiptsClicked(attributes.informationData.readReceipts) }) @@ -49,13 +50,12 @@ abstract class NoticeItem : BaseEventItem() { when (attributes.informationData.e2eDecoration) { E2EDecoration.NONE -> { - holder.e2EDecorationView.isVisible = false + holder.e2EDecorationView.render(null) } E2EDecoration.WARN_IN_CLEAR, E2EDecoration.WARN_SENT_BY_UNVERIFIED, E2EDecoration.WARN_SENT_BY_UNKNOWN -> { - holder.e2EDecorationView.setImageResource(R.drawable.ic_shield_warning) - holder.e2EDecorationView.isVisible = true + holder.e2EDecorationView.render(RoomEncryptionTrustLevel.Warning) } } } @@ -75,7 +75,7 @@ abstract class NoticeItem : BaseEventItem() { class Holder : BaseHolder(STUB_ID) { val avatarImageView by bind(R.id.itemNoticeAvatarView) val noticeTextView by bind(R.id.itemNoticeTextView) - val e2EDecorationView by bind(R.id.messageE2EDecoration) + val e2EDecorationView by bind(R.id.messageE2EDecoration) } data class Attributes( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt index c1f98cc3ab..35d208e30e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt @@ -60,7 +60,7 @@ data class ReactionInfo( */ class ViewReactionsViewModel @AssistedInject constructor(@Assisted initialState: DisplayReactionsViewState, - private val session: Session, + session: Session, private val dateFormatter: VectorDateFormatter ) : VectorViewModel(initialState) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItem.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItem.kt index ddb51e4e64..06f55d3952 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItem.kt @@ -31,7 +31,7 @@ import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.extensions.setTextOrHide -import im.vector.app.features.crypto.util.toImageRes +import im.vector.app.core.ui.views.ShieldImageView import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.util.MatrixItem @@ -73,8 +73,7 @@ abstract class RoomSummaryItem : VectorEpoxyModel() { holder.unreadIndentIndicator.isVisible = hasUnreadMessage holder.draftView.isVisible = hasDraft avatarRenderer.render(matrixItem, holder.avatarImageView) - holder.roomAvatarDecorationImageView.isVisible = encryptionTrustLevel != null - holder.roomAvatarDecorationImageView.setImageResource(encryptionTrustLevel.toImageRes()) + holder.roomAvatarDecorationImageView.render(encryptionTrustLevel) holder.roomAvatarFailSendingImageView.isVisible = hasFailedSending renderSelection(holder, showSelected) holder.typingView.setTextOrHide(typingMessage) @@ -110,7 +109,7 @@ abstract class RoomSummaryItem : VectorEpoxyModel() { val lastEventTimeView by bind(R.id.roomLastEventTimeView) val avatarCheckedImageView by bind(R.id.roomAvatarCheckedImageView) val avatarImageView by bind(R.id.roomAvatarImageView) - val roomAvatarDecorationImageView by bind(R.id.roomAvatarDecorationImageView) + val roomAvatarDecorationImageView by bind(R.id.roomAvatarDecorationImageView) val roomAvatarFailSendingImageView by bind(R.id.roomAvatarFailSendingImageView) val rootView by bind(R.id.itemRoomLayout) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt index 06cb0172d0..988b3769c4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomSummaryItemFactory.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.list -import android.view.View import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter @@ -109,7 +108,7 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor onLongClick?.invoke(roomSummary) ?: false } .itemClickListener( - DebouncedClickListener(View.OnClickListener { _ -> + DebouncedClickListener({ onClick?.invoke(roomSummary) }) ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsViewModel.kt index c51c571815..75e9459d2c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsViewModel.kt @@ -29,7 +29,7 @@ import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.unwrap class RoomListQuickActionsViewModel @AssistedInject constructor(@Assisted initialState: RoomListQuickActionsState, - private val session: Session + session: Session ) : VectorViewModel(initialState) { @AssistedFactory 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 3b22e0f206..5ba1fa394b 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 @@ -36,7 +36,6 @@ import im.vector.app.core.extensions.showPassword import im.vector.app.core.extensions.toReducedUrl import im.vector.app.databinding.FragmentLoginBinding import io.reactivex.Observable -import io.reactivex.functions.BiFunction import io.reactivex.rxkotlin.subscribeBy import org.matrix.android.sdk.api.failure.Failure @@ -225,7 +224,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment { isLoginNotEmpty, isPasswordNotEmpty -> + { isLoginNotEmpty, isPasswordNotEmpty -> isLoginNotEmpty && isPasswordNotEmpty } ) @@ -255,14 +254,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment { isEmail, isPasswordNotEmpty -> + { isEmail, isPasswordNotEmpty -> isEmail && isPasswordNotEmpty } ) @@ -127,14 +126,7 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment { views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error) } - is Success -> { - Unit - } + is Success -> Unit } } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt index 72f1ca801b..892fd92f95 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt @@ -74,9 +74,7 @@ class LoginResetPasswordMailConfirmationFragment @Inject constructor() : Abstrac .setPositiveButton(R.string.ok, null) .show() } - is Success -> { - Unit - } + is Success -> Unit } } } diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt index ca15efe25a..1d897477a2 100644 --- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt @@ -138,7 +138,7 @@ class MatrixToBottomSheet : fun withLink(matrixToLink: String, listener: InteractionListener?): MatrixToBottomSheet { return MatrixToBottomSheet().apply { arguments = Bundle().apply { - putParcelable(MvRx.KEY_ARG, MatrixToBottomSheet.MatrixToArgs( + putParcelable(MvRx.KEY_ARG, MatrixToArgs( matrixToLink = matrixToLink )) } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt index 1a03fc6c47..a43aca488d 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt @@ -379,7 +379,7 @@ class BugReporter @Inject constructor( if (responseCode != HttpURLConnection.HTTP_OK) { if (null != errorMessage) { serverError = "Failed with error $errorMessage" - } else if (null == response || null == response.body) { + } else if (response?.body == null) { serverError = "Failed with error $responseCode" } else { try { diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt index 992e677723..b2f1c3c15a 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt @@ -26,7 +26,6 @@ import android.view.MenuItem import android.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.core.view.isVisible -import androidx.lifecycle.Observer import com.airbnb.mvrx.viewModel import com.google.android.material.tabs.TabLayout import com.jakewharton.rxbinding3.widget.queryTextChanges @@ -107,13 +106,13 @@ class EmojiReactionPickerActivity : VectorBaseActivity + viewModel.currentSection.observe(this) { section -> section?.let { views.tabs.removeOnTabSelectedListener(tabLayoutSelectionListener) views.tabs.getTabAt(it)?.select() views.tabs.addOnTabSelectedListener(tabLayoutSelectionListener) } - }) + } viewModel.navigateEvent.observeEvent(this) { if (it == EmojiChooserViewModel.NAVIGATE_FINISH) { diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt index 688f74ba5d..b47767dddc 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt @@ -53,6 +53,7 @@ import im.vector.app.features.home.room.detail.RoomDetailPendingActionStore import im.vector.app.features.roommemberprofile.devices.DeviceListBottomSheet import im.vector.app.features.roommemberprofile.powerlevel.EditPowerLevelDialogs import kotlinx.parcelize.Parcelize +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.session.room.powerlevels.Role import org.matrix.android.sdk.api.util.MatrixItem import javax.inject.Inject @@ -205,31 +206,28 @@ class RoomMemberProfileFragment @Inject constructor( if (state.isRoomEncrypted) { headerViews.memberProfileDecorationImageView.isVisible = true - if (state.userMXCrossSigningInfo != null) { + val trustLevel = if (state.userMXCrossSigningInfo != null) { // Cross signing is enabled for this user - val icon = if (state.userMXCrossSigningInfo.isTrusted()) { + if (state.userMXCrossSigningInfo.isTrusted()) { // User is trusted if (state.allDevicesAreCrossSignedTrusted) { - R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.Trusted } else { - R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Warning } } else { - R.drawable.ic_shield_black + RoomEncryptionTrustLevel.Default } - - headerViews.memberProfileDecorationImageView.setImageResource(icon) - views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(icon) } else { // Legacy if (state.allDevicesAreTrusted) { - headerViews.memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_trusted) - views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(R.drawable.ic_shield_trusted) + RoomEncryptionTrustLevel.Trusted } else { - headerViews.memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_warning) - views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(R.drawable.ic_shield_warning) + RoomEncryptionTrustLevel.Warning } } + headerViews.memberProfileDecorationImageView.render(trustLevel) + views.matrixProfileDecorationToolbarAvatarImageView.render(trustLevel) } else { headerViews.memberProfileDecorationImageView.isVisible = false } 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 70eb4dd40e..154483652b 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 @@ -44,7 +44,6 @@ import im.vector.app.core.utils.copyToClipboard import im.vector.app.core.utils.startSharePlainTextIntent import im.vector.app.databinding.FragmentMatrixProfileBinding import im.vector.app.databinding.ViewStubRoomProfileHeaderBinding -import im.vector.app.features.crypto.util.toImageRes import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.list.actions.RoomListActionsArgs import im.vector.app.features.home.room.list.actions.RoomListQuickActionsBottomSheet @@ -204,9 +203,8 @@ class RoomProfileFragment @Inject constructor( val matrixItem = it.toMatrixItem() avatarRenderer.render(matrixItem, headerViews.roomProfileAvatarView) avatarRenderer.render(matrixItem, views.matrixProfileToolbarAvatarImageView) - headerViews.roomProfileDecorationImageView.isVisible = it.roomEncryptionTrustLevel != null - headerViews.roomProfileDecorationImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes()) - views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes()) + headerViews.roomProfileDecorationImageView.render(it.roomEncryptionTrustLevel) + views.matrixProfileDecorationToolbarAvatarImageView.render(it.roomEncryptionTrustLevel) } } roomProfileController.setData(state) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt index de983537fc..f08f8906b8 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt @@ -29,7 +29,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.powerlevel.PowerLevelsObservableFactory import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.functions.BiFunction import kotlinx.coroutines.launch import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.extensions.orFalse @@ -90,7 +89,7 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState .liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS, QueryStringValue.NoCondition) .mapOptional { it.content.toModel() } .unwrap(), - BiFunction { roomMembers, powerLevelsContent -> + { roomMembers, powerLevelsContent -> buildRoomMemberSummaries(powerLevelsContent, roomMembers) } ) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt index 30ba0529ce..e431dbfcd6 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt @@ -199,7 +199,6 @@ class RoomSettingsFragment @Inject constructor( } RoomSettingsViewState.AvatarAction.DeleteAvatar -> { /* Should not happen */ - Unit } is RoomSettingsViewState.AvatarAction.UpdateAvatar -> { // Cancel the update of the avatar diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt index 00550f6fc5..3867485e6f 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt @@ -96,6 +96,7 @@ class RoomUploadsFragment @Inject constructor( private fun renderRoomSummary(state: RoomUploadsViewState) { state.roomSummary()?.let { views.roomUploadsToolbarTitleView.text = it.displayName + views.roomUploadsDecorationToolbarAvatarImageView.render(it.roomEncryptionTrustLevel) avatarRenderer.render(it.toMatrixItem(), views.roomUploadsToolbarAvatarImageView) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt index 2294095623..b844883e69 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt @@ -38,7 +38,7 @@ abstract class UploadsImageItem : VectorEpoxyModel() { override fun bind(holder: Holder) { super.bind(holder) holder.view.setOnClickListener( - DebouncedClickListener(View.OnClickListener { _ -> + DebouncedClickListener({ listener?.onItemClicked(holder.imageView, data) }) ) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt index 908e3ba72c..66138a70b8 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt @@ -39,7 +39,7 @@ abstract class UploadsVideoItem : VectorEpoxyModel() { override fun bind(holder: Holder) { super.bind(holder) holder.view.setOnClickListener( - DebouncedClickListener(View.OnClickListener { _ -> + DebouncedClickListener({ listener?.onItemClicked(holder.imageView, data) }) ) 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 ac4088145e..b66a37b75f 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 @@ -361,7 +361,7 @@ class VectorSettingsGeneralFragment @Inject constructor( views.changePasswordNewPwdText.showPassword(passwordShown) views.changePasswordConfirmNewPwdText.showPassword(passwordShown) - views.changePasswordShowPasswords.setImageResource(if (passwordShown) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.changePasswordShowPasswords.render(passwordShown) } val dialog = AlertDialog.Builder(activity) 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 c12df073ee..31fdda24a2 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 @@ -458,7 +458,7 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( views.importDialogShowPassword.setOnClickListener { passwordVisible = !passwordVisible views.dialogE2eKeysPassphraseEditText.showPassword(passwordVisible) - views.importDialogShowPassword.setImageResource(if (passwordVisible) R.drawable.ic_eye_closed else R.drawable.ic_eye) + views.importDialogShowPassword.render(passwordVisible) } views.dialogE2eKeysPassphraseEditText.addTextChangedListener(object : SimpleTextWatcher() { diff --git a/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt index 04100056aa..566dea2cd4 100644 --- a/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt @@ -29,7 +29,6 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.auth.ReAuthActivity import im.vector.app.features.login.ReAuthHelper import io.reactivex.Observable -import io.reactivex.functions.BiFunction import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.auth.UIABaseAuth @@ -62,7 +61,7 @@ class CrossSigningSettingsViewModel @AssistedInject constructor( Observable.combineLatest, Optional, Pair, Optional>>( session.rx().liveMyDevicesInfo(), session.rx().liveCrossSigningInfo(session.myUserId), - BiFunction { myDevicesInfo, mxCrossSigningInfo -> + { myDevicesInfo, mxCrossSigningInfo -> myDevicesInfo to mxCrossSigningInfo } ) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DeviceItem.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DeviceItem.kt index 49840cdd64..62c0b6149f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DeviceItem.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DeviceItem.kt @@ -18,7 +18,6 @@ package im.vector.app.features.settings.devices import android.graphics.Typeface import android.view.ViewGroup -import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute @@ -27,6 +26,7 @@ import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.resources.ColorProvider +import im.vector.app.core.ui.views.ShieldImageView import im.vector.app.core.utils.DimensionConverter import me.gujun.android.span.span import org.matrix.android.sdk.internal.crypto.crosssigning.DeviceTrustLevel @@ -75,17 +75,17 @@ abstract class DeviceItem : VectorEpoxyModel() { super.bind(holder) holder.root.setOnClickListener { itemClickAction?.invoke() } - val shield = TrustUtils.shieldForTrust( - currentDevice, - trustedSession, - legacyMode, - trusted - ) - if (e2eCapable) { - holder.trustIcon.setImageResource(shield) + val shield = TrustUtils.shieldForTrust( + currentDevice, + trustedSession, + legacyMode, + trusted + ) + + holder.trustIcon.render(shield) } else { - holder.trustIcon.setImageDrawable(null) + holder.trustIcon.render(null) } val detailedModeLabels = listOf( @@ -152,6 +152,6 @@ abstract class DeviceItem : VectorEpoxyModel() { val deviceLastSeenLabelText by bind(R.id.itemDeviceLastSeenLabel) val deviceLastSeenText by bind(R.id.itemDeviceLastSeen) - val trustIcon by bind(R.id.itemDeviceTrustLevelIcon) + val trustIcon by bind(R.id.itemDeviceTrustLevelIcon) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DeviceVerificationInfoBottomSheetController.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DeviceVerificationInfoBottomSheetController.kt index 25a98bb4b5..100d4c97c5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DeviceVerificationInfoBottomSheetController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DeviceVerificationInfoBottomSheetController.kt @@ -24,6 +24,7 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.core.ui.list.GenericItem import im.vector.app.core.ui.list.genericFooterItem import im.vector.app.core.ui.list.genericItem +import im.vector.app.core.ui.views.toDrawableRes import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo @@ -62,7 +63,7 @@ class DeviceVerificationInfoBottomSheetController @Inject constructor( trustMSK = data.accountCrossSigningIsTrusted, legacyMode = !data.hasAccountCrossSigning, deviceTrustLevel = cryptoDeviceInfo.trustLevel - ) + ).toDrawableRes() if (data.hasAccountCrossSigning) { // Cross Signing is enabled diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index b91b5255b6..a56a7b8d48 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -35,7 +35,6 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.auth.ReAuthActivity import im.vector.app.features.login.ReAuthHelper import io.reactivex.Observable -import io.reactivex.functions.BiFunction import io.reactivex.subjects.PublishSubject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -121,7 +120,7 @@ class DevicesViewModel @AssistedInject constructor( Observable.combineLatest, List, List>( session.rx().liveUserCryptoDevices(session.myUserId), session.rx().liveMyDevicesInfo(), - BiFunction { cryptoList, infoList -> + { cryptoList, infoList -> infoList .sortedByDescending { it.lastSeenTs } .map { deviceInfo -> @@ -239,7 +238,6 @@ class DevicesViewModel @AssistedInject constructor( uiaContinuation?.resumeWith(Result.failure((Exception()))) uiaContinuation = null pendingAuth = null - Unit } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/TrustUtils.kt b/vector/src/main/java/im/vector/app/features/settings/devices/TrustUtils.kt index 80cd91664d..06ef96daf7 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/TrustUtils.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/TrustUtils.kt @@ -16,38 +16,50 @@ package im.vector.app.features.settings.devices -import androidx.annotation.DrawableRes -import im.vector.app.R +import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.internal.crypto.crosssigning.DeviceTrustLevel object TrustUtils { - @DrawableRes - fun shieldForTrust(currentDevice: Boolean, trustMSK: Boolean, legacyMode: Boolean, deviceTrustLevel: DeviceTrustLevel?): Int { + fun shieldForTrust(currentDevice: Boolean, + trustMSK: Boolean, + legacyMode: Boolean, + deviceTrustLevel: DeviceTrustLevel?): RoomEncryptionTrustLevel { return when { currentDevice -> { if (legacyMode) { // In legacy, current session is always trusted - R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.Trusted } else { // If current session doesn't trust MSK, show red shield for current device - R.drawable.ic_shield_trusted.takeIf { trustMSK } ?: R.drawable.ic_shield_warning + if (trustMSK) { + RoomEncryptionTrustLevel.Trusted + } else { + RoomEncryptionTrustLevel.Warning + } } } else -> { if (legacyMode) { // use local trust - R.drawable.ic_shield_trusted.takeIf { deviceTrustLevel?.locallyVerified == true } ?: R.drawable.ic_shield_warning + if (deviceTrustLevel?.locallyVerified == true) { + RoomEncryptionTrustLevel.Trusted + } else { + RoomEncryptionTrustLevel.Warning + } } else { if (trustMSK) { // use cross sign trust, put locally trusted in black - R.drawable.ic_shield_trusted.takeIf { deviceTrustLevel?.crossSigningVerified == true } - ?: R.drawable.ic_shield_black.takeIf { deviceTrustLevel?.locallyVerified == true } - ?: R.drawable.ic_shield_warning + when { + deviceTrustLevel?.crossSigningVerified == true -> RoomEncryptionTrustLevel.Trusted + + deviceTrustLevel?.locallyVerified == true -> RoomEncryptionTrustLevel.Default + else -> RoomEncryptionTrustLevel.Warning + } } else { // The current session is untrusted, so displays others in black // as we can't know the cross-signing state - R.drawable.ic_shield_black + RoomEncryptionTrustLevel.Default } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt index f06e23a366..13d7e0f396 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt @@ -68,7 +68,7 @@ class AccountDataEpoxyController @Inject constructor( genericItemWithValue { id(accountData.type) title(accountData.type) - itemClickAction(DebouncedClickListener(View.OnClickListener { + itemClickAction(DebouncedClickListener({ interactionListener?.didTap(accountData) })) itemLongClickAction(View.OnLongClickListener { diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt index 13b8581734..7bee0e283c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt @@ -67,7 +67,7 @@ class KeyRequestsFragment @Inject constructor( override fun onPageScrollStateChanged(state: Int) { childFragmentManager.fragments.forEach { - setHasOptionsMenu(state == SCROLL_STATE_IDLE) + it.setHasOptionsMenu(state == SCROLL_STATE_IDLE) } invalidateOptionsMenu() } diff --git a/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt b/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt index 0144b162e9..332033d10e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt +++ b/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt @@ -59,10 +59,13 @@ abstract class PushRuleItem : EpoxyModelWithHolder() { if (notifAction.shouldNotify && !notifAction.soundName.isNullOrBlank()) { holder.actionIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_action_notify_noisy)) + holder.actionIcon.contentDescription = context.getString(R.string.a11y_rule_notify_noisy) } else if (notifAction.shouldNotify) { holder.actionIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_action_notify_silent)) + holder.actionIcon.contentDescription = context.getString(R.string.a11y_rule_notify_silent) } else { holder.actionIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_action_dont_notify)) + holder.actionIcon.contentDescription = context.getString(R.string.a11y_rule_notify_off) } val description = StringBuffer() diff --git a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt index 1467c1fa9a..d9ed590938 100644 --- a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/NotificationTroubleshootRecyclerViewAdapter.kt @@ -98,7 +98,7 @@ class NotificationTroubleshootRecyclerViewAdapter(val tests: ArrayList + troubleshootTestButton.setOnClickListener { test.quickFix!!.doFix() } troubleshootTestButton.visibility = View.VISIBLE 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 defce49f5a..f89480046f 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 @@ -121,7 +121,7 @@ class IncomingShareFragment @Inject constructor( return true } }) - views.sendShareButton.setOnClickListener { _ -> + views.sendShareButton.setOnClickListener { handleSendShare() } } diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt index 32f296385f..79ab18942b 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/epoxy/LoginPasswordFormItem.kt @@ -19,7 +19,6 @@ package im.vector.app.features.signout.soft.epoxy import android.os.Build import android.text.Editable import android.widget.Button -import android.widget.ImageView import androidx.autofill.HintConstants import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass @@ -31,6 +30,7 @@ import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.extensions.showPassword import im.vector.app.core.platform.SimpleTextWatcher import im.vector.app.core.resources.StringProvider +import im.vector.app.core.ui.views.RevealPasswordImageView @EpoxyModelClass(layout = R.layout.item_login_password_form) abstract class LoginPasswordFormItem : VectorEpoxyModel() { @@ -76,20 +76,13 @@ abstract class LoginPasswordFormItem : VectorEpoxyModel(R.id.itemLoginPasswordFormPasswordField) val passwordFieldTil by bind(R.id.itemLoginPasswordFormPasswordFieldTil) - val passwordReveal by bind(R.id.itemLoginPasswordFormPasswordReveal) + val passwordReveal by bind(R.id.itemLoginPasswordFormPasswordReveal) val forgetPassword by bind