diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationCodeFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationCodeFragment.kt index 6cdb7b8327..7823221e11 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationCodeFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationCodeFragment.kt @@ -36,7 +36,7 @@ class SASVerificationCodeFragment @Inject constructor( @BindView(R.id.sas_emoji_grid) lateinit var emojiGrid: ViewGroup - @BindView(R.id.sas_decimal_code) + @BindView(R.id.itemVerificationDecimalCode) lateinit var decimalTextView: TextView @BindView(R.id.emoji0) diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt index 291527a4b3..dbb9d17a7b 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt @@ -17,20 +17,15 @@ package im.vector.riotx.features.crypto.verification import android.os.Bundle import android.os.Parcelable -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.text.toSpannable import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.transition.AutoTransition import androidx.transition.TransitionManager import butterknife.BindView -import butterknife.ButterKnife -import butterknife.Unbinder import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel @@ -40,9 +35,7 @@ import im.vector.riotx.R import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.extensions.commitTransactionNow import im.vector.riotx.core.platform.VectorBaseBottomSheetDialogFragment -import im.vector.riotx.core.utils.colorizeMatchingText import im.vector.riotx.features.home.AvatarRenderer -import im.vector.riotx.features.themes.ThemeUtils import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.bottom_sheet_verification.* import timber.log.Timber @@ -97,11 +90,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { override fun invalidate() = withState(viewModel) { it.otherUserMxItem?.let { matrixItem -> - val displayName = matrixItem.displayName ?: "" - otherUserNameText.text = getString(R.string.verification_request_alert_title, displayName) - .toSpannable() - .colorizeMatchingText(displayName, ThemeUtils.getColor(requireContext(), R.attr.vctr_notice_text_color)) - + otherUserNameText.text = getString(R.string.verification_request_alert_title, matrixItem.getBestName()) avatarRenderer.render(matrixItem, otherUserAvatarImageView) } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestController.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestController.kt new file mode 100644 index 0000000000..5268cfd3cb --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestController.kt @@ -0,0 +1,93 @@ +/* + * 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.riotx.features.crypto.verification + +import androidx.core.text.toSpannable +import com.airbnb.epoxy.EpoxyController +import com.airbnb.mvrx.Loading +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetSeparatorItem +import im.vector.riotx.core.resources.ColorProvider +import im.vector.riotx.core.resources.StringProvider +import im.vector.riotx.core.utils.colorizeMatchingText +import im.vector.riotx.features.crypto.verification.bottomsheet.bottomSheetVerificationActionItem +import im.vector.riotx.features.crypto.verification.bottomsheet.bottomSheetVerificationNoticeItem +import im.vector.riotx.features.crypto.verification.bottomsheet.bottomSheetVerificationWaitingItem +import javax.inject.Inject + +class VerificationRequestController @Inject constructor( + private val stringProvider: StringProvider, + private val colorProvider: ColorProvider +) : EpoxyController() { + + var listener: Listener? = null + + private var viewState: VerificationRequestViewState? = null + + init { + // We are requesting a model build directly as the first build of epoxy is on the main thread. + // It avoids to build the whole list on the main thread. + requestModelBuild() + } + + fun update(viewState: VerificationRequestViewState) { + this.viewState = viewState + requestModelBuild() + } + + override fun buildModels() { + val state = viewState ?: return + + val styledText = state.matrixItem.let { + stringProvider.getString(R.string.verification_request_notice, it.id) + .toSpannable() + .colorizeMatchingText(it.id, colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color)) + } + + bottomSheetVerificationNoticeItem { + id("notice") + notice(styledText) + } + + bottomSheetSeparatorItem { + id("sep") + } + + when (state.started) { + is Loading -> { + bottomSheetVerificationWaitingItem { + id("waiting") + title(stringProvider.getString(R.string.verification_request_waiting_for, state.matrixItem.getBestName())) + } + } + else -> { + bottomSheetVerificationActionItem { + id("start") + title(stringProvider.getString(R.string.start_verification)) + subTitle(stringProvider.getString(R.string.verification_request_start_notice)) + iconRes(R.drawable.ic_arrow_right) + iconColor(colorProvider.getColorFromAttribute(R.attr.riotx_text_primary)) + listener { listener?.onClickOnVerificationStart() } + } + } + } + } + + interface Listener { + fun onClickOnVerificationStart() + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestFragment.kt index d6e4105fdd..ba4ac88081 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationRequestFragment.kt @@ -15,68 +15,51 @@ */ package im.vector.riotx.features.crypto.verification -import android.graphics.Typeface -import androidx.core.text.toSpannable -import androidx.core.view.isInvisible -import androidx.core.view.isVisible -import butterknife.OnClick -import com.airbnb.mvrx.Loading +import android.os.Bundle +import android.view.View import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.withState import im.vector.riotx.R +import im.vector.riotx.core.extensions.cleanup +import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.platform.VectorBaseFragment -import im.vector.riotx.core.utils.colorizeMatchingText -import im.vector.riotx.core.utils.styleMatchingText -import im.vector.riotx.features.home.AvatarRenderer -import im.vector.riotx.features.themes.ThemeUtils -import kotlinx.android.synthetic.main.fragment_verification_request.* +import kotlinx.android.synthetic.main.bottom_sheet_verification_child_fragment.* import javax.inject.Inject class VerificationRequestFragment @Inject constructor( val verificationRequestViewModelFactory: VerificationRequestViewModel.Factory, - val avatarRenderer: AvatarRenderer -) : VectorBaseFragment() { + val controller: VerificationRequestController +) : VectorBaseFragment(), VerificationRequestController.Listener { private val viewModel by fragmentViewModel(VerificationRequestViewModel::class) private val sharedViewModel by parentFragmentViewModel(VerificationBottomSheetViewModel::class) - override fun getLayoutResId() = R.layout.fragment_verification_request + override fun getLayoutResId() = R.layout.bottom_sheet_verification_child_fragment - override fun invalidate() = withState(viewModel) { state -> - state.matrixItem.let { - val styledText = getString(R.string.verification_request_alert_description, it.id) - .toSpannable() - .styleMatchingText(it.id, Typeface.BOLD) - .colorizeMatchingText(it.id, ThemeUtils.getColor(requireContext(), R.attr.vctr_notice_text_color)) - verificationRequestText.text = styledText - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - when (state.started) { - is Loading -> { - // Hide the start button, show waiting - verificationStartButton.isInvisible = true - verificationWaitingText.isVisible = true - val otherUser = state.matrixItem.displayName ?: state.matrixItem.id - verificationWaitingText.text = getString(R.string.verification_request_waiting_for, otherUser) - .toSpannable() - .styleMatchingText(otherUser, Typeface.BOLD) - .colorizeMatchingText(otherUser, ThemeUtils.getColor(requireContext(), R.attr.vctr_notice_text_color)) - } - else -> { - verificationStartButton.isEnabled = true - verificationStartButton.isVisible = true - verificationWaitingText.isInvisible = true - } - } - - Unit + setupRecyclerView() } - @OnClick(R.id.verificationStartButton) - fun onClickOnVerificationStart() = withState(viewModel) { state -> - verificationStartButton.isEnabled = false + override fun onDestroyView() { + bottomSheetVerificationRecyclerView.cleanup() + controller.listener = null + super.onDestroyView() + } + + private fun setupRecyclerView() { + bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false) + controller.listener = this + } + + override fun invalidate() = withState(viewModel) { state -> + controller.update(state) + } + + override fun onClickOnVerificationStart() = withState(viewModel) { state -> sharedViewModel.handle(VerificationAction.RequestVerificationByDM(state.matrixItem.id, state.roomId)) } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationActionItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationActionItem.kt new file mode 100644 index 0000000000..48ff7135f4 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationActionItem.kt @@ -0,0 +1,77 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.content.res.ColorStateList +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.DrawableRes +import androidx.core.view.isVisible +import androidx.core.widget.ImageViewCompat +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel +import im.vector.riotx.core.extensions.setTextOrHide + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_action) +abstract class BottomSheetVerificationActionItem : VectorEpoxyModel() { + + @EpoxyAttribute + @DrawableRes + var iconRes: Int = -1 + @EpoxyAttribute + var title: CharSequence = "" + @EpoxyAttribute + var subTitle: CharSequence = "" + @EpoxyAttribute + var titleColor: Int = 0 + @EpoxyAttribute + var iconColor: Int = 0 + + @EpoxyAttribute + lateinit var listener: () -> Unit + + override fun bind(holder: Holder) { + holder.view.setOnClickListener { + listener.invoke() + } + + holder.title.text = title + holder.title.setTextColor(titleColor) + + holder.subTitle.setTextOrHide(subTitle) + + if (iconRes != -1) { + holder.icon.isVisible = true + holder.icon.setImageResource(iconRes) + ImageViewCompat.setImageTintList(holder.icon, ColorStateList.valueOf(iconColor)) + } else { + holder.icon.isVisible = false + } + } + + class Holder : VectorEpoxyHolder() { + val title by bind(R.id.itemVerificationActionTitle) + val subTitle by bind(R.id.itemVerificationActionSubTitle) + val icon by bind(R.id.itemVerificationActionIcon) + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationBigImageItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationBigImageItem.kt new file mode 100644 index 0000000000..8c6fc77277 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationBigImageItem.kt @@ -0,0 +1,42 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.widget.ImageView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_big_image) +abstract class BottomSheetVerificationBigImageItem : VectorEpoxyModel() { + + @EpoxyAttribute + var imageRes: Int = 0 + + override fun bind(holder: Holder) { + holder.image.setImageResource(imageRes) + } + + class Holder : VectorEpoxyHolder() { + val image by bind(R.id.itemVerificationBigImage) + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationDecimalCodeItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationDecimalCodeItem.kt new file mode 100644 index 0000000000..83c0543097 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationDecimalCodeItem.kt @@ -0,0 +1,42 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_decimal_code) +abstract class BottomSheetVerificationDecimalCodeItem : VectorEpoxyModel() { + + @EpoxyAttribute + var code: CharSequence = "" + + override fun bind(holder: Holder) { + holder.code.text = code + } + + class Holder : VectorEpoxyHolder() { + val code by bind(R.id.itemVerificationDecimalCode) + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationEmojisItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationEmojisItem.kt new file mode 100644 index 0000000000..a99404dc42 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationEmojisItem.kt @@ -0,0 +1,42 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_emojis) +abstract class BottomSheetVerificationEmojisItem : VectorEpoxyModel() { + + @EpoxyAttribute + var notice: CharSequence = "" + + override fun bind(holder: Holder) { + holder.notice.text = notice + } + + class Holder : VectorEpoxyHolder() { + val notice by bind(R.id.itemVerificationNoticeText) + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationNoticeItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationNoticeItem.kt new file mode 100644 index 0000000000..16fd1a1705 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationNoticeItem.kt @@ -0,0 +1,42 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_notice) +abstract class BottomSheetVerificationNoticeItem : VectorEpoxyModel() { + + @EpoxyAttribute + var notice: CharSequence = "" + + override fun bind(holder: Holder) { + holder.notice.text = notice + } + + class Holder : VectorEpoxyHolder() { + val notice by bind(R.id.itemVerificationNoticeText) + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationWaitingItem.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationWaitingItem.kt new file mode 100644 index 0000000000..20a0932f48 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/bottomsheet/BottomSheetVerificationWaitingItem.kt @@ -0,0 +1,42 @@ +/* + * 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.riotx.features.crypto.verification.bottomsheet + +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.riotx.R +import im.vector.riotx.core.epoxy.VectorEpoxyHolder +import im.vector.riotx.core.epoxy.VectorEpoxyModel + +/** + * A action for bottom sheet. + */ +@EpoxyModelClass(layout = R.layout.item_verification_waiting) +abstract class BottomSheetVerificationWaitingItem : VectorEpoxyModel() { + + @EpoxyAttribute + var title: CharSequence = "" + + override fun bind(holder: Holder) { + holder.title.text = title + } + + class Holder : VectorEpoxyHolder() { + val title by bind(R.id.itemVerificationWaitingTitle) + } +} diff --git a/vector/src/main/res/layout/bottom_sheet_verification_child_fragment.xml b/vector/src/main/res/layout/bottom_sheet_verification_child_fragment.xml new file mode 100644 index 0000000000..7375e505c7 --- /dev/null +++ b/vector/src/main/res/layout/bottom_sheet_verification_child_fragment.xml @@ -0,0 +1,10 @@ + + diff --git a/vector/src/main/res/layout/fragment_verification_request.xml b/vector/src/main/res/layout/fragment_verification_request.xml deleted file mode 100644 index 79c81eb399..0000000000 --- a/vector/src/main/res/layout/fragment_verification_request.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - diff --git a/vector/src/main/res/layout/item_verification_action.xml b/vector/src/main/res/layout/item_verification_action.xml new file mode 100644 index 0000000000..a92379a2a6 --- /dev/null +++ b/vector/src/main/res/layout/item_verification_action.xml @@ -0,0 +1,57 @@ + + + + + + + + + + diff --git a/vector/src/main/res/layout/item_verification_big_image.xml b/vector/src/main/res/layout/item_verification_big_image.xml new file mode 100644 index 0000000000..9f33b6c03c --- /dev/null +++ b/vector/src/main/res/layout/item_verification_big_image.xml @@ -0,0 +1,7 @@ + + diff --git a/vector/src/main/res/layout/item_verification_decimal_code.xml b/vector/src/main/res/layout/item_verification_decimal_code.xml new file mode 100644 index 0000000000..9ea37e5061 --- /dev/null +++ b/vector/src/main/res/layout/item_verification_decimal_code.xml @@ -0,0 +1,18 @@ + + diff --git a/vector/src/main/res/layout/item_verification_emojis.xml b/vector/src/main/res/layout/item_verification_emojis.xml new file mode 100644 index 0000000000..f6497540f9 --- /dev/null +++ b/vector/src/main/res/layout/item_verification_emojis.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/vector/src/main/res/layout/item_verification_notice.xml b/vector/src/main/res/layout/item_verification_notice.xml new file mode 100644 index 0000000000..bb495f88b1 --- /dev/null +++ b/vector/src/main/res/layout/item_verification_notice.xml @@ -0,0 +1,13 @@ + + diff --git a/vector/src/main/res/layout/item_verification_waiting.xml b/vector/src/main/res/layout/item_verification_waiting.xml new file mode 100644 index 0000000000..517d95f1ac --- /dev/null +++ b/vector/src/main/res/layout/item_verification_waiting.xml @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 4eb286ceaa..bfa699173c 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -85,4 +85,8 @@ Message editor + + For extra security, verify %s by checking a one-time code. + For maximum security, do this in person. +