mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
New ZRTP SAS validation dialog for cache mismatch scenario
This commit is contained in:
parent
72f8574a1e
commit
ceb3679975
10 changed files with 103 additions and 35 deletions
|
|
@ -217,27 +217,15 @@ class ActiveCallFragment : GenericCallFragment() {
|
|||
|
||||
callViewModel.showZrtpSasDialogEvent.observe(viewLifecycleOwner) {
|
||||
it.consume { pair ->
|
||||
val model = ZrtpSasConfirmationDialogModel(pair.first, pair.second)
|
||||
val dialog = DialogUtils.getZrtpSasConfirmationDialog(requireActivity(), model)
|
||||
callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
|
||||
showZrtpSasValidationDialog(pair.first, pair.second, false)
|
||||
}
|
||||
}
|
||||
|
||||
model.skipEvent.observe(viewLifecycleOwner) { event ->
|
||||
event.consume {
|
||||
callViewModel.skipZrtpSas()
|
||||
callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
model.authTokenClickedEvent.observe(viewLifecycleOwner) { event ->
|
||||
event.consume { authToken ->
|
||||
callViewModel.updateZrtpSas(authToken)
|
||||
callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
dialog.show()
|
||||
zrtpSasDialog = dialog
|
||||
callViewModel.showZrtpSasCacheMismatchDialogEvent.observe(viewLifecycleOwner) {
|
||||
it.consume { pair ->
|
||||
callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
|
||||
showZrtpSasValidationDialog(pair.first, pair.second, true)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -427,4 +415,34 @@ class ActiveCallFragment : GenericCallFragment() {
|
|||
|
||||
set.applyTo(constraintLayout)
|
||||
}
|
||||
|
||||
private fun showZrtpSasValidationDialog(
|
||||
authTokenToRead: String,
|
||||
authTokensToListen: List<String>,
|
||||
cacheMismatch: Boolean
|
||||
) {
|
||||
val model = ZrtpSasConfirmationDialogModel(
|
||||
authTokenToRead,
|
||||
authTokensToListen,
|
||||
cacheMismatch
|
||||
)
|
||||
val dialog = DialogUtils.getZrtpSasConfirmationDialog(requireActivity(), model)
|
||||
|
||||
model.skipEvent.observe(viewLifecycleOwner) { event ->
|
||||
event.consume {
|
||||
callViewModel.skipZrtpSas()
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
model.authTokenClickedEvent.observe(viewLifecycleOwner) { event ->
|
||||
event.consume { authToken ->
|
||||
callViewModel.updateZrtpSas(authToken)
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
dialog.show()
|
||||
zrtpSasDialog = dialog
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@ import org.linphone.utils.Event
|
|||
|
||||
class ZrtpSasConfirmationDialogModel @UiThread constructor(
|
||||
authTokenToRead: String,
|
||||
authTokensToListen: List<String>
|
||||
authTokensToListen: List<String>,
|
||||
val cacheMismatch: Boolean
|
||||
) : GenericViewModel() {
|
||||
companion object {
|
||||
private const val TAG = "[ZRTP SAS Confirmation Dialog]"
|
||||
|
|
|
|||
|
|
@ -169,6 +169,10 @@ class CurrentCallViewModel @UiThread constructor() : GenericViewModel() {
|
|||
MutableLiveData<Event<Pair<String, List<String>>>>()
|
||||
}
|
||||
|
||||
val showZrtpSasCacheMismatchDialogEvent: MutableLiveData<Event<Pair<String, List<String>>>> by lazy {
|
||||
MutableLiveData<Event<Pair<String, List<String>>>>()
|
||||
}
|
||||
|
||||
val zrtpAuthTokenVerifiedEvent: MutableLiveData<Event<Boolean>> by lazy {
|
||||
MutableLiveData<Event<Boolean>>()
|
||||
}
|
||||
|
|
@ -1003,7 +1007,12 @@ class CurrentCallViewModel @UiThread constructor() : GenericViewModel() {
|
|||
val tokenToRead = currentCall.localAuthenticationToken
|
||||
val tokensToDisplay = currentCall.remoteAuthenticationTokens.toList()
|
||||
if (!tokenToRead.isNullOrEmpty() && tokensToDisplay.size == 4) {
|
||||
showZrtpSasDialogEvent.postValue(Event(Pair(tokenToRead, tokensToDisplay)))
|
||||
val event = Event(Pair(tokenToRead, tokensToDisplay))
|
||||
if (cacheMismatch) {
|
||||
showZrtpSasCacheMismatchDialogEvent.postValue(event)
|
||||
} else {
|
||||
showZrtpSasDialogEvent.postValue(event)
|
||||
}
|
||||
} else {
|
||||
Log.w(
|
||||
"$TAG Either local auth token is null/empty or remote tokens list doesn't contains 4 elements!"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
|
||||
<solid
|
||||
android:color="@color/orange_warning_600"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item android:bottom="2dp">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="15dp" />
|
||||
<solid
|
||||
android:color="@color/white" />
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:topLeftRadius="15dp" android:topRightRadius="15dp" />
|
||||
<solid android:color="@color/orange_warning_600"/>
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
12
app/src/main/res/drawable/trusted_white.xml
Normal file
12
app/src/main/res/drawable/trusted_white.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="25dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="25"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M23.5,2.526V9.236C23.5,19.465 14.812,22.859 13.073,23.436C12.701,23.561 12.299,23.561 11.927,23.436C10.185,22.859 1.5,19.465 1.5,9.236V2.526C1.5,2.042 1.693,1.577 2.037,1.235C2.381,0.892 2.847,0.7 3.333,0.7H21.667C22.153,0.7 22.619,0.892 22.963,1.235C23.307,1.577 23.5,2.042 23.5,2.526Z"
|
||||
android:fillColor="#364860"/>
|
||||
<path
|
||||
android:pathData="M20.833,1.6H4.167C3.725,1.6 3.301,1.776 2.988,2.088C2.676,2.401 2.5,2.825 2.5,3.267V9.389C2.5,18.723 10.398,21.82 11.979,22.346C12.317,22.461 12.683,22.461 13.021,22.346C14.604,21.82 22.5,18.723 22.5,9.389V3.267C22.5,2.825 22.324,2.401 22.012,2.088C21.699,1.776 21.275,1.6 20.833,1.6ZM17.256,8.856L11.423,14.69C11.345,14.767 11.254,14.828 11.153,14.87C11.051,14.912 10.943,14.934 10.833,14.934C10.724,14.934 10.615,14.912 10.514,14.87C10.413,14.828 10.321,14.767 10.244,14.69L7.744,12.19C7.587,12.033 7.5,11.821 7.5,11.6C7.5,11.379 7.587,11.167 7.744,11.01C7.9,10.854 8.112,10.766 8.333,10.766C8.554,10.766 8.767,10.854 8.923,11.01L10.833,12.921L16.077,7.677C16.154,7.6 16.246,7.538 16.348,7.496C16.449,7.454 16.557,7.433 16.667,7.433C16.776,7.433 16.885,7.454 16.986,7.496C17.087,7.538 17.179,7.6 17.256,7.677C17.334,7.754 17.395,7.846 17.437,7.948C17.479,8.049 17.5,8.157 17.5,8.267C17.5,8.376 17.479,8.485 17.437,8.586C17.395,8.687 17.334,8.779 17.256,8.856Z"
|
||||
android:fillColor="#FFFFFF"/>
|
||||
</vector>
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
android:id="@+id/header"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_zrtp_dialog_header_background"
|
||||
android:background="@{viewModel.cacheMismatch ? @drawable/shape_zrtp_dialog_warning_header_background : @drawable/shape_zrtp_dialog_header_background, default=@drawable/shape_zrtp_dialog_header_background}"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintWidth_max="@dimen/dialog_max_width"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
|
|
@ -34,11 +34,10 @@
|
|||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:layout_marginTop="10dp"
|
||||
android:src="@drawable/lock_key"
|
||||
android:src="@drawable/trusted_white"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:tint="@color/white" />
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style_700"
|
||||
|
|
@ -76,7 +75,7 @@
|
|||
android:id="@+id/body"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_zrtp_dialog_background"
|
||||
android:background="@{viewModel.cacheMismatch ? @drawable/shape_zrtp_dialog_warning_background : @drawable/shape_zrtp_dialog_background, default=@drawable/shape_zrtp_dialog_background}"
|
||||
app:layout_constraintWidth_max="@dimen/dialog_max_width"
|
||||
app:layout_constraintTop_toBottomOf="@id/header"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
android:id="@+id/header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_zrtp_dialog_header_background"
|
||||
android:background="@{viewModel.cacheMismatch ? @drawable/shape_zrtp_dialog_warning_header_background : @drawable/shape_zrtp_dialog_header_background, default=@drawable/shape_zrtp_dialog_header_background}"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/body">
|
||||
|
|
@ -31,11 +31,10 @@
|
|||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:layout_marginTop="10dp"
|
||||
android:src="@drawable/lock_key"
|
||||
android:src="@drawable/trusted_white"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:tint="@color/white" />
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style_700"
|
||||
|
|
@ -73,7 +72,7 @@
|
|||
android:id="@+id/body"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_zrtp_dialog_background"
|
||||
android:background="@{viewModel.cacheMismatch ? @drawable/shape_zrtp_dialog_warning_background : @drawable/shape_zrtp_dialog_background, default=@drawable/shape_zrtp_dialog_background}"
|
||||
app:layout_constraintTop_toBottomOf="@id/header"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
|
|
@ -85,7 +84,7 @@
|
|||
android:layout_marginStart="15dp"
|
||||
android:layout_marginEnd="15dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:text="@string/call_dialog_zrtp_validate_trust_message"
|
||||
android:text="@{viewModel.cacheMismatch ? @string/call_dialog_zrtp_validate_trust_warning_message : @string/call_dialog_zrtp_validate_trust_message, default=@string/call_dialog_zrtp_validate_trust_message}"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_600"
|
||||
android:gravity="center"
|
||||
|
|
|
|||
|
|
@ -587,7 +587,8 @@
|
|||
<string name="calls_list_dialog_merge_into_conference_label">Créer une conférence</string>
|
||||
|
||||
<string name="call_dialog_zrtp_validate_trust_title">Vérification de sécurité</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_message">Pour votre sécurité, nous avons besoin de vérifier l\'appareil de votre correspondant.\nVeuillez échanger vos codes :</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_message">Pour garantir le chiffrement, nous avons besoin d’authentifier l’appareil de votre correspondant.\nVeuillez échanger vos codes :</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_warning_message">Pour garantir le chiffrement, nous avons besoin de réauthentifier l’appareil de votre correspondant.\nVeuillez ré-échanger vos codes :</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_local_code_label">Votre code :</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_remote_code_label">Code correspondant : </string>
|
||||
<string name="call_dialog_zrtp_validate_trust_letters_do_not_match">Aucune correspondance</string>
|
||||
|
|
|
|||
|
|
@ -624,7 +624,8 @@
|
|||
<string name="calls_list_dialog_merge_into_conference_label">Create conference</string>
|
||||
|
||||
<string name="call_dialog_zrtp_validate_trust_title">Validate the device</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_message">For your safety, we need to validate your correspondent device.\nPlease exchange your codes:</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_message">For your safety, we need to authenticate your correspondent device.\nPlease exchange your codes:</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_warning_message">For your safety, we need to re-authenticate your correspondent device.\nPlease re-exchange your codes:</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_local_code_label">Your code:</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_remote_code_label">Correspondent code:</string>
|
||||
<string name="call_dialog_zrtp_validate_trust_letters_do_not_match">Nothing matches</string>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue