diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 907940414f..fbe62d03ed 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -2510,6 +2510,8 @@ This wasn’t me Your account may be compromised + Resume + If you cancel, you won’t be able to read encrypted messages on this device, and other users won’t trust it If you cancel, you won’t be able to read encrypted messages on your new device, and other users won’t trust it You won’t verify %1$s (%2$s) if you cancel now. Start again in their user profile. diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationAction.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationAction.kt index 617e31d8fa..0b535da8fe 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationAction.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationAction.kt @@ -18,7 +18,6 @@ package im.vector.app.features.crypto.verification import im.vector.app.core.platform.VectorViewModelAction -// TODO Remove otherUserId and transactionId when it's not necessary. Should be known by the ViewModel, no? sealed class VerificationAction : VectorViewModelAction { object RequestVerificationByDM : VerificationAction() object RequestSelfVerification : VerificationAction() 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 deleted file mode 100644 index 8580a324a3..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt +++ /dev/null @@ -1,439 +0,0 @@ -// /* -// * Copyright 2019 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.verification -// -// import android.app.Activity -// import android.app.Dialog -// import android.os.Bundle -// import android.os.Parcelable -// import android.view.KeyEvent -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import androidx.fragment.app.Fragment -// import com.airbnb.mvrx.fragmentViewModel -// import com.airbnb.mvrx.withState -// import com.google.android.material.dialog.MaterialAlertDialogBuilder -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.R -// import im.vector.app.core.extensions.commitTransaction -// import im.vector.app.core.extensions.registerStartForActivityResult -// import im.vector.app.core.extensions.toMvRxBundle -// import im.vector.app.core.platform.VectorBaseActivity -// import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment -// import im.vector.app.databinding.BottomSheetVerificationBinding -// import im.vector.app.features.crypto.quads.SharedSecureStorageActivity -// import im.vector.app.features.crypto.verification.cancel.VerificationCancelFragment -// import im.vector.app.features.crypto.verification.cancel.VerificationNotMeFragment -// import im.vector.app.features.crypto.verification.choose.VerificationChooseMethodFragment -// import im.vector.app.features.crypto.verification.conclusion.VerificationConclusionFragment -// import im.vector.app.features.crypto.verification.emoji.VerificationEmojiCodeFragment -// import im.vector.app.features.crypto.verification.qrconfirmation.VerificationQRWaitingFragment -// import im.vector.app.features.crypto.verification.qrconfirmation.VerificationQrScannedByOtherFragment -// import im.vector.app.features.crypto.verification.request.VerificationRequestFragment -// import im.vector.app.features.displayname.getBestName -// import im.vector.app.features.home.AvatarRenderer -// import im.vector.app.features.settings.VectorSettingsActivity -// import kotlinx.parcelize.Parcelize -// 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 -// import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME -// import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME -// import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -// import org.matrix.android.sdk.api.session.crypto.verification.CancelCode -// import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState -// import timber.log.Timber -// import javax.inject.Inject -// import kotlin.reflect.KClass -// -// @AndroidEntryPoint -// class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { -// -// @Parcelize -// data class VerificationArgs( -// val otherUserId: String, -// // might be null for self verification if there is no device to request to -// // in this case you could use 4S (or reset all) -// val verificationId: String?, -// // val verificationLocalId: String? = null, -// val roomId: String? = null, -// // Special mode where UX should show loading wheel until other session sends a request/tx -// val selfVerificationMode: Boolean = false -// ) : Parcelable -// -// override val showExpanded = true -// -// @Inject -// lateinit var avatarRenderer: AvatarRenderer -// -// private val viewModel by fragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationBinding { -// return BottomSheetVerificationBinding.inflate(inflater, container, false) -// } -// -// init { -// isCancelable = false -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// -// viewModel.observeViewEvents { -// when (it) { -// is VerificationBottomSheetViewEvents.Dismiss -> dismiss() -// is VerificationBottomSheetViewEvents.AccessSecretStore -> { -// secretStartForActivityResult.launch( -// SharedSecureStorageActivity.newReadIntent( -// requireContext(), -// null, // use default key -// listOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME), -// SharedSecureStorageActivity.DEFAULT_RESULT_KEYSTORE_ALIAS -// ) -// ) -// } -// is VerificationBottomSheetViewEvents.ModalError -> { -// MaterialAlertDialogBuilder(requireContext()) -// .setTitle(getString(R.string.dialog_title_error)) -// .setMessage(it.errorMessage) -// .setCancelable(false) -// .setPositiveButton(R.string.ok, null) -// .show() -// Unit -// } -// VerificationBottomSheetViewEvents.GoToSettings -> { -// dismiss() -// (activity as? VectorBaseActivity<*>)?.let { activity -> -// activity.navigator.openSettings(activity, VectorSettingsActivity.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY) -// } -// } -// } -// } -// } -// -// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { -// return super.onCreateDialog(savedInstanceState).apply { -// setOnKeyListener { _, keyCode, keyEvent -> -// if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == KeyEvent.ACTION_UP) { -// viewModel.queryCancel() -// true -// } else { -// false -// } -// } -// } -// } -// -// private val secretStartForActivityResult = registerStartForActivityResult { activityResult -> -// if (activityResult.resultCode == Activity.RESULT_OK) { -// val result = activityResult.data?.getStringExtra(SharedSecureStorageActivity.EXTRA_DATA_RESULT) -// val reset = activityResult.data?.getBooleanExtra(SharedSecureStorageActivity.EXTRA_DATA_RESET, false) ?: false -// if (result != null) { -// viewModel.handle(VerificationAction.GotResultFromSsss(result, SharedSecureStorageActivity.DEFAULT_RESULT_KEYSTORE_ALIAS)) -// } else if (reset) { -// // all have been reset, so we are verified? -// viewModel.handle(VerificationAction.SecuredStorageHasBeenReset) -// } -// } else { -// viewModel.handle(VerificationAction.CancelledFromSsss) -// } -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// avatarRenderer.render(state.otherUserMxItem, views.otherUserAvatarImageView) -// if (state.isMe) { -// if (state.sasTransactionState == VerificationTxState.Verified || -// state.qrTransactionState == VerificationTxState.Verified || -// state.verifiedFromPrivateKeys) { -// views.otherUserShield.render(RoomEncryptionTrustLevel.Trusted) -// } else { -// views.otherUserShield.render(RoomEncryptionTrustLevel.Warning) -// } -// views.otherUserNameText.text = getString( -// if (state.selfVerificationMode) R.string.crosssigning_verify_this_session else R.string.crosssigning_verify_session -// ) -// } else { -// if (state.sasTransactionState == VerificationTxState.Verified || state.qrTransactionState == VerificationTxState.Verified) { -// views.otherUserNameText.text = getString(R.string.verification_verified_user, state.otherUserMxItem.getBestName()) -// views.otherUserShield.render(RoomEncryptionTrustLevel.Trusted) -// } else { -// views.otherUserNameText.text = getString(R.string.verification_verify_user, state.otherUserMxItem.getBestName()) -// views.otherUserShield.render(null) -// } -// } -// -// if (state.quadSHasBeenReset) { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args( -// isSuccessFull = true, -// isMe = true, -// cancelReason = null -// ) -// ) -// return@withState -// } -// -// if (state.userThinkItsNotHim) { -// views.otherUserNameText.text = getString(R.string.dialog_title_warning) -// showFragment(VerificationNotMeFragment::class) -// return@withState -// } -// -// if (state.userWantsToCancel) { -// views.otherUserNameText.text = getString(R.string.are_you_sure) -// showFragment(VerificationCancelFragment::class) -// return@withState -// } -// -// if (state.selfVerificationMode && state.verifyingFrom4S) { -// showFragment(QuadSLoadingFragment::class) -// return@withState -// } -// if (state.selfVerificationMode && state.verifiedFromPrivateKeys) { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args(true, null, state.isMe) -// ) -// return@withState -// } -// -// // Did the request result in a SAS transaction? -// if (state.sasTransactionState != null) { -// when (state.sasTransactionState) { -// -// VerificationTxState.None, -// VerificationTxState.SasStarted, -// VerificationTxState.SasKeySent, -// VerificationTxState.SasShortCodeReady, -// VerificationTxState.SasMacSent, -// is VerificationTxState.SasMacReceived, -// VerificationTxState.SasAccepted -> { -// showFragment( -// VerificationEmojiCodeFragment::class, -// VerificationArgs( -// state.otherUserId, -// // If it was outgoing it.transaction id would be null, but the pending request -// // would be updated (from localId to txId) -// state.pendingRequest.invoke()?.transactionId ?: state.transactionId -// ) -// ) -// } -// is VerificationTxState.Verified -> { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args(true, null, state.isMe) -// ) -// } -// is VerificationTxState.Cancelled -> { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args(false, state.sasTransactionState.cancelCode.value, state.isMe) -// ) -// } -// else -> Unit -// // is VerificationTxState.None, -// // is VerificationTxState.SendingStart, -// // is VerificationTxState.Started, -// // is VerificationTxState.OnStarted, -// // is VerificationTxState.SendingAccept, -// // is VerificationTxState.Accepted, -// // is VerificationTxState.OnAccepted, -// // is VerificationTxState.SendingKey, -// // is VerificationTxState.KeySent, -// // is VerificationTxState.OnKeyReceived, -// // is VerificationTxState.ShortCodeReady, -// // is VerificationTxState.ShortCodeAccepted, -// // is VerificationTxState.SendingMac, -// // is VerificationTxState.MacSent, -// // is VerificationTxState.Verifying -> { -// // showFragment( -// // VerificationEmojiCodeFragment::class, -// // VerificationArgs( -// // state.otherUserId, -// // // If it was outgoing it.transaction id would be null, but the pending request -// // // would be updated (from localId to txId) -// // state.pendingRequest.invoke()?.transactionId ?: state.transactionId -// // ) -// // ) -// // } -// // is VerificationTxState.Verified -> { -// // showFragment( -// // VerificationConclusionFragment::class, -// // VerificationConclusionFragment.Args(true, null, state.isMe) -// // ) -// // } -// // is VerificationTxState.Cancelled -> { -// // showFragment( -// // VerificationConclusionFragment::class, -// // VerificationConclusionFragment.Args(false, state.sasTransactionState.cancelCode.value, state.isMe) -// // ) -// // } -// // else -> Unit -// } -// -// return@withState -// } -// -// when (state.qrTransactionState) { -// is VerificationTxState.QrScannedByOther -> { -// showFragment(VerificationQrScannedByOtherFragment::class) -// return@withState -// } -// //TODO -// // is VerificationTxState.Started, -// is VerificationTxState.WaitingOtherReciprocateConfirm -> { -// showFragment( -// VerificationQRWaitingFragment::class, -// VerificationQRWaitingFragment.Args( -// isMe = state.isMe, -// otherUserName = state.otherUserMxItem.getBestName() -// ) -// ) -// return@withState -// } -// is VerificationTxState.Verified -> { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args(true, null, state.isMe) -// ) -// return@withState -// } -// is VerificationTxState.Cancelled -> { -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args(false, state.qrTransactionState.cancelCode.value, state.isMe) -// ) -// return@withState -// } -// else -> Unit -// } -// -// // At this point there is no SAS transaction for this request -// -// // Transaction has not yet started -// if (state.pendingRequest.invoke()?.cancelConclusion != null) { -// // The request has been declined, we should dismiss -// views.otherUserNameText.text = getString(R.string.verification_cancelled) -// showFragment( -// VerificationConclusionFragment::class, -// VerificationConclusionFragment.Args( -// isSuccessFull = false, -// cancelReason = state.pendingRequest.invoke()?.cancelConclusion?.value ?: CancelCode.User.value, -// isMe = state.isMe -// ) -// ) -// return@withState -// } -// -// // If it's an outgoing -// if (state.pendingRequest.invoke() == null || state.pendingRequest.invoke()?.isIncoming == false || state.selfVerificationMode) { -// Timber.v("## SAS show bottom sheet for outgoing request") -// if (state.pendingRequest.invoke()?.state == EVerificationState.Ready) { -// Timber.v("## SAS show bottom sheet for outgoing and ready request") -// // Show choose method fragment with waiting -// showFragment( -// VerificationChooseMethodFragment::class, -// VerificationArgs( -// otherUserId = state.otherUserId, -// verificationId = state.pendingRequest.invoke()?.transactionId -// ) -// ) -// } else { -// // Stay on the start fragment -// showFragment( -// VerificationRequestFragment::class, -// VerificationArgs( -// otherUserId = state.otherUserId, -// verificationId = state.pendingRequest.invoke()?.transactionId, -// ) -// ) -// } -// } else if (state.pendingRequest.invoke()?.isIncoming == true) { -// Timber.v("## SAS show bottom sheet for Incoming request") -// // For incoming we can switch to choose method because ready is being sent or already sent -// showFragment( -// VerificationChooseMethodFragment::class, -// VerificationArgs( -// otherUserId = state.otherUserId, -// verificationId = state.pendingRequest.invoke()?.transactionId -// ) -// ) -// } -// super.invalidate() -// } -// -// private fun showFragment(fragmentClass: KClass, argsParcelable: Parcelable? = null) { -// if (childFragmentManager.findFragmentByTag(fragmentClass.simpleName) == null) { -// childFragmentManager.commitTransaction { -// replace( -// R.id.bottomSheetFragmentContainer, -// fragmentClass.java, -// argsParcelable?.toMvRxBundle(), -// fragmentClass.simpleName -// ) -// } -// } -// } -// -// companion object { -// fun withArgs(otherUserId: String, transactionId: String): VerificationBottomSheet { -// return VerificationBottomSheet().apply { -// setArguments( -// VerificationArgs( -// otherUserId = otherUserId, -// verificationId = transactionId, -// ) -// ) -// } -// } -// -// // fun forSelfVerification(session: Session): VerificationBottomSheet { -// // return VerificationBottomSheet().apply { -// // setArguments( -// // VerificationArgs( -// // otherUserId = session.myUserId, -// // selfVerificationMode = true -// // ) -// // ) -// // } -// // } -// -// // fun forSelfVerification(session: Session, outgoingRequest: String): VerificationBottomSheet { -// // return VerificationBottomSheet().apply { -// // setArguments( -// // VerificationArgs( -// // otherUserId = session.myUserId, -// // selfVerificationMode = true, -// // verificationId = outgoingRequest -// // ) -// // ) -// // } -// // } -// -// // const val WAITING_SELF_VERIF_TAG: String = "WAITING_SELF_VERIF_TAG" -// } -// } -// -// // fun View.getParentCoordinatorLayout(): CoordinatorLayout? { -// // var current = this as? View -// // while (current != null) { -// // if (current is CoordinatorLayout) return current -// // current = current.parent as? View -// // } -// // return null -// // } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewEvents.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewEvents.kt index e52fb0e2cd..488c4ab487 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewEvents.kt @@ -27,6 +27,7 @@ sealed class VerificationBottomSheetViewEvents : VectorViewEvents { object AccessSecretStore : VerificationBottomSheetViewEvents() object ResetAll : VerificationBottomSheetViewEvents() object GoToSettings : VerificationBottomSheetViewEvents() + data class ConfirmCancel(val otherUserId: String, val deviceId: String?) : VerificationBottomSheetViewEvents() data class ModalError(val errorMessage: CharSequence) : VerificationBottomSheetViewEvents() data class RequestNotFound(val transactionId: String) : VerificationBottomSheetViewEvents() } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt deleted file mode 100644 index 61e70265a4..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ /dev/null @@ -1,665 +0,0 @@ -// /* -// * Copyright 2019 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.verification -// -// import com.airbnb.mvrx.Async -// import com.airbnb.mvrx.Fail -// import com.airbnb.mvrx.Loading -// import com.airbnb.mvrx.MavericksState -// import com.airbnb.mvrx.MavericksViewModelFactory -// import com.airbnb.mvrx.Success -// import com.airbnb.mvrx.Uninitialized -// import dagger.assisted.Assisted -// import dagger.assisted.AssistedFactory -// import dagger.assisted.AssistedInject -// import im.vector.app.R -// import im.vector.app.core.di.MavericksAssistedViewModelFactory -// import im.vector.app.core.di.hiltMavericksViewModelFactory -// import im.vector.app.core.platform.VectorViewModel -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.features.raw.wellknown.getElementWellknown -// import im.vector.app.features.raw.wellknown.isSecureBackupRequired -// import im.vector.app.features.session.coroutineScope -// import kotlinx.coroutines.Dispatchers -// import kotlinx.coroutines.flow.collect -// import kotlinx.coroutines.flow.filter -// import kotlinx.coroutines.flow.launchIn -// import kotlinx.coroutines.flow.onEach -// import kotlinx.coroutines.launch -// import org.matrix.android.sdk.api.Matrix -// import org.matrix.android.sdk.api.extensions.orFalse -// import org.matrix.android.sdk.api.extensions.tryOrNull -// import org.matrix.android.sdk.api.raw.RawService -// 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 -// import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME -// import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME -// import org.matrix.android.sdk.api.session.crypto.crosssigning.isVerified -// import org.matrix.android.sdk.api.session.crypto.keysbackup.BackupUtils -// import org.matrix.android.sdk.api.session.crypto.keysbackup.computeRecoveryKey -// import org.matrix.android.sdk.api.session.crypto.keysbackup.toKeysVersionResult -// import org.matrix.android.sdk.api.session.crypto.verification.CancelCode -// import org.matrix.android.sdk.api.session.crypto.verification.IVerificationRequest -// import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest -// import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationEvent -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationService -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState -// import org.matrix.android.sdk.api.session.events.model.LocalEcho -// import org.matrix.android.sdk.api.session.getUser -// import org.matrix.android.sdk.api.util.MatrixItem -// import org.matrix.android.sdk.api.util.fromBase64 -// import org.matrix.android.sdk.api.util.toMatrixItem -// import timber.log.Timber -// -// data class VerificationBottomSheetViewState( -// val otherUserId: String, -// val verificationId: String?, -// val roomId: String?, -// // true when we display the loading and we wait for the other (incoming request) -// val selfVerificationMode: Boolean, -// val otherUserMxItem: MatrixItem, -// val pendingRequest: Async = Uninitialized, -// val pendingLocalId: String? = null, -// val sasTransactionState: VerificationTxState? = null, -// val qrTransactionState: VerificationTxState? = null, -// val transactionId: String? = null, -// val verifiedFromPrivateKeys: Boolean = false, -// val verifyingFrom4S: Boolean = false, -// val isMe: Boolean = false, -// val currentDeviceCanCrossSign: Boolean = false, -// val userWantsToCancel: Boolean = false, -// val userThinkItsNotHim: Boolean = false, -// val quadSContainsSecrets: Boolean = true, -// val isVerificationRequired: Boolean = false, -// val quadSHasBeenReset: Boolean = false, -// val hasAnyOtherSession: Boolean = false -// ) : MavericksState { -// -// constructor(args: VerificationBottomSheet.VerificationArgs) : this( -// otherUserId = args.otherUserId, -// verificationId = args.verificationId, -// selfVerificationMode = args.selfVerificationMode, -// roomId = args.roomId, -// otherUserMxItem = MatrixItem.UserItem(args.otherUserId), -// ) -// } -// -// class VerificationBottomSheetViewModel @AssistedInject constructor( -// @Assisted initialState: VerificationBottomSheetViewState, -// private val rawService: RawService, -// private val session: Session, -// private val supportedVerificationMethodsProvider: SupportedVerificationMethodsProvider, -// private val stringProvider: StringProvider, -// private val matrix: Matrix, -// ) : -// VectorViewModel(initialState), -// VerificationService.Listener { -// -// @AssistedFactory -// interface Factory : MavericksAssistedViewModelFactory { -// override fun create(initialState: VerificationBottomSheetViewState): VerificationBottomSheetViewModel -// } -// -// companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() -// -// init { -// // session.cryptoService().verificationService().addListener(this) -// -// // This is async, but at this point should be in cache -// // so it's ok to not wait until result -// viewModelScope.launch(Dispatchers.IO) { -// val wellKnown = rawService.getElementWellknown(session.sessionParams) -// setState { -// copy(isVerificationRequired = wellKnown?.isSecureBackupRequired().orFalse()) -// } -// } -// -// -// // viewModelScope.launch { -// // -// // var autoReady = false -// // val pr = if (initialState.selfVerificationMode) { -// // // See if active tx for this user and take it -// // -// // session.cryptoService().verificationService().getExistingVerificationRequests(initialState.otherUserId) -// // .lastOrNull { !it.isFinished } -// // ?.also { verificationRequest -> -// // if (verificationRequest.isIncoming && !verificationRequest.isReady) { -// // // auto ready in this case, as we are waiting -// // autoReady = true -// // } -// // } -// // } else { -// // session.cryptoService().verificationService().getExistingVerificationRequest(initialState.otherUserId, initialState.transactionId) -// // } -// // -// // val sasTx = (pr?.transactionId ?: initialState.transactionId)?.let { -// // session.cryptoService().verificationService().getExistingTransaction(initialState.otherUserId, it) as? SasVerificationTransaction -// // } -// // -// // val qrTx = (pr?.transactionId ?: initialState.transactionId)?.let { -// // session.cryptoService().verificationService().getExistingTransaction(initialState.otherUserId, it) as? QrCodeVerificationTransaction -// // } -// // -// // setState { -// // copy( -// // sasTransactionState = sasTx?.state, -// // qrTransactionState = qrTx?.state, -// // transactionId = pr?.transactionId ?: initialState.transactionId, -// // pendingRequest = if (pr != null) Success(pr) else Uninitialized, -// // isMe = initialState.otherUserId == session.myUserId, -// // currentDeviceCanCrossSign = session.cryptoService().crossSigningService().canCrossSign(), -// // quadSContainsSecrets = session.sharedSecretStorageService().isRecoverySetup(), -// // hasAnyOtherSession = hasAnyOtherSession -// // ) -// // } -// // -// // if (autoReady) { -// // // TODO, can I be here in DM mode? in this case should test if roomID is null? -// // session.cryptoService().verificationService() -// // .readyPendingVerification( -// // supportedVerificationMethodsProvider.provide(), -// // pr!!.otherUserId, -// // pr.transactionId ?: "" -// // ) -// // } -// // } -// } -// -// private fun fetchOtherUserProfile(otherUserId: String) { -// session.getUser(otherUserId)?.toMatrixItem()?.let { -// setState { -// copy( -// otherUserMxItem = it -// ) -// } -// } -// // Always fetch the latest User data -// viewModelScope.launch { -// tryOrNull { session.userService().resolveUser(otherUserId) } -// ?.toMatrixItem() -// ?.let { -// setState { -// copy( -// otherUserMxItem = it -// ) -// } -// } -// } -// } -// -// // override fun onCleared() { -// // super.onCleared() -// // } -// -// fun queryCancel() = withState { state -> -// if (state.userThinkItsNotHim) { -// setState { -// copy(userThinkItsNotHim = false) -// } -// } else { -// // if the verification is already done you can't cancel anymore -// if (state.pendingRequest.invoke()?.cancelConclusion != null || -// // state.sasTransactionState is VerificationTxState.TerminalTxState || -// state.verifyingFrom4S) { -// // you cannot cancel anymore -// } else { -// if (!state.isVerificationRequired) { -// setState { -// copy(userWantsToCancel = true) -// } -// } -// } -// } -// } -// -// fun confirmCancel() = withState { state -> -// cancelAllPendingVerifications(state) -// _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) -// } -// -// private fun cancelAllPendingVerifications(state: VerificationBottomSheetViewState) { -// viewModelScope.launch { -// session.cryptoService() -// .verificationService().getExistingVerificationRequest(state.otherUserId, state.transactionId)?.let { -// session.cryptoService().verificationService().cancelVerificationRequest(it) -// } -// session.cryptoService() -// .verificationService() -// .getExistingTransaction(state.otherUserId, state.transactionId ?: "") -// ?.cancel(CancelCode.User) -// } -// } -// -// fun continueFromCancel() { -// setState { -// copy(userWantsToCancel = false) -// } -// } -// -// fun continueFromWasNotMe() { -// setState { -// copy(userThinkItsNotHim = false) -// } -// } -// -// fun itWasNotMe() { -// setState { -// copy(userThinkItsNotHim = true) -// } -// } -// -// fun goToSettings() = withState { state -> -// cancelAllPendingVerifications(state) -// _viewEvents.post(VerificationBottomSheetViewEvents.GoToSettings) -// } -// -// override fun handle(action: VerificationAction) = withState { state -> -// val otherUserId = state.otherUserId -// val roomId = state.roomId -// ?: session.roomService().getExistingDirectRoomWithUser(otherUserId) -// -// when (action) { -// is VerificationAction.RequestVerificationByDM -> { -// setState { -// copy( -// pendingRequest = Loading() -// ) -// } -// -// if (roomId == null) { -// // val localId = LocalEcho.createLocalEchoId() -// session.coroutineScope.launch { -// try { -// val roomId = session.roomService().createDirectRoom(otherUserId) -// val request = session -// .cryptoService() -// .verificationService() -// .requestKeyVerificationInDMs( -// supportedVerificationMethodsProvider.provide(), -// otherUserId, -// roomId, -// ) -// setState { -// copy( -// roomId = roomId, -// pendingRequest = Success(request), -// transactionId = request.transactionId -// ) -// } -// } catch (failure: Throwable) { -// setState { -// copy(pendingRequest = Fail(failure)) -// } -// } -// } -// } else { -// session.coroutineScope.launch { -// val request = session -// .cryptoService() -// .verificationService() -// .requestKeyVerificationInDMs(supportedVerificationMethodsProvider.provide(), otherUserId, roomId) -// setState { -// copy( -// pendingRequest = Success(request), -// transactionId = request.transactionId -// ) -// } -// } -// } -// Unit -// } -// is VerificationAction.StartSASVerification -> { -// viewModelScope.launch { -// val request = session.cryptoService().verificationService().getExistingVerificationRequest(otherUserId, state.transactionId) -// ?: return@launch -// val otherDevice = request.otherDeviceId -// if (roomId == null) { -// session.cryptoService().verificationService().requestSelfKeyVerification( -// listOf(VerificationMethod.SAS) -// ) -// } else { -// session.cryptoService().verificationService().requestKeyVerificationInDMs( -// listOf(VerificationMethod.SAS), -// roomId = roomId, -// otherUserId = request.otherUserId, -// ) -// } -// } -// Unit -// } -// is VerificationAction.RemoteQrCodeScanned -> { -// viewModelScope.launch { -// val existingTransaction = session.cryptoService().verificationService() -// .getExistingTransaction(action.otherUserId, action.transactionId) as? QrCodeVerificationTransaction -// existingTransaction -// ?.userHasScannedOtherQrCode(action.scannedData) -// } -// } -// is VerificationAction.OtherUserScannedSuccessfully -> { -// viewModelScope.launch { -// val transactionId = state.transactionId ?: return@launch -// -// val existingTransaction = session.cryptoService().verificationService() -// .getExistingTransaction(otherUserId, transactionId) as? QrCodeVerificationTransaction -// existingTransaction -// ?.otherUserScannedMyQrCode() -// } -// } -// is VerificationAction.OtherUserDidNotScanned -> { -// val transactionId = state.transactionId ?: return@withState -// viewModelScope.launch { -// val existingTransaction = session.cryptoService().verificationService() -// .getExistingTransaction(otherUserId, transactionId) as? QrCodeVerificationTransaction -// existingTransaction -// ?.otherUserDidNotScannedMyQrCode() -// } -// } -// is VerificationAction.SASMatchAction -> { -// val request = state.pendingRequest.invoke() ?: return@withState -// viewModelScope.launch { -// (session.cryptoService().verificationService() -// .getExistingTransaction(request.otherUserId, request.transactionId) -// as? SasVerificationTransaction)?.userHasVerifiedShortCode() -// } -// } -// is VerificationAction.SASDoNotMatchAction -> { -// val request = state.pendingRequest.invoke() ?: return@withState -// viewModelScope.launch { -// (session.cryptoService().verificationService() -// .getExistingTransaction(request.otherUserId, request.transactionId) -// as? SasVerificationTransaction) -// ?.shortCodeDoesNotMatch() -// } -// } -// is VerificationAction.ReadyPendingVerification -> { -// state.pendingRequest.invoke()?.let { request -> -// // will only be there for dm verif -// session.coroutineScope.launch { -// if (state.roomId != null) { -// session.cryptoService().verificationService() -// .readyPendingVerification( -// supportedVerificationMethodsProvider.provide(), -// state.otherUserId, -// request.transactionId -// ) -// } -// } -// } -// } -// is VerificationAction.CancelPendingVerification -> { -// state.pendingRequest.invoke()?.let { -// session.coroutineScope.launch { -// session.cryptoService().verificationService() -// .cancelVerificationRequest(it) -// } -// } -// _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) -// } -// is VerificationAction.GotItConclusion -> { -// if (state.isVerificationRequired && !action.verified) { -// // we should go back to first screen -// setState { -// copy( -// pendingRequest = Uninitialized, -// // sasTransactionState = null, -// // qrTransactionState = null -// ) -// } -// } else { -// _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) -// } -// } -// is VerificationAction.SkipVerification -> { -// _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) -// } -// is VerificationAction.VerifyFromPassphrase -> { -// setState { copy(verifyingFrom4S = true) } -// _viewEvents.post(VerificationBottomSheetViewEvents.AccessSecretStore) -// } -// is VerificationAction.GotResultFromSsss -> { -// handleSecretBackFromSSSS(action) -// } -// VerificationAction.SecuredStorageHasBeenReset -> { -// if (session.cryptoService().crossSigningService().allPrivateKeysKnown()) { -// setState { -// copy(quadSHasBeenReset = true, verifyingFrom4S = false) -// } -// } -// Unit -// } -// VerificationAction.CancelledFromSsss -> { -// setState { -// copy(verifyingFrom4S = false) -// } -// } -// } -// } -// -// private fun handleSecretBackFromSSSS(action: VerificationAction.GotResultFromSsss) { -// viewModelScope.launch(Dispatchers.IO) { -// try { -// action.cypherData.fromBase64().inputStream().use { ins -> -// val res = matrix.secureStorageService().loadSecureSecret>(ins, action.alias) -// val trustResult = session.cryptoService().crossSigningService().checkTrustFromPrivateKeys( -// res?.get(MASTER_KEY_SSSS_NAME), -// res?.get(USER_SIGNING_KEY_SSSS_NAME), -// res?.get(SELF_SIGNING_KEY_SSSS_NAME) -// ) -// if (trustResult.isVerified()) { -// // Sign this device and upload the signature -// try { -// session.cryptoService().crossSigningService().trustDevice(session.sessionParams.deviceId) -// } catch (failure: Exception) { -// Timber.w(failure, "Failed to sign my device after recovery") -// } -// -// setState { -// copy( -// verifyingFrom4S = false, -// verifiedFromPrivateKeys = true -// ) -// } -// -// // try the keybackup -// tentativeRestoreBackup(res) -// } else { -// setState { -// copy( -// verifyingFrom4S = false -// ) -// } -// // POP UP something -// _viewEvents.post(VerificationBottomSheetViewEvents.ModalError(stringProvider.getString(R.string.error_failed_to_import_keys))) -// } -// } -// } catch (failure: Throwable) { -// setState { -// copy( -// verifyingFrom4S = false -// ) -// } -// _viewEvents.post( -// VerificationBottomSheetViewEvents.ModalError(failure.localizedMessage ?: stringProvider.getString(R.string.unexpected_error)) -// ) -// } -// } -// } -// -// private fun tentativeRestoreBackup(res: Map?) { -// // on session scope because will happen after viewmodel is cleared -// session.coroutineScope.launch { -// // It's not a good idea to download the full backup, it might take very long -// // and use a lot of resources -// // Just check that the key is valid and store it, the backup will be used megolm session per -// // megolm session when an UISI is encountered -// try { -// val secret = res?.get(KEYBACKUP_SECRET_SSSS_NAME) ?: return@launch Unit.also { -// Timber.v("## Keybackup secret not restored from SSSS") -// } -// -// val version = session.cryptoService().keysBackupService().getCurrentVersion()?.toKeysVersionResult() ?: return@launch -// -// val recoveryKey = computeRecoveryKey(secret.fromBase64()) -// val backupRecoveryKey = BackupUtils.recoveryKeyFromBase58(recoveryKey) -// val isValid = backupRecoveryKey -// ?.let { session.cryptoService().keysBackupService().isValidRecoveryKeyForCurrentVersion(it) } -// ?: false -// if (isValid) { -// session.cryptoService().keysBackupService().saveBackupRecoveryKey(backupRecoveryKey, version.version) -// } -// session.cryptoService().keysBackupService().trustKeysBackupVersion(version, true) -// } catch (failure: Throwable) { -// // Just ignore for now -// Timber.e(failure, "## Failed to restore backup after SSSS recovery") -// } -// } -// } -// -// // override fun transactionCreated(tx: VerificationTransaction) { -// // transactionUpdated(tx) -// // } -// // -// // override fun transactionUpdated(tx: VerificationTransaction) = withState { state -> -// // if (state.selfVerificationMode && state.transactionId == null) { -// // // is this an incoming with that user -// // if (tx.isIncoming && tx.otherUserId == state.otherUserId) { -// // // Also auto accept incoming if needed! -// // if (tx is IncomingSasVerificationTransaction) { -// // if (tx.uxState == IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT) { -// // tx.performAccept() -// // } -// // } -// // // Use this one! -// // setState { -// // copy( -// // transactionId = tx.transactionId, -// // sasTransactionState = tx.state.takeIf { tx is SasVerificationTransaction }, -// // qrTransactionState = tx.state.takeIf { tx is QrCodeVerificationTransaction } -// // ) -// // } -// // } -// // } -// // -// // when (tx) { -// // is SasVerificationTransaction -> { -// // if (tx.transactionId == (state.pendingRequest.invoke()?.transactionId ?: state.transactionId)) { -// // // A SAS tx has been started following this request -// // setState { -// // copy( -// // transactionId = tx.transactionId, -// // sasTransactionState = tx.state.takeIf { tx is SasVerificationTransaction }, -// // qrTransactionState = tx.state.takeIf { tx is QrCodeVerificationTransaction } -// // ) -// // } -// // } -// // } -// // -// // when (tx) { -// // is SasVerificationTransaction -> { -// // if (tx.transactionId == (state.pendingRequest.invoke()?.transactionId ?: state.transactionId)) { -// // // A SAS tx has been started following this request -// // setState { -// // copy( -// // sasTransactionState = tx.state -// // ) -// // } -// // } -// // } -// // is QrCodeVerificationTransaction -> { -// // if (tx.transactionId == (state.pendingRequest.invoke()?.transactionId ?: state.transactionId)) { -// // // A QR tx has been started following this request -// // setState { -// // copy( -// // qrTransactionState = tx.state -// // ) -// // } -// // } -// // } -// // } -// // } -// // } -// -// override fun transactionCreated(tx: VerificationTransaction) { -// transactionUpdated(tx) -// } -// -// override fun transactionUpdated(tx: VerificationTransaction) = withState { state -> -// Timber.v("transactionUpdated: $tx") -// if (tx.transactionId != state.transactionId) return@withState -// if (tx is SasVerificationTransaction) { -// // setState { -// // copy( -// // sasTransactionState = tx.state -// // ) -// // } -// } else if (tx is QrCodeVerificationTransaction) { -// -// } -// // handleTransactionUpdate(state, tx) -// } -// -// override fun verificationRequestCreated(pr: PendingVerificationRequest) { -// verificationRequestUpdated(pr) -// } -// -// override fun verificationRequestUpdated(pr: PendingVerificationRequest) = withState { state -> -// Timber.v("VerificationRequestUpdated: $pr") -// if (pr.transactionId != state.pendingRequest.invoke()?.transactionId) return@withState -// setState { -// copy(pendingRequest = Success(pr)) -// } -// // if (state.selfVerificationMode && state.pendingRequest.invoke() == null && state.transactionId == null) { -// // // is this an incoming with that user -// // if (pr.isIncoming && pr.otherUserId == state.otherUserId) { -// // if (!pr.isReady) { -// // // auto ready in this case, as we are waiting -// // // TODO, can I be here in DM mode? in this case should test if roomID is null? -// // viewModelScope.launch { -// // session.cryptoService().verificationService() -// // .readyPendingVerification( -// // supportedVerificationMethodsProvider.provide(), -// // pr.otherUserId, -// // pr.transactionId -// // ) -// // } -// // } -// // -// // // Use this one! -// // setState { -// // copy( -// // transactionId = pr.transactionId, -// // pendingRequest = Success(pr) -// // ) -// // } -// // return@withState -// // } -// // } -// // -// // if (state.transactionId == pr.transactionId) { -// // setState { -// // copy( -// // pendingRequest = Success(pr) -// // ) -// // } -// // } -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelController.kt deleted file mode 100644 index e31bfc701c..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelController.kt +++ /dev/null @@ -1,109 +0,0 @@ -// /* -// * Copyright (c) 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.verification.cancel -// -// import androidx.core.text.toSpannable -// import com.airbnb.epoxy.EpoxyController -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.core.utils.colorizeMatchingText -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewState -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.displayname.getBestName -// import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import javax.inject.Inject -// -// class VerificationCancelController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationBottomSheetViewState? = null -// -// fun update(viewState: VerificationBottomSheetViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// val host = this -// if (state.isMe) { -// if (state.currentDeviceCanCrossSign) { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verify_cancel_self_verification_from_trusted).toEpoxyCharSequence()) -// } -// } else { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verify_cancel_self_verification_from_untrusted).toEpoxyCharSequence()) -// } -// } -// } else { -// val otherUserID = state.otherUserId -// val otherDisplayName = state.otherUserMxItem.getBestName() -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice( -// EpoxyCharSequence( -// host.stringProvider.getString(R.string.verify_cancel_other, otherDisplayName, otherUserID) -// .toSpannable() -// .colorizeMatchingText(otherUserID, host.colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color)) -// ) -// ) -// } -// } -// -// bottomSheetDividerItem { -// id("sep0") -// } -// -// bottomSheetVerificationActionItem { -// id("cancel") -// title(host.stringProvider.getString(R.string.action_skip)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// listener { host.listener?.onTapCancel() } -// } -// -// bottomSheetDividerItem { -// id("sep1") -// } -// -// bottomSheetVerificationActionItem { -// id("continue") -// title(host.stringProvider.getString(R.string._continue)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// listener { host.listener?.onTapContinue() } -// } -// } -// -// interface Listener { -// fun onTapCancel() -// fun onTapContinue() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelFragment.kt deleted file mode 100644 index aaf811625e..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationCancelFragment.kt +++ /dev/null @@ -1,73 +0,0 @@ -// /* -// * Copyright (c) 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.verification.cancel -// -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationCancelFragment : -// VectorBaseFragment(), -// VerificationCancelController.Listener { -// -// @Inject lateinit var controller: VerificationCancelController -// -// private val viewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun onTapCancel() { -// viewModel.confirmCancel() -// } -// -// override fun onTapContinue() { -// viewModel.continueFromCancel() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeController.kt deleted file mode 100644 index cc4026d532..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeController.kt +++ /dev/null @@ -1,84 +0,0 @@ -// /* -// * Copyright (c) 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.verification.cancel -// -// import com.airbnb.epoxy.EpoxyController -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewState -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.html.EventHtmlRenderer -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import javax.inject.Inject -// -// class VerificationNotMeController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider, -// private val eventHtmlRenderer: EventHtmlRenderer -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationBottomSheetViewState? = null -// -// fun update(viewState: VerificationBottomSheetViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val host = this -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.eventHtmlRenderer.render(host.stringProvider.getString(R.string.verify_not_me_self_verification)).toEpoxyCharSequence()) -// } -// -// bottomSheetDividerItem { -// id("sep0") -// } -// -// bottomSheetVerificationActionItem { -// id("skip") -// title(host.stringProvider.getString(R.string.action_skip)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onTapSkip() } -// } -// -// bottomSheetDividerItem { -// id("sep1") -// } -// -// bottomSheetVerificationActionItem { -// id("settings") -// title(host.stringProvider.getString(R.string.settings)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// listener { host.listener?.onTapSettings() } -// } -// } -// -// interface Listener { -// fun onTapSkip() -// fun onTapSettings() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeFragment.kt deleted file mode 100644 index f01abcdfa7..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/cancel/VerificationNotMeFragment.kt +++ /dev/null @@ -1,73 +0,0 @@ -// /* -// * Copyright (c) 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.verification.cancel -// -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationNotMeFragment : -// VectorBaseFragment(), -// VerificationNotMeController.Listener { -// -// @Inject lateinit var controller: VerificationNotMeController -// -// private val viewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun onTapSkip() { -// viewModel.continueFromWasNotMe() -// } -// -// override fun onTapSettings() { -// viewModel.goToSettings() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt deleted file mode 100644 index e3aaf0dc9c..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt +++ /dev/null @@ -1,147 +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.verification.choose -// -// import com.airbnb.epoxy.EpoxyController -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.core.ui.list.buttonPositiveDestructiveButtonBarItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationQrCodeItem -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import javax.inject.Inject -// -// class VerificationChooseMethodController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationChooseMethodViewState? = null -// -// fun update(viewState: VerificationChooseMethodViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// val host = this -// -// if (state.otherCanScanQrCode || state.otherCanShowQrCode) { -// val scanCodeInstructions: String -// val scanOtherCodeTitle: String -// val compareEmojiSubtitle: String -// if (state.isMe) { -// scanCodeInstructions = stringProvider.getString(R.string.verification_scan_self_notice) -// scanOtherCodeTitle = stringProvider.getString(R.string.verification_scan_with_this_device) -// compareEmojiSubtitle = stringProvider.getString(R.string.verification_scan_self_emoji_subtitle) -// } else { -// scanCodeInstructions = stringProvider.getString(R.string.verification_scan_notice) -// scanOtherCodeTitle = stringProvider.getString(R.string.verification_scan_their_code) -// compareEmojiSubtitle = stringProvider.getString(R.string.verification_scan_emoji_subtitle) -// } -// -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(scanCodeInstructions.toEpoxyCharSequence()) -// } -// -// if (state.otherCanScanQrCode && !state.qrCodeText.isNullOrBlank()) { -// bottomSheetVerificationQrCodeItem { -// id("qr") -// data(state.qrCodeText) -// } -// -// bottomSheetDividerItem { -// id("sep0") -// } -// } -// -// if (state.otherCanShowQrCode) { -// bottomSheetVerificationActionItem { -// id("openCamera") -// title(scanOtherCodeTitle) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_camera) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// listener { host.listener?.openCamera() } -// } -// -// bottomSheetDividerItem { -// id("sep1") -// } -// } -// -// bottomSheetVerificationActionItem { -// id("openEmoji") -// title(host.stringProvider.getString(R.string.verification_scan_emoji_title)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// subTitle(compareEmojiSubtitle) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.doVerifyBySas() } -// } -// } else if (state.sasModeAvailable) { -// bottomSheetVerificationActionItem { -// id("openEmoji") -// title(host.stringProvider.getString(R.string.verification_no_scan_emoji_title)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.doVerifyBySas() } -// } -// } else if (!state.isReadySent) { -// // a bit of a special case, if you tapped on the timeline cell but not on a button -// buttonPositiveDestructiveButtonBarItem { -// id("accept_decline") -// positiveText(host.stringProvider.getString(R.string.action_accept).toEpoxyCharSequence()) -// destructiveText(host.stringProvider.getString(R.string.action_decline).toEpoxyCharSequence()) -// positiveButtonClickAction { host.listener?.acceptRequest() } -// destructiveButtonClickAction { host.listener?.declineRequest() } -// } -// } -// -// if (state.isMe && state.canCrossSign) { -// bottomSheetDividerItem { -// id("sep_notMe") -// } -// -// bottomSheetVerificationActionItem { -// id("wasnote") -// title(host.stringProvider.getString(R.string.verify_new_session_was_not_me)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// subTitle(host.stringProvider.getString(R.string.verify_new_session_compromized)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onClickOnWasNotMe() } -// } -// } -// } -// -// interface Listener { -// fun openCamera() -// fun doVerifyBySas() -// fun onClickOnWasNotMe() -// fun acceptRequest() -// fun declineRequest() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodFragment.kt deleted file mode 100644 index a187dda48d..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodFragment.kt +++ /dev/null @@ -1,136 +0,0 @@ -// /* -// * Copyright 2019 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.verification.choose -// -// import android.app.Activity -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.fragmentViewModel -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.R -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.extensions.registerStartForActivityResult -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO -// import im.vector.app.core.utils.checkPermissions -// import im.vector.app.core.utils.onPermissionDeniedDialog -// import im.vector.app.core.utils.registerForPermissionsResult -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationAction -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import im.vector.app.features.qrcode.QrCodeScannerActivity -// import timber.log.Timber -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationChooseMethodFragment : -// VectorBaseFragment(), -// VerificationChooseMethodController.Listener { -// -// @Inject lateinit var controller: VerificationChooseMethodController -// private val viewModel by fragmentViewModel(VerificationChooseMethodViewModel::class) -// -// private val sharedViewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun doVerifyBySas() = withState(sharedViewModel) { state -> -// sharedViewModel.handle( -// VerificationAction.StartSASVerification -// ) -// } -// -// private val openCameraActivityResultLauncher = registerForPermissionsResult { allGranted, deniedPermanently -> -// if (allGranted) { -// doOpenQRCodeScanner() -// } else if (deniedPermanently) { -// activity?.onPermissionDeniedDialog(R.string.denied_permission_camera) -// } -// } -// -// override fun openCamera() { -// if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, requireActivity(), openCameraActivityResultLauncher)) { -// doOpenQRCodeScanner() -// } -// } -// -// override fun onClickOnWasNotMe() { -// sharedViewModel.itWasNotMe() -// } -// -// override fun acceptRequest() { -// sharedViewModel.handle(VerificationAction.ReadyPendingVerification) -// } -// -// override fun declineRequest() { -// sharedViewModel.handle(VerificationAction.CancelPendingVerification) -// } -// -// private fun doOpenQRCodeScanner() { -// QrCodeScannerActivity.startForResult(requireActivity(), scanActivityResultLauncher) -// } -// -// private val scanActivityResultLauncher = registerStartForActivityResult { activityResult -> -// if (activityResult.resultCode == Activity.RESULT_OK) { -// val scannedQrCode = QrCodeScannerActivity.getResultText(activityResult.data) -// val wasQrCode = QrCodeScannerActivity.getResultIsQrCode(activityResult.data) -// -// if (wasQrCode && !scannedQrCode.isNullOrBlank()) { -// onRemoteQrCodeScanned(scannedQrCode) -// } else { -// Timber.w("It was not a QR code, or empty result") -// } -// } -// } -// -// private fun onRemoteQrCodeScanned(remoteQrCode: String) = withState(sharedViewModel) { state -> -// sharedViewModel.handle( -// VerificationAction.RemoteQrCodeScanned( -// state.otherUserId, -// state.pendingRequest.invoke()?.transactionId ?: "", -// remoteQrCode -// ) -// ) -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt deleted file mode 100644 index 1dbfde307a..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt +++ /dev/null @@ -1,172 +0,0 @@ -// /* -// * Copyright 2019 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.verification.choose -// -// import com.airbnb.mvrx.MavericksState -// import com.airbnb.mvrx.MavericksViewModelFactory -// import com.airbnb.mvrx.ViewModelContext -// import dagger.assisted.Assisted -// import dagger.assisted.AssistedFactory -// import dagger.assisted.AssistedInject -// import dagger.hilt.EntryPoints -// import im.vector.app.core.di.MavericksAssistedViewModelFactory -// import im.vector.app.core.di.SingletonEntryPoint -// import im.vector.app.core.di.hiltMavericksViewModelFactory -// import im.vector.app.core.platform.EmptyAction -// import im.vector.app.core.platform.EmptyViewEvents -// import im.vector.app.core.platform.VectorViewModel -// import im.vector.app.features.crypto.verification.VerificationBottomSheet -// import kotlinx.coroutines.flow.launchIn -// import kotlinx.coroutines.flow.onEach -// import kotlinx.coroutines.launch -// import org.matrix.android.sdk.api.extensions.orFalse -// import org.matrix.android.sdk.api.session.Session -// import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState -// import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest -// import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationEvent -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationService -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction -// -// data class VerificationChooseMethodViewState( -// val otherUserId: String = "", -// val transactionId: String = "", -// val otherCanShowQrCode: Boolean = false, -// val otherCanScanQrCode: Boolean = false, -// val qrCodeText: String? = null, -// val sasModeAvailable: Boolean = false, -// val isMe: Boolean = false, -// val canCrossSign: Boolean = false, -// val isReadySent: Boolean = false -// ) : MavericksState -// -// class VerificationChooseMethodViewModel @AssistedInject constructor( -// @Assisted initialState: VerificationChooseMethodViewState, -// private val session: Session -// ) : VectorViewModel(initialState), VerificationService.Listener { -// -// init { -// // session.cryptoService().verificationService().addListener(this) -// -// session.cryptoService().verificationService() -// .requestEventFlow() -// .onEach { -// when (it) { -// // TODO check transaction id -// is VerificationEvent.RequestAdded -> verificationRequestCreated(it.request) -// is VerificationEvent.RequestUpdated -> verificationRequestUpdated(it.request) -// is VerificationEvent.TransactionAdded -> transactionCreated(it.transaction) -// is VerificationEvent.TransactionUpdated -> transactionUpdated(it.transaction) -// } -// } -// .launchIn(viewModelScope) -// -// viewModelScope.launch { -// -// val verificationService = session.cryptoService().verificationService() -// val pvr = verificationService.getExistingVerificationRequest(initialState.otherUserId, initialState.transactionId) -// -// // Get the QR code now, because transaction is already created, so transactionCreated() will not be called -// val qrCodeVerificationTransaction = verificationService.getExistingTransaction(initialState.otherUserId, initialState.transactionId) -// -// setState { -// VerificationChooseMethodViewState( -// otherUserId = initialState.otherUserId, -// isMe = session.myUserId == pvr?.otherUserId, -// canCrossSign = session.cryptoService().crossSigningService().canCrossSign(), -// transactionId = pvr?.transactionId ?: initialState.transactionId, -// otherCanShowQrCode = pvr?.otherCanShowQrCode.orFalse(), -// otherCanScanQrCode = pvr?.otherCanScanQrCode.orFalse(), -// qrCodeText = pvr?.qrCodeText, -// sasModeAvailable = pvr?.isSasSupported.orFalse(), -// isReadySent = pvr?.state == EVerificationState.Ready -// ) -// } -// } -// -// -// } -// -// override fun transactionCreated(tx: VerificationTransaction) { -// transactionUpdated(tx) -// } -// -// override fun transactionUpdated(tx: VerificationTransaction) = withState { state -> -// // if (tx.transactionId == state.transactionId && tx is QrCodeVerificationTransaction) { -// // setState { -// // copy( -// // qrCodeText = tx.qrCodeText -// // ) -// // } -// // } -// } -// -// override fun verificationRequestCreated(pr: PendingVerificationRequest) { -// verificationRequestUpdated(pr) -// } -// -// override fun verificationRequestUpdated(pr: PendingVerificationRequest) = withState { state -> -// viewModelScope.launch { -// val pvr = session.cryptoService().verificationService().getExistingVerificationRequest(state.otherUserId, state.transactionId) -// -// setState { -// copy( -// otherCanShowQrCode = pvr?.otherCanShowQrCode.orFalse(), -// otherCanScanQrCode = pvr?.otherCanScanQrCode.orFalse(), -// sasModeAvailable = pvr?.isSasSupported.orFalse(), -// isReadySent = pvr?.state == EVerificationState.Ready, -// qrCodeText = pvr?.qrCodeText -// ) -// } -// } -// } -// -// @AssistedFactory -// interface Factory : MavericksAssistedViewModelFactory { -// override fun create(initialState: VerificationChooseMethodViewState): VerificationChooseMethodViewModel -// } -// -// companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { -// -// override fun initialState(viewModelContext: ViewModelContext): VerificationChooseMethodViewState { -// val args: VerificationBottomSheet.VerificationArgs = viewModelContext.args() -// val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession() -// val verificationService = session.cryptoService().verificationService() -// // val pvr = verificationService.getExistingVerificationRequest(args.otherUserId, args.verificationId) -// -// // Get the QR code now, because transaction is already created, so transactionCreated() will not be called -// // val qrCodeVerificationTransaction = verificationService.getExistingTransaction(args.otherUserId, args.verificationId ?: "") -// -// return VerificationChooseMethodViewState( -// otherUserId = args.otherUserId, -// // isMe = session.myUserId == pvr?.otherUserId, -// canCrossSign = session.cryptoService().crossSigningService().canCrossSign(), -// transactionId = args.verificationId ?: "", -// // otherCanShowQrCode = pvr?.otherCanShowQrCode().orFalse(), -// // otherCanScanQrCode = pvr?.otherCanScanQrCode().orFalse(), -// // qrCodeText = (qrCodeVerificationTransaction as? QrCodeVerificationTransaction)?.qrCodeText, -// // sasModeAvailable = pvr?.isSasSupported().orFalse() -// ) -// } -// } -// -// override fun onCleared() { -// // session.cryptoService().verificationService().removeListener(this) -// super.onCleared() -// } -// -// override fun handle(action: EmptyAction) {} -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionController.kt deleted file mode 100644 index 0eda50cecf..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionController.kt +++ /dev/null @@ -1,143 +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.verification.conclusion -// -// import com.airbnb.epoxy.EpoxyController -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// 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 im.vector.app.features.html.EventHtmlRenderer -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -// import javax.inject.Inject -// -// class VerificationConclusionController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider, -// private val eventHtmlRenderer: EventHtmlRenderer -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationConclusionViewState? = null -// -// fun update(viewState: VerificationConclusionViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// val host = this -// -// when (state.conclusionState) { -// ConclusionState.SUCCESS -> { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice( -// host.stringProvider.getString( -// if (state.isSelfVerification) R.string.verification_conclusion_ok_self_notice -// else R.string.verification_conclusion_ok_notice -// ) -// .toEpoxyCharSequence() -// ) -// } -// -// bottomSheetVerificationBigImageItem { -// id("image") -// roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Trusted) -// } -// -// bottomDone() -// } -// ConclusionState.WARNING -> { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_conclusion_not_secure).toEpoxyCharSequence()) -// } -// -// bottomSheetVerificationBigImageItem { -// id("image") -// roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Warning) -// } -// -// bottomSheetVerificationNoticeItem { -// id("warning_notice") -// notice(host.eventHtmlRenderer.render(host.stringProvider.getString(R.string.verification_conclusion_compromised)).toEpoxyCharSequence()) -// } -// -// bottomGotIt() -// } -// ConclusionState.INVALID_QR_CODE -> { -// bottomSheetVerificationNoticeItem { -// id("invalid_qr") -// notice(host.stringProvider.getString(R.string.verify_invalid_qr_notice).toEpoxyCharSequence()) -// } -// -// bottomGotIt() -// } -// ConclusionState.CANCELLED -> { -// bottomSheetVerificationNoticeItem { -// id("notice_cancelled") -// notice(host.stringProvider.getString(R.string.verify_cancelled_notice).toEpoxyCharSequence()) -// } -// -// bottomGotIt() -// } -// } -// } -// -// private fun bottomDone() { -// val host = this -// bottomSheetDividerItem { -// id("sep0") -// } -// -// bottomSheetVerificationActionItem { -// id("done") -// title(host.stringProvider.getString(R.string.done)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onButtonTapped(true) } -// } -// } -// -// private fun bottomGotIt() { -// val host = this -// bottomSheetDividerItem { -// id("sep0") -// } -// -// bottomSheetVerificationActionItem { -// id("got_it") -// title(host.stringProvider.getString(R.string.sas_got_it)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onButtonTapped(false) } -// } -// } -// -// interface Listener { -// fun onButtonTapped(success: Boolean) -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionFragment.kt deleted file mode 100644 index a373efaa4c..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionFragment.kt +++ /dev/null @@ -1,82 +0,0 @@ -// /* -// * Copyright 2019 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.verification.conclusion -// -// import android.os.Bundle -// import android.os.Parcelable -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.fragmentViewModel -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationAction -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import kotlinx.parcelize.Parcelize -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationConclusionFragment : -// VectorBaseFragment(), -// VerificationConclusionController.Listener { -// -// @Inject lateinit var controller: VerificationConclusionController -// -// @Parcelize -// data class Args( -// val isSuccessFull: Boolean, -// val cancelReason: String?, -// val isMe: Boolean -// ) : Parcelable -// -// private val sharedViewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// private val viewModel by fragmentViewModel(VerificationConclusionViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun onButtonTapped(success: Boolean) { -// sharedViewModel.handle(VerificationAction.GotItConclusion(success)) -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt deleted file mode 100644 index c43655e81d..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt +++ /dev/null @@ -1,68 +0,0 @@ -// /* -// * Copyright 2019 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.verification.conclusion -// -// import com.airbnb.mvrx.MavericksState -// import com.airbnb.mvrx.MavericksViewModelFactory -// import com.airbnb.mvrx.ViewModelContext -// import im.vector.app.core.platform.EmptyAction -// import im.vector.app.core.platform.EmptyViewEvents -// import im.vector.app.core.platform.VectorViewModel -// import org.matrix.android.sdk.api.session.crypto.verification.CancelCode -// import org.matrix.android.sdk.api.session.crypto.verification.safeValueOf -// -// data class VerificationConclusionViewState( -// val conclusionState: ConclusionState = ConclusionState.CANCELLED, -// val isSelfVerification: Boolean = false -// ) : MavericksState -// -// enum class ConclusionState { -// SUCCESS, -// WARNING, -// CANCELLED, -// INVALID_QR_CODE -// } -// -// class VerificationConclusionViewModel(initialState: VerificationConclusionViewState) : -// VectorViewModel(initialState) { -// -// companion object : MavericksViewModelFactory { -// -// override fun initialState(viewModelContext: ViewModelContext): VerificationConclusionViewState? { -// val args = viewModelContext.args() -// -// return when (safeValueOf(args.cancelReason)) { -// CancelCode.QrCodeInvalid -> { -// VerificationConclusionViewState(ConclusionState.INVALID_QR_CODE, args.isMe) -// } -// CancelCode.MismatchedUser, -// CancelCode.MismatchedSas, -// CancelCode.MismatchedCommitment, -// CancelCode.MismatchedKeys -> { -// VerificationConclusionViewState(ConclusionState.WARNING, args.isMe) -// } -// else -> { -// VerificationConclusionViewState( -// if (args.isSuccessFull) ConclusionState.SUCCESS else ConclusionState.CANCELLED, -// args.isMe -// ) -// } -// } -// } -// } -// -// override fun handle(action: EmptyAction) {} -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeController.kt deleted file mode 100644 index aa0d9a71dc..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeController.kt +++ /dev/null @@ -1,168 +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.verification.emoji -// -// import com.airbnb.epoxy.EpoxyController -// import com.airbnb.mvrx.Fail -// import com.airbnb.mvrx.Success -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.epoxy.errorWithRetryItem -// import im.vector.app.core.error.ErrorFormatter -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationDecimalCodeItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationEmojisItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationWaitingItem -// import im.vector.app.features.displayname.getBestName -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import javax.inject.Inject -// -// class VerificationEmojiCodeController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider, -// private val errorFormatter: ErrorFormatter -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationEmojiCodeViewState? = null -// -// fun update(viewState: VerificationEmojiCodeViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// -// if (state.supportsEmoji) { -// buildEmojiItem(state) -// } else { -// buildDecimal(state) -// } -// } -// -// private fun buildEmojiItem(state: VerificationEmojiCodeViewState) { -// val host = this -// when (val emojiDescription = state.emojiDescription) { -// is Success -> { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_emoji_notice).toEpoxyCharSequence()) -// } -// -// bottomSheetVerificationEmojisItem { -// id("emojis") -// emojiRepresentation0(emojiDescription()[0]) -// emojiRepresentation1(emojiDescription()[1]) -// emojiRepresentation2(emojiDescription()[2]) -// emojiRepresentation3(emojiDescription()[3]) -// emojiRepresentation4(emojiDescription()[4]) -// emojiRepresentation5(emojiDescription()[5]) -// emojiRepresentation6(emojiDescription()[6]) -// } -// -// buildActions(state) -// } -// is Fail -> { -// errorWithRetryItem { -// id("error") -// text(host.errorFormatter.toHumanReadable(emojiDescription.error)) -// } -// } -// else -> { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.please_wait)) -// } -// } -// } -// } -// -// private fun buildDecimal(state: VerificationEmojiCodeViewState) { -// val host = this -// when (val decimalDescription = state.decimalDescription) { -// is Success -> { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_code_notice).toEpoxyCharSequence()) -// } -// -// bottomSheetVerificationDecimalCodeItem { -// id("decimal") -// code(state.decimalDescription.invoke() ?: "") -// } -// -// buildActions(state) -// } -// is Fail -> { -// errorWithRetryItem { -// id("error") -// text(host.errorFormatter.toHumanReadable(decimalDescription.error)) -// } -// } -// else -> { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.please_wait)) -// } -// } -// } -// } -// -// private fun buildActions(state: VerificationEmojiCodeViewState) { -// val host = this -// bottomSheetDividerItem { -// id("sep0") -// } -// -// if (state.isWaitingFromOther) { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.verification_request_waiting_for, state.otherUser.getBestName())) -// } -// } else { -// bottomSheetVerificationActionItem { -// id("ko") -// title(host.stringProvider.getString(R.string.verification_sas_do_not_match)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// iconRes(R.drawable.ic_check_off) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// listener { host.listener?.onDoNotMatchButtonTapped() } -// } -// bottomSheetDividerItem { -// id("sep1") -// } -// bottomSheetVerificationActionItem { -// id("ok") -// title(host.stringProvider.getString(R.string.verification_sas_match)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_check_on) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// listener { host.listener?.onMatchButtonTapped() } -// } -// } -// } -// -// interface Listener { -// fun onDoNotMatchButtonTapped() -// fun onMatchButtonTapped() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeFragment.kt deleted file mode 100644 index 2d43dd4e90..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeFragment.kt +++ /dev/null @@ -1,81 +0,0 @@ -// /* -// * Copyright 2019 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.verification.emoji -// -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.fragmentViewModel -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationAction -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationEmojiCodeFragment : -// VectorBaseFragment(), -// VerificationEmojiCodeController.Listener { -// -// @Inject lateinit var controller: VerificationEmojiCodeController -// -// private val viewModel by fragmentViewModel(VerificationEmojiCodeViewModel::class) -// -// private val sharedViewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun onMatchButtonTapped() = withState(viewModel) { state -> -// val otherUserId = state.otherUser.id -// val txId = state.transactionId ?: return@withState -// sharedViewModel.handle(VerificationAction.SASMatchAction) -// } -// -// override fun onDoNotMatchButtonTapped() = withState(viewModel) { state -> -// val otherUserId = state.otherUser.id -// val txId = state.transactionId ?: return@withState -// sharedViewModel.handle(VerificationAction.SASDoNotMatchAction) -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt deleted file mode 100644 index b513bd0773..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt +++ /dev/null @@ -1,209 +0,0 @@ -// /* -// * Copyright 2019 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.verification.emoji -// -// import com.airbnb.mvrx.Async -// import com.airbnb.mvrx.Fail -// import com.airbnb.mvrx.Loading -// import com.airbnb.mvrx.MavericksState -// import com.airbnb.mvrx.MavericksViewModelFactory -// import com.airbnb.mvrx.Success -// import com.airbnb.mvrx.Uninitialized -// import com.airbnb.mvrx.ViewModelContext -// import dagger.assisted.Assisted -// import dagger.assisted.AssistedFactory -// import dagger.assisted.AssistedInject -// import dagger.hilt.EntryPoints -// import im.vector.app.core.di.MavericksAssistedViewModelFactory -// import im.vector.app.core.di.SingletonEntryPoint -// import im.vector.app.core.di.hiltMavericksViewModelFactory -// import im.vector.app.core.platform.EmptyAction -// import im.vector.app.core.platform.EmptyViewEvents -// import im.vector.app.core.platform.VectorViewModel -// import im.vector.app.features.crypto.verification.VerificationBottomSheet -// import kotlinx.coroutines.flow.launchIn -// import kotlinx.coroutines.flow.onEach -// import kotlinx.coroutines.launch -// import org.matrix.android.sdk.api.session.Session -// import org.matrix.android.sdk.api.session.crypto.verification.EmojiRepresentation -// import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationEvent -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationService -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState -// import org.matrix.android.sdk.api.session.getUserOrDefault -// import org.matrix.android.sdk.api.util.MatrixItem -// import org.matrix.android.sdk.api.util.toMatrixItem -// -// data class VerificationEmojiCodeViewState( -// val transactionId: String?, -// val otherUser: MatrixItem, -// val supportsEmoji: Boolean = true, -// val emojiDescription: Async> = Uninitialized, -// val decimalDescription: Async = Uninitialized, -// val isWaitingFromOther: Boolean = false -// ) : MavericksState -// -// class VerificationEmojiCodeViewModel @AssistedInject constructor( -// @Assisted initialState: VerificationEmojiCodeViewState, -// private val session: Session -// ) : VectorViewModel(initialState), VerificationService.Listener { -// -// init { -// -// session.cryptoService().verificationService() -// .requestEventFlow() -// .onEach { -// when (it) { -// is VerificationEvent.RequestAdded -> verificationRequestCreated(it.request) -// is VerificationEvent.RequestUpdated -> verificationRequestUpdated(it.request) -// is VerificationEvent.TransactionAdded -> transactionCreated(it.transaction) -// is VerificationEvent.TransactionUpdated -> transactionUpdated(it.transaction) -// } -// } -// .launchIn(viewModelScope) -// -// viewModelScope.launch { -// refreshStateFromTx( -// session.cryptoService().verificationService() -// .getExistingTransaction( -// otherUserId = initialState.otherUser.id, -// tid = initialState.transactionId ?: "" -// ) as? SasVerificationTransaction -// ) -// -// } -// -// // session.cryptoService().verificationService().addListener(this) -// } -// -// // override fun onCleared() { -// // session.cryptoService().verificationService().removeListener(this) -// // super.onCleared() -// // } -// -// private fun refreshStateFromTx(sasTx: SasVerificationTransaction?) { -// when (val state = sasTx?.state) { -// is VerificationTxState.None, -// is VerificationTxState.SasStarted, -// is VerificationTxState.SasAccepted, -// is VerificationTxState.SasKeySent -> { -// setState { -// copy( -// isWaitingFromOther = false, -// supportsEmoji = sasTx.supportsEmoji(), -// emojiDescription = Loading>() -// .takeIf { sasTx.supportsEmoji() } -// ?: Uninitialized, -// decimalDescription = Loading() -// .takeIf { sasTx.supportsEmoji().not() } -// ?: Uninitialized -// ) -// } -// } -// is VerificationTxState.SasShortCodeReady -> { -// setState { -// copy( -// isWaitingFromOther = false, -// supportsEmoji = sasTx.supportsEmoji(), -// emojiDescription = if (sasTx.supportsEmoji()) Success(sasTx.getEmojiCodeRepresentation()) -// else Uninitialized, -// decimalDescription = if (!sasTx.supportsEmoji()) Success(sasTx.getDecimalCodeRepresentation().orEmpty()) -// else Uninitialized -// ) -// } -// } -// is VerificationTxState.SasMacReceived -> { -// if (state.codeConfirmed) { -// setState { -// copy(isWaitingFromOther = true) -// } -// } else { -// setState { -// copy( -// isWaitingFromOther = false, -// supportsEmoji = sasTx.supportsEmoji(), -// emojiDescription = if (sasTx.supportsEmoji()) Success(sasTx.getEmojiCodeRepresentation()) -// else Uninitialized, -// decimalDescription = if (!sasTx.supportsEmoji()) Success(sasTx.getDecimalCodeRepresentation().orEmpty()) -// else Uninitialized -// ) -// } -// } -// } -// is VerificationTxState.SasMacSent, -// is VerificationTxState.Verified -> { -// setState { -// copy(isWaitingFromOther = true) -// } -// } -// is VerificationTxState.Cancelled -> { -// // The fragment should not be rendered in this state, -// // it should have been replaced by a conclusion fragment -// setState { -// copy( -// isWaitingFromOther = false, -// supportsEmoji = sasTx.supportsEmoji(), -// emojiDescription = Fail(Throwable("Transaction Cancelled")), -// decimalDescription = Fail(Throwable("Transaction Cancelled")) -// ) -// } -// } -// null -> { -// setState { -// copy( -// isWaitingFromOther = false, -// emojiDescription = Fail(Throwable("Unknown Transaction")), -// decimalDescription = Fail(Throwable("Unknown Transaction")) -// ) -// } -// } -// else -> Unit -// } -// } -// -// override fun transactionCreated(tx: VerificationTransaction) { -// transactionUpdated(tx) -// } -// -// override fun transactionUpdated(tx: VerificationTransaction) = withState { state -> -// if (tx.transactionId == state.transactionId && tx is SasVerificationTransaction) { -// refreshStateFromTx(tx) -// } -// } -// -// @AssistedFactory -// interface Factory : MavericksAssistedViewModelFactory { -// override fun create(initialState: VerificationEmojiCodeViewState): VerificationEmojiCodeViewModel -// } -// -// companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { -// -// override fun initialState(viewModelContext: ViewModelContext): VerificationEmojiCodeViewState { -// val args = viewModelContext.args() -// val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession() -// val matrixItem = session.getUserOrDefault(args.otherUserId).toMatrixItem() -// -// return VerificationEmojiCodeViewState( -// transactionId = args.verificationId, -// otherUser = matrixItem -// ) -// } -// } -// -// override fun handle(action: EmptyAction) { -// } -// } 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 deleted file mode 100644 index 1ae0da603a..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingController.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 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.verification.qrconfirmation - -import com.airbnb.epoxy.EpoxyController -import im.vector.app.R -import im.vector.app.core.resources.ColorProvider -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 im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -import javax.inject.Inject - -class VerificationQRWaitingController @Inject constructor( - private val stringProvider: StringProvider, - private val colorProvider: ColorProvider -) : EpoxyController() { - - private var args: VerificationQRWaitingFragment.Args? = null - - fun update(args: VerificationQRWaitingFragment.Args) { - this.args = args - requestModelBuild() - } - - override fun buildModels() { - val params = args ?: return - val host = this - - bottomSheetVerificationNoticeItem { - id("notice") - apply { - notice(host.stringProvider.getString(R.string.qr_code_scanned_verif_waiting_notice).toEpoxyCharSequence()) - } - } - - bottomSheetVerificationBigImageItem { - id("image") - roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Trusted) - } - - bottomSheetVerificationWaitingItem { - id("waiting") - title(host.stringProvider.getString(R.string.qr_code_scanned_verif_waiting, params.otherUserName)) - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingFragment.kt deleted file mode 100644 index dc538597db..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQRWaitingFragment.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 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.verification.qrconfirmation - -import android.os.Bundle -import android.os.Parcelable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.airbnb.mvrx.Mavericks -import dagger.hilt.android.AndroidEntryPoint -import im.vector.app.core.extensions.cleanup -import im.vector.app.core.extensions.configureWith -import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -import im.vector.lib.core.utils.compat.getParcelableCompat -import kotlinx.parcelize.Parcelize -import javax.inject.Inject - -@AndroidEntryPoint -class VerificationQRWaitingFragment : - VectorBaseFragment() { - - @Inject lateinit var controller: VerificationQRWaitingController - - @Parcelize - data class Args( - val isMe: Boolean, - val otherUserName: String - ) : Parcelable - - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { - return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - setupRecyclerView() - (arguments?.getParcelableCompat(Mavericks.KEY_ARG))?.let { - controller.update(it) - } - } - - override fun onDestroyView() { - views.bottomSheetVerificationRecyclerView.cleanup() - super.onDestroyView() - } - - private fun setupRecyclerView() { - views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) - } -} 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 deleted file mode 100644 index 0390e0bc2f..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherController.kt +++ /dev/null @@ -1,99 +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.verification.qrconfirmation -// -// import com.airbnb.epoxy.EpoxyController -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewState -// 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 im.vector.app.features.displayname.getBestName -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -// import javax.inject.Inject -// -// class VerificationQrScannedByOtherController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationBottomSheetViewState? = null -// -// fun update(viewState: VerificationBottomSheetViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// val host = this -// -// bottomSheetVerificationNoticeItem { -// id("notice") -// apply { -// if (state.isMe) { -// notice(host.stringProvider.getString(R.string.qr_code_scanned_self_verif_notice).toEpoxyCharSequence()) -// } else { -// val name = state.otherUserMxItem.getBestName() -// notice(host.stringProvider.getString(R.string.qr_code_scanned_by_other_notice, name).toEpoxyCharSequence()) -// } -// } -// } -// -// bottomSheetVerificationBigImageItem { -// id("image") -// roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Trusted) -// } -// -// bottomSheetDividerItem { -// id("sep0") -// } -// -// bottomSheetVerificationActionItem { -// id("deny") -// title(host.stringProvider.getString(R.string.qr_code_scanned_by_other_no)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// iconRes(R.drawable.ic_check_off) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// listener { host.listener?.onUserDeniesQrCodeScanned() } -// } -// -// bottomSheetDividerItem { -// id("sep1") -// } -// -// bottomSheetVerificationActionItem { -// id("confirm") -// title(host.stringProvider.getString(R.string.qr_code_scanned_by_other_yes)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_check_on) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// listener { host.listener?.onUserConfirmsQrCodeScanned() } -// } -// } -// -// interface Listener { -// fun onUserConfirmsQrCodeScanned() -// fun onUserDeniesQrCodeScanned() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherFragment.kt deleted file mode 100644 index 5d373afd22..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/qrconfirmation/VerificationQrScannedByOtherFragment.kt +++ /dev/null @@ -1,73 +0,0 @@ -// /* -// * Copyright 2019 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.verification.qrconfirmation -// -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationAction -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationQrScannedByOtherFragment : -// VectorBaseFragment(), -// VerificationQrScannedByOtherController.Listener { -// -// @Inject lateinit var controller: VerificationQrScannedByOtherController -// -// private val sharedViewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// setupRecyclerView() -// } -// -// override fun invalidate() = withState(sharedViewModel) { state -> -// controller.update(state) -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun onUserConfirmsQrCodeScanned() { -// sharedViewModel.handle(VerificationAction.OtherUserScannedSuccessfully) -// } -// -// override fun onUserDeniesQrCodeScanned() { -// sharedViewModel.handle(VerificationAction.OtherUserDidNotScanned) -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt deleted file mode 100644 index 31b5fe6755..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt +++ /dev/null @@ -1,185 +0,0 @@ -// /* -// * Copyright 2019 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.verification.request -// -// import androidx.core.text.toSpannable -// import com.airbnb.epoxy.EpoxyController -// import com.airbnb.mvrx.Fail -// import com.airbnb.mvrx.Loading -// import com.airbnb.mvrx.Success -// import com.airbnb.mvrx.Uninitialized -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// import im.vector.app.core.utils.colorizeMatchingText -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewState -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetSelfWaitItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationWaitingItem -// import im.vector.app.features.displayname.getBestName -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState -// import javax.inject.Inject -// -// class VerificationRequestController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider -// ) : EpoxyController() { -// -// var listener: Listener? = null -// -// private var viewState: VerificationBottomSheetViewState? = null -// -// fun update(viewState: VerificationBottomSheetViewState) { -// this.viewState = viewState -// requestModelBuild() -// } -// -// override fun buildModels() { -// val state = viewState ?: return -// val host = this -// -// if (state.selfVerificationMode) { -// if (state.hasAnyOtherSession) { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_open_other_to_verify).toEpoxyCharSequence()) -// } -// -// bottomSheetSelfWaitItem { -// id("waiting") -// } -// -// bottomSheetDividerItem { -// id("sep") -// } -// } -// -// if (state.quadSContainsSecrets) { -// val subtitle = if (state.hasAnyOtherSession) { -// stringProvider.getString(R.string.verification_use_passphrase) -// } else { -// null -// } -// bottomSheetVerificationActionItem { -// id("passphrase") -// title(host.stringProvider.getString(R.string.verification_cannot_access_other_session)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// subTitle(subtitle) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onClickRecoverFromPassphrase() } -// } -// } -// -// if (!state.isVerificationRequired) { -// bottomSheetDividerItem { -// id("sep1") -// } -// -// bottomSheetVerificationActionItem { -// id("skip") -// title(host.stringProvider.getString(R.string.action_skip)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// listener { host.listener?.onClickSkip() } -// } -// } -// } else { -// val styledText = -// if (state.isMe) { -// stringProvider.getString(R.string.verify_new_session_notice) -// } else { -// stringProvider.getString(R.string.verification_request_notice, state.otherUserId) -// .toSpannable() -// .colorizeMatchingText(state.otherUserId, colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color)) -// } -// -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(styledText.toEpoxyCharSequence()) -// } -// -// bottomSheetDividerItem { -// id("sep") -// } -// -// when (val pr = state.pendingRequest) { -// is Uninitialized -> { -// bottomSheetVerificationActionItem { -// id("start") -// title(host.stringProvider.getString(R.string.start_verification)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// subTitle(host.stringProvider.getString(R.string.verification_request_start_notice)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onClickOnVerificationStart() } -// } -// } -// is Loading -> { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.verification_request_waiting_for, state.otherUserMxItem.getBestName())) -// } -// } -// is Success -> { -// if (pr.invoke().state != EVerificationState.Ready) { -// if (state.isMe) { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.verification_request_waiting)) -// } -// } else { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.verification_request_waiting_for, state.otherUserMxItem.getBestName())) -// } -// } -// } -// } -// is Fail -> Unit -// } -// } -// -// if (state.isMe && state.currentDeviceCanCrossSign && !state.selfVerificationMode) { -// bottomSheetDividerItem { -// id("sep_notMe") -// } -// -// bottomSheetVerificationActionItem { -// id("wasnote") -// title(host.stringProvider.getString(R.string.verify_new_session_was_not_me)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// subTitle(host.stringProvider.getString(R.string.verify_new_session_compromized)) -// iconRes(R.drawable.ic_arrow_right) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) -// listener { host.listener?.onClickOnWasNotMe() } -// } -// } -// } -// -// interface Listener { -// fun onClickOnVerificationStart() -// fun onClickOnWasNotMe() -// fun onClickRecoverFromPassphrase() -// fun onClickDismiss() -// fun onClickSkip() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestFragment.kt deleted file mode 100644 index 2cd60a5f60..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestFragment.kt +++ /dev/null @@ -1,85 +0,0 @@ -// /* -// * Copyright 2019 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.verification.request -// -// import android.os.Bundle -// import android.view.LayoutInflater -// import android.view.View -// import android.view.ViewGroup -// import com.airbnb.mvrx.parentFragmentViewModel -// import com.airbnb.mvrx.withState -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.extensions.cleanup -// import im.vector.app.core.extensions.configureWith -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.VerificationAction -// import im.vector.app.features.crypto.verification.VerificationBottomSheetViewModel -// import javax.inject.Inject -// -// @AndroidEntryPoint -// class VerificationRequestFragment : -// VectorBaseFragment(), -// VerificationRequestController.Listener { -// -// @Inject lateinit var controller: VerificationRequestController -// -// private val viewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// setupRecyclerView() -// } -// -// override fun onDestroyView() { -// views.bottomSheetVerificationRecyclerView.cleanup() -// controller.listener = null -// super.onDestroyView() -// } -// -// private fun setupRecyclerView() { -// views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true) -// controller.listener = this -// } -// -// override fun invalidate() = withState(viewModel) { state -> -// controller.update(state) -// } -// -// override fun onClickOnVerificationStart(): Unit = withState(viewModel) { state -> -// viewModel.handle(VerificationAction.RequestVerificationByDM) -// } -// -// override fun onClickRecoverFromPassphrase() { -// viewModel.handle(VerificationAction.VerifyFromPassphrase) -// } -// -// override fun onClickDismiss() { -// viewModel.handle(VerificationAction.SkipVerification) -// } -// -// override fun onClickSkip() { -// viewModel.queryCancel() -// } -// -// override fun onClickOnWasNotMe() { -// viewModel.itWasNotMe() -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationBottomSheet.kt index 67dc115827..5005ccd12b 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationBottomSheet.kt @@ -158,6 +158,9 @@ class SelfVerificationBottomSheet : VectorBaseBottomSheetDialogFragment { dismiss() } + is VerificationBottomSheetViewEvents.ConfirmCancel -> { + // TODO? applies to self? + } } } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionController.kt deleted file mode 100644 index 9120388ad3..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionController.kt +++ /dev/null @@ -1,178 +0,0 @@ -// /* -// * Copyright (c) 2022 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.verification.transaction -// -// import com.airbnb.epoxy.EpoxyController -// import com.airbnb.mvrx.Async -// import com.airbnb.mvrx.Fail -// import com.airbnb.mvrx.Loading -// import com.airbnb.mvrx.Success -// import com.airbnb.mvrx.Uninitialized -// import im.vector.app.R -// import im.vector.app.core.epoxy.bottomSheetDividerItem -// import im.vector.app.core.resources.ColorProvider -// import im.vector.app.core.resources.StringProvider -// 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.bottomSheetVerificationEmojisItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem -// import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationWaitingItem -// import im.vector.app.features.html.EventHtmlRenderer -// import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence -// import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -// import org.matrix.android.sdk.api.session.crypto.verification.CancelCode -// import org.matrix.android.sdk.api.session.crypto.verification.EmojiRepresentation -// import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction -// import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState -// import javax.inject.Inject -// -// class VerificationTransactionController @Inject constructor( -// private val stringProvider: StringProvider, -// private val colorProvider: ColorProvider, -// private val eventHtmlRenderer: EventHtmlRenderer, -// ) : EpoxyController() { -// -// var aTransaction: Async? = null -// -// fun update(asyncTransaction: Async) { -// this.aTransaction = asyncTransaction -// requestModelBuild() -// } -// -// override fun buildModels() { -// val host = this -// when (aTransaction) { -// null, -// Uninitialized -> { -// // empty -// } -// is Fail -> { -// } -// is Loading -> { -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.please_wait)) -// } -// } -// is Success -> { -// val tx = aTransaction?.invoke() ?: return -// if (tx is SasVerificationTransaction) { -// when (val txState = tx.state) { -// VerificationTxState.SasShortCodeReady -> { -// buildEmojiItem(tx.getEmojiCodeRepresentation()) -// } -// is VerificationTxState.Cancelled -> { -// renderCancel(txState.cancelCode) -// } -// is VerificationTxState.Done -> { -// -// } -// else -> { -// // waiting -// bottomSheetVerificationWaitingItem { -// id("waiting") -// title(host.stringProvider.getString(R.string.please_wait)) -// } -// } -// } -// } -// } -// } -// } -// -// private fun renderCancel(cancelCode: CancelCode) { -// val host = this -// when (cancelCode) { -// CancelCode.QrCodeInvalid -> { -// // TODO -// } -// CancelCode.MismatchedUser, -// CancelCode.MismatchedSas, -// CancelCode.MismatchedCommitment, -// CancelCode.MismatchedKeys -> { -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_conclusion_not_secure).toEpoxyCharSequence()) -// } -// -// bottomSheetVerificationBigImageItem { -// id("image") -// roomEncryptionTrustLevel(RoomEncryptionTrustLevel.Warning) -// } -// -// bottomSheetVerificationNoticeItem { -// id("warning_notice") -// notice(host.eventHtmlRenderer.render(host.stringProvider.getString(R.string.verification_conclusion_compromised)).toEpoxyCharSequence()) -// } -// } -// else -> { -// bottomSheetVerificationNoticeItem { -// id("notice_cancelled") -// notice(host.stringProvider.getString(R.string.verify_cancelled_notice).toEpoxyCharSequence()) -// } -// } -// } -// } -// -// private fun buildEmojiItem(emoji: List) { -// val host = this -// bottomSheetVerificationNoticeItem { -// id("notice") -// notice(host.stringProvider.getString(R.string.verification_emoji_notice).toEpoxyCharSequence()) -// } -// -// bottomSheetVerificationEmojisItem { -// id("emojis") -// emojiRepresentation0(emoji[0]) -// emojiRepresentation1(emoji[1]) -// emojiRepresentation2(emoji[2]) -// emojiRepresentation3(emoji[3]) -// emojiRepresentation4(emoji[4]) -// emojiRepresentation5(emoji[5]) -// emojiRepresentation6(emoji[6]) -// } -// -// buildSasCodeActions() -// } -// -// private fun buildSasCodeActions() { -// val host = this -// bottomSheetDividerItem { -// id("sep0") -// } -// bottomSheetVerificationActionItem { -// id("ko") -// title(host.stringProvider.getString(R.string.verification_sas_do_not_match)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// iconRes(R.drawable.ic_check_off) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError)) -// // listener { host.listener?.onDoNotMatchButtonTapped() } -// } -// bottomSheetDividerItem { -// id("sep1") -// } -// bottomSheetVerificationActionItem { -// id("ok") -// title(host.stringProvider.getString(R.string.verification_sas_match)) -// titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// iconRes(R.drawable.ic_check_on) -// iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) -// // listener { host.listener?.onMatchButtonTapped() } -// } -// } -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionFragment.kt deleted file mode 100644 index abb752373f..0000000000 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/transaction/VerificationTransactionFragment.kt +++ /dev/null @@ -1,36 +0,0 @@ -// /* -// * Copyright (c) 2022 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.verification.transaction -// -// import android.view.LayoutInflater -// import android.view.ViewGroup -// import com.airbnb.mvrx.parentFragmentViewModel -// import dagger.hilt.android.AndroidEntryPoint -// import im.vector.app.core.platform.VectorBaseFragment -// import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding -// import im.vector.app.features.crypto.verification.user.UserVerificationViewModel -// -// @AndroidEntryPoint -// class VerificationTransactionFragment : VectorBaseFragment() { -// -// private val viewModel by parentFragmentViewModel(UserVerificationViewModel::class) -// -// override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetVerificationChildFragmentBinding { -// return BottomSheetVerificationChildFragmentBinding.inflate(inflater, container, false) -// } -// -// } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationBottomSheet.kt index 8efda06991..50dc5749ab 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationBottomSheet.kt @@ -16,11 +16,14 @@ package im.vector.app.features.crypto.verification.user +import android.app.Dialog import android.os.Bundle import android.os.Parcelable +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.text.toSpannable import androidx.fragment.app.Fragment import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState @@ -30,10 +33,13 @@ import im.vector.app.R import im.vector.app.core.extensions.commitTransaction import im.vector.app.core.extensions.toMvRxBundle import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment +import im.vector.app.core.utils.colorizeMatchingText import im.vector.app.databinding.BottomSheetVerificationBinding +import im.vector.app.features.crypto.verification.VerificationAction import im.vector.app.features.crypto.verification.VerificationBottomSheetViewEvents import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.AvatarRenderer +import im.vector.app.features.themes.ThemeUtils import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel import javax.inject.Inject @@ -59,6 +65,11 @@ class UserVerificationBottomSheet : VectorBaseBottomSheetDialogFragment { // no-op for user verification } + is VerificationBottomSheetViewEvents.ConfirmCancel -> { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(getString(R.string.dialog_title_confirmation)) + .setMessage( + getString(R.string.verify_cancel_other, event.otherUserId, event.deviceId ?: "*") + .toSpannable() + .colorizeMatchingText(event.otherUserId, ThemeUtils.getColor(requireContext(), R.attr.vctr_notice_text_color)) + ) + .setCancelable(false) + .setPositiveButton(R.string._resume, null) + .setNegativeButton(R.string.action_cancel) { _, _ -> + viewModel.handle(VerificationAction.CancelPendingVerification) + } + .show() + } + } + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return super.onCreateDialog(savedInstanceState).apply { + setOnKeyListener { _, keyCode, keyEvent -> + if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == KeyEvent.ACTION_UP) { + viewModel.queryCancel() + true + } else { + false + } } } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationController.kt index 75440d1593..16af43713e 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationController.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationController.kt @@ -73,7 +73,6 @@ class UserVerificationController @Inject constructor( var state: UserVerificationViewState? = null fun update(state: UserVerificationViewState) { -// Timber.w("VALR controller updated $state") this.state = state requestModelBuild() } @@ -145,6 +144,9 @@ class UserVerificationController @Inject constructor( } EVerificationState.Cancelled -> { renderCancel(pendingRequest.cancelConclusion ?: CancelCode.User) + gotIt { + listener?.onDone(false) + } } EVerificationState.HandledByOtherSession -> { // we should dismiss diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationViewModel.kt index da97251b0c..e73f25f7dd 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/user/UserVerificationViewModel.kt @@ -42,6 +42,7 @@ import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState import org.matrix.android.sdk.api.session.crypto.verification.EmojiRepresentation import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest import org.matrix.android.sdk.api.session.crypto.verification.QRCodeVerificationState @@ -243,6 +244,29 @@ class UserVerificationViewModel @AssistedInject constructor( } } + fun queryCancel() = withState { state -> + // check if there is an existing request + val request = state.pendingRequest.invoke() + when (request?.state) { + EVerificationState.WaitingForReady, + EVerificationState.Requested, + EVerificationState.Ready, + EVerificationState.Started, + EVerificationState.WeStarted, + EVerificationState.WaitingForDone -> { + // query confirmation + _viewEvents.post(VerificationBottomSheetViewEvents.ConfirmCancel(request.otherUserId, request.otherDeviceId)) + } +// EVerificationState.Done, +// EVerificationState.Cancelled, +// EVerificationState.HandledByOtherSession, + else -> { + // we can just dismiss? + _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) + } + } + } + override fun handle(action: VerificationAction) { when (action) { VerificationAction.CancelPendingVerification -> {