Added post quantum ZRTP stats + show ZRTP Post Quantum instead of ZRTP in call encryption settings if available + updated ZRTP SAS dialog with new layout

This commit is contained in:
Sylvain Berfini 2022-07-19 13:00:47 +02:00
parent 1dc48002f3
commit 95de49be30
19 changed files with 302 additions and 146 deletions

View file

@ -13,6 +13,7 @@ Group changes to describe their impact on the project, as follows:
## [4.7.0] - Unreleased ## [4.7.0] - Unreleased
### Added ### Added
- Post Quantum encryption when using ZRTP
- Conference creation with scheduling, video, different layouts, showing who is speaking and who is muted, etc... - Conference creation with scheduling, video, different layouts, showing who is speaking and who is muted, etc...
- Group calls directly from group chat rooms - Group calls directly from group chat rooms
- Chat rooms can be individually muted (no notification when receiving a chat message) - Chat rooms can be individually muted (no notification when receiving a chat message)

View file

@ -15,6 +15,7 @@ auto_net_state_mon=1
auto_answer_replacing_calls=1 auto_answer_replacing_calls=1
ping_with_options=0 ping_with_options=0
use_cpim=1 use_cpim=1
zrtp_key_agreements_suites=MS_ZRTP_KEY_AGREEMENT_K255_KYB512
[sound] [sound]
#remove this property for any application that is not Linphone public version itself #remove this property for any application that is not Linphone public version itself

View file

@ -290,7 +290,11 @@ class CallSettingsViewModel : GenericSettingsViewModel() {
encryptionValues.add(MediaEncryption.SRTP.toInt()) encryptionValues.add(MediaEncryption.SRTP.toInt())
} }
if (core.mediaEncryptionSupported(MediaEncryption.ZRTP)) { if (core.mediaEncryptionSupported(MediaEncryption.ZRTP)) {
labels.add(prefs.getString(R.string.call_settings_media_encryption_zrtp)) if (core.postQuantumAvailable) {
labels.add(prefs.getString(R.string.call_settings_media_encryption_zrtp_post_quantum))
} else {
labels.add(prefs.getString(R.string.call_settings_media_encryption_zrtp))
}
encryptionValues.add(MediaEncryption.ZRTP.toInt()) encryptionValues.add(MediaEncryption.ZRTP.toInt())
} }
if (core.mediaEncryptionSupported(MediaEncryption.DTLS)) { if (core.mediaEncryptionSupported(MediaEncryption.DTLS)) {

View file

@ -28,6 +28,8 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
val videoStats = MutableLiveData<ArrayList<StatItemData>>() val videoStats = MutableLiveData<ArrayList<StatItemData>>()
val mediaEncryptionStats = MutableLiveData<ArrayList<StatItemData>>()
val isVideoEnabled = MutableLiveData<Boolean>() val isVideoEnabled = MutableLiveData<Boolean>()
private var enabled = false private var enabled = false
@ -48,11 +50,16 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
val videoEnabled = call.currentParams.isVideoEnabled val videoEnabled = call.currentParams.isVideoEnabled
isVideoEnabled.value = videoEnabled isVideoEnabled.value = videoEnabled
updateMediaEncryptionStats()
} }
fun enable() { fun enable() {
enabled = true enabled = true
call.addListener(listener) call.addListener(listener)
// Needed for media encryption stats
updateMediaEncryptionStats()
} }
fun disable() { fun disable() {
@ -65,8 +72,13 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
super.destroy() super.destroy()
} }
private fun updateMediaEncryptionStats() {
initCallStats()
}
private fun initCallStats() { private fun initCallStats() {
val audioList = arrayListOf<StatItemData>() val audioList = arrayListOf<StatItemData>()
audioList.add(StatItemData(StatType.CAPTURE)) audioList.add(StatItemData(StatType.CAPTURE))
audioList.add(StatItemData(StatType.PLAYBACK)) audioList.add(StatItemData(StatType.PLAYBACK))
audioList.add(StatItemData(StatType.PAYLOAD)) audioList.add(StatItemData(StatType.PAYLOAD))
@ -79,9 +91,26 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
audioList.add(StatItemData(StatType.SENDER_LOSS)) audioList.add(StatItemData(StatType.SENDER_LOSS))
audioList.add(StatItemData(StatType.RECEIVER_LOSS)) audioList.add(StatItemData(StatType.RECEIVER_LOSS))
audioList.add(StatItemData(StatType.JITTER)) audioList.add(StatItemData(StatType.JITTER))
audioStats.value = audioList audioStats.value = audioList
val mediaEncryptionList = arrayListOf<StatItemData>()
mediaEncryptionList.add(StatItemData(StatType.MEDIA_ENCRYPTION))
// ZRTP stats are only available when authentication token isn't null !
if (call.currentParams.mediaEncryption == MediaEncryption.ZRTP && call.authenticationToken != null) {
mediaEncryptionList.add(StatItemData(StatType.ZRTP_CIPHER_ALGO))
mediaEncryptionList.add(StatItemData(StatType.ZRTP_KEY_AGREEMENT_ALGO))
mediaEncryptionList.add(StatItemData(StatType.ZRTP_HASH_ALGO))
mediaEncryptionList.add(StatItemData(StatType.ZRTP_AUTH_TAG_ALGO))
mediaEncryptionList.add(StatItemData(StatType.ZRTP_AUTH_SAS_ALGO))
}
mediaEncryptionStats.value = mediaEncryptionList
val videoList = arrayListOf<StatItemData>() val videoList = arrayListOf<StatItemData>()
videoList.add(StatItemData(StatType.CAPTURE)) videoList.add(StatItemData(StatType.CAPTURE))
videoList.add(StatItemData(StatType.PLAYBACK)) videoList.add(StatItemData(StatType.PLAYBACK))
videoList.add(StatItemData(StatType.PAYLOAD)) videoList.add(StatItemData(StatType.PAYLOAD))
@ -98,6 +127,7 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
videoList.add(StatItemData(StatType.RECEIVED_RESOLUTION)) videoList.add(StatItemData(StatType.RECEIVED_RESOLUTION))
videoList.add(StatItemData(StatType.SENT_FPS)) videoList.add(StatItemData(StatType.SENT_FPS))
videoList.add(StatItemData(StatType.RECEIVED_FPS)) videoList.add(StatItemData(StatType.RECEIVED_FPS))
videoStats.value = videoList videoStats.value = videoList
} }
@ -106,6 +136,9 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
for (stat in audioStats.value.orEmpty()) { for (stat in audioStats.value.orEmpty()) {
stat.update(call, stats) stat.update(call, stats)
} }
for (stat in mediaEncryptionStats.value.orEmpty()) {
stat.update(call, stats)
}
} else if (stats.type == StreamType.Video) { } else if (stats.type == StreamType.Video) {
for (stat in videoStats.value.orEmpty()) { for (stat in videoStats.value.orEmpty()) {
stat.update(call, stats) stat.update(call, stats)

View file

@ -23,6 +23,7 @@ import androidx.lifecycle.MutableLiveData
import java.text.DecimalFormat import java.text.DecimalFormat
import org.linphone.R import org.linphone.R
import org.linphone.core.* import org.linphone.core.*
import org.linphone.utils.AppUtils
enum class StatType(val nameResource: Int) { enum class StatType(val nameResource: Int) {
CAPTURE(R.string.call_stats_capture_filter), CAPTURE(R.string.call_stats_capture_filter),
@ -41,7 +42,13 @@ enum class StatType(val nameResource: Int) {
RECEIVED_RESOLUTION(R.string.call_stats_video_resolution_received), RECEIVED_RESOLUTION(R.string.call_stats_video_resolution_received),
SENT_FPS(R.string.call_stats_video_fps_sent), SENT_FPS(R.string.call_stats_video_fps_sent),
RECEIVED_FPS(R.string.call_stats_video_fps_received), RECEIVED_FPS(R.string.call_stats_video_fps_received),
ESTIMATED_AVAILABLE_DOWNLOAD_BW(R.string.call_stats_estimated_download) ESTIMATED_AVAILABLE_DOWNLOAD_BW(R.string.call_stats_estimated_download),
MEDIA_ENCRYPTION(R.string.call_stats_media_encryption),
ZRTP_CIPHER_ALGO(R.string.call_stats_zrtp_cipher_algo),
ZRTP_KEY_AGREEMENT_ALGO(R.string.call_stats_zrtp_key_agreement_algo),
ZRTP_HASH_ALGO(R.string.call_stats_zrtp_hash_algo),
ZRTP_AUTH_TAG_ALGO(R.string.call_stats_zrtp_auth_tag_algo),
ZRTP_AUTH_SAS_ALGO(R.string.call_stats_zrtp_sas_algo)
} }
class StatItemData(val type: StatType) { class StatItemData(val type: StatType) {
@ -75,6 +82,26 @@ class StatItemData(val type: StatType) {
StatType.SENT_FPS -> "${call.currentParams.sentFramerate}" StatType.SENT_FPS -> "${call.currentParams.sentFramerate}"
StatType.RECEIVED_FPS -> "${call.currentParams.receivedFramerate}" StatType.RECEIVED_FPS -> "${call.currentParams.receivedFramerate}"
StatType.ESTIMATED_AVAILABLE_DOWNLOAD_BW -> "${stats.estimatedDownloadBandwidth} kbit/s" StatType.ESTIMATED_AVAILABLE_DOWNLOAD_BW -> "${stats.estimatedDownloadBandwidth} kbit/s"
StatType.MEDIA_ENCRYPTION -> {
when (call.currentParams.mediaEncryption) {
MediaEncryption.ZRTP -> {
if (stats.isZrtpKeyAgreementAlgoPostQuantum) {
AppUtils.getString(R.string.call_settings_media_encryption_zrtp_post_quantum)
} else {
AppUtils.getString(R.string.call_settings_media_encryption_zrtp)
}
}
MediaEncryption.DTLS -> AppUtils.getString(R.string.call_settings_media_encryption_dtls)
MediaEncryption.SRTP -> AppUtils.getString(R.string.call_settings_media_encryption_srtp)
MediaEncryption.None -> AppUtils.getString(R.string.call_settings_media_encryption_none)
else -> "Unexpected!"
}
}
StatType.ZRTP_CIPHER_ALGO -> stats.zrtpCipherAlgo
StatType.ZRTP_KEY_AGREEMENT_ALGO -> stats.zrtpKeyAgreementAlgo
StatType.ZRTP_HASH_ALGO -> stats.zrtpHashAlgo
StatType.ZRTP_AUTH_TAG_ALGO -> stats.zrtpAuthTagAlgo
StatType.ZRTP_AUTH_SAS_ALGO -> stats.zrtpSasAlgo
} }
} }
} }

View file

@ -112,9 +112,13 @@ class StatusFragment : GenericFragment<VoipStatusFragmentBinding>() {
viewModel.zrtpReadSas = toRead.uppercase(Locale.getDefault()) viewModel.zrtpReadSas = toRead.uppercase(Locale.getDefault())
viewModel.zrtpListenSas = toListen.uppercase(Locale.getDefault()) viewModel.zrtpListenSas = toListen.uppercase(Locale.getDefault())
viewModel.showIcon = true viewModel.showIcon = true
viewModel.iconResource = R.drawable.security_2_indicator viewModel.iconResource = if (call.audioStats?.isZrtpKeyAgreementAlgoPostQuantum == true) {
R.drawable.security_post_quantum
} else {
R.drawable.security_2_indicator
}
val dialog: Dialog = DialogUtils.getDialog(requireContext(), viewModel) val dialog: Dialog = DialogUtils.getVoipDialog(requireContext(), viewModel)
viewModel.showDeleteButton( viewModel.showDeleteButton(
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -43,62 +43,6 @@
android:gravity="center" android:gravity="center"
android:text="@{viewModel.message, default=Message}"/> android:text="@{viewModel.message, default=Message}"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:orientation="vertical"
android:visibility="@{viewModel.showZrtp ? View.VISIBLE : View.GONE, default=gone}">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dialog_zrtp_local_sas"
android:gravity="center"
android:textAppearance="@style/dialog_zrtp_white_font" />
<TextView
android:text="@{viewModel.zrtpReadSas}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:textAppearance="@style/dialog_zrtp_colored_font" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dialog_zrtp_remote_sas"
android:gravity="center"
android:textAppearance="@style/dialog_zrtp_white_font" />
<TextView
android:text="@{viewModel.zrtpListenSas}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:textAppearance="@style/dialog_zrtp_colored_font" />
</LinearLayout>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -26,6 +26,7 @@
style="@style/call_stats_font" style="@style/call_stats_font"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:maxLines="1" android:maxLines="1"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center" /> android:gravity="center" />

View file

@ -16,6 +16,24 @@
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
<TextView
style="@style/call_stats_title_font"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical|center"
android:text="@string/call_settings_encryption_title"
tools:gravity="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingBottom="10dp"
app:entries="@{data.mediaEncryptionStats}"
app:layout="@{@layout/voip_call_stat_cell}" />
<TextView <TextView
style="@style/call_stats_title_font" style="@style/call_stats_title_font"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -15,99 +15,208 @@
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true">
<View
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:background="@drawable/shape_dialog_background"
app:layout_constraintTop_toTopOf="@id/dialog_message"
app:layout_constraintBottom_toBottomOf="@id/bottom_barrier"/>
<TextView
android:id="@+id/cancel_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:background="@drawable/shape_rect_gray_button"
android:gravity="center"
android:onClick="@{() -> viewModel.onCancelClicked()}"
android:padding="10dp"
android:text="@{viewModel.cancelLabel, default=Cancel}"
android:visibility="@{viewModel.showCancel ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toStartOf="@id/delete_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_chainStyle="spread"/>
<TextView
android:id="@+id/delete_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width"
android:layout_height="wrap_content"
android:background="@drawable/shape_rect_orange_button"
android:gravity="center"
android:onClick="@{() -> viewModel.onDeleteClicked()}"
android:padding="10dp"
android:text="@{viewModel.deleteLabel, default=Delete}"
android:visibility="@{viewModel.showDelete ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toStartOf="@id/ok_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/cancel_button" />
<TextView
android:id="@+id/ok_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:background="@drawable/shape_rect_green_button"
android:gravity="center"
android:onClick="@{() -> viewModel.onOkClicked()}"
android:padding="10dp"
android:text="@{viewModel.okLabel, default=OK}"
android:visibility="@{viewModel.showOk ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/delete_button" />
<androidx.constraintlayout.widget.Barrier <androidx.constraintlayout.widget.Barrier
android:id="@+id/top_barrier" android:id="@+id/top_barrier"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="top" app:barrierDirection="top"
app:barrierMargin="-10dp" app:constraint_referenced_ids="dialog_icon, dialog_title, dialog_message" />
app:constraint_referenced_ids="ok_button,delete_button,cancel_button"/>
<androidx.constraintlayout.widget.Barrier <View
android:id="@+id/bottom_barrier" android:id="@+id/background"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="-20dp"
android:layout_marginTop="-10dp"
android:background="@drawable/shape_dialog_background"
app:layout_constraintBottom_toBottomOf="@id/buttons_bottom_barrier"
app:layout_constraintTop_toTopOf="@id/top_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/dialog_icon"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginBottom="10dp"
android:adjustViewBounds="true"
android:contentDescription="@{viewModel.title}"
android:src="@{viewModel.iconResource, default=@drawable/security_alert_indicator}"
android:visibility="@{viewModel.showIcon ? View.VISIBLE : View.GONE}"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@id/dialog_title"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/dialog_title"
style="@style/dialog_title_font"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="bottom" android:layout_margin="10dp"
app:barrierMargin="20dp" android:gravity="center"
app:constraint_referenced_ids="ok_button,delete_button,cancel_button"/> android:text="@{viewModel.title, default=Title}"
android:visibility="@{viewModel.showTitle ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toTopOf="@id/dialog_message"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_icon" />
<TextView <TextView
android:id="@+id/dialog_message" android:id="@+id/dialog_message"
style="@style/dialog_message_font" style="@style/dialog_message_font"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginStart="20dp" android:layout_marginStart="20dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:gravity="center" android:gravity="center"
android:text="@{viewModel.message, default=Message}" android:text="@{viewModel.message, default=Message}"
app:layout_constraintBottom_toTopOf="@id/top_barrier" app:layout_constraintBottom_toTopOf="@id/dialog_zrtp_1"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_title" />
<androidx.constraintlayout.widget.Group
android:id="@+id/dialog_zrtp_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.showZrtp ? View.VISIBLE : View.GONE}"
app:constraint_referenced_ids="dialog_zrtp_1, dialog_zrtp_sas_1, dialog_zrtp_2, dialog_zrtp_sas_2" />
<TextView
android:id="@+id/dialog_zrtp_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="@string/dialog_zrtp_local_sas"
android:textAppearance="@style/dialog_zrtp_white_font"
app:layout_constraintBottom_toTopOf="@id/dialog_zrtp_sas_1"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_message" />
<TextView
android:id="@+id/dialog_zrtp_sas_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:gravity="center"
android:text="@{viewModel.zrtpReadSas}"
android:textAppearance="@style/dialog_zrtp_colored_font"
app:layout_constraintBottom_toTopOf="@id/dialog_zrtp_2"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_zrtp_1" />
<TextView
android:id="@+id/dialog_zrtp_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="@string/dialog_zrtp_remote_sas"
android:textAppearance="@style/dialog_zrtp_white_font"
app:layout_constraintBottom_toTopOf="@id/dialog_zrtp_sas_2"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_zrtp_sas_1" />
<TextView
android:id="@+id/dialog_zrtp_sas_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:gravity="center"
android:text="@{viewModel.zrtpListenSas}"
android:textAppearance="@style/dialog_zrtp_colored_font"
app:layout_constraintBottom_toTopOf="@id/cancel_button"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_zrtp_2" />
<TextView
android:id="@+id/cancel_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_rect_gray_button"
android:ellipsize="end"
android:gravity="center"
android:onClick="@{() -> viewModel.onCancelClicked()}"
android:padding="10dp"
android:singleLine="true"
android:text="@{viewModel.cancelLabel, default=Cancel}"
android:visibility="@{viewModel.showCancel ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toStartOf="@id/delete_button"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toStartOf="@id/background"
app:layout_constraintTop_toBottomOf="@id/dialog_zrtp_sas_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width" />
<TextView
android:id="@+id/delete_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_rect_orange_button"
android:ellipsize="end"
android:gravity="center"
android:onClick="@{() -> viewModel.onDeleteClicked()}"
android:padding="10dp"
android:singleLine="true"
android:text="@{viewModel.deleteLabel, default=Delete}"
android:visibility="@{viewModel.showDelete ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toStartOf="@id/ok_button"
app:layout_constraintStart_toEndOf="@id/cancel_button"
app:layout_constraintTop_toBottomOf="@id/dialog_zrtp_sas_2"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width" />
<TextView
android:id="@+id/ok_button"
style="@style/big_orange_button_font"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_rect_green_button"
android:ellipsize="end"
android:gravity="center"
android:onClick="@{() -> viewModel.onOkClicked()}"
android:padding="10dp"
android:singleLine="true"
android:text="@{viewModel.okLabel, default=OK}"
android:visibility="@{viewModel.showOk ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toEndOf="@id/background"
app:layout_constraintStart_toEndOf="@id/delete_button"
app:layout_constraintTop_toTopOf="@id/delete_button"
app:layout_constraintWidth_max="@dimen/voip_dialog_button_max_width" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/buttons_top_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="dialog_message, dialog_zrtp_sas_2" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/buttons_bottom_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="ok_button,delete_button,cancel_button" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -414,7 +414,7 @@
<string name="call_settings_media_encryption_none">Ninguno</string> <string name="call_settings_media_encryption_none">Ninguno</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_encryption_mandatory_title">La encriptación de los medios es obligatoria</string> <string name="call_settings_encryption_mandatory_title">La encriptación de los medios es obligatoria</string>
<string name="call_settings_overlay_title">Notificación de llamada superpuesta</string> <string name="call_settings_overlay_title">Notificación de llamada superpuesta</string>
<string name="call_settings_system_wide_overlay_summary">Se le pedirá que conceda el permiso de superposición</string> <string name="call_settings_system_wide_overlay_summary">Se le pedirá que conceda el permiso de superposición</string>

View file

@ -277,7 +277,8 @@
<string name="call_settings_media_encryption_none">Aucun</string> <string name="call_settings_media_encryption_none">Aucun</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_zrtp_post_quantum">ZRTP Post Quantique</string>
<string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="content_description_menu_history">Historique</string> <string name="content_description_menu_history">Historique</string>
<string name="content_description_go_to_contact">Afficher les détails du contact</string> <string name="content_description_go_to_contact">Afficher les détails du contact</string>
<string name="content_description_call_quality_0">La qualité est très mauvaise</string> <string name="content_description_call_quality_0">La qualité est très mauvaise</string>
@ -737,4 +738,10 @@
<string name="conference_scheduled_terminated_filter">Terminées</string> <string name="conference_scheduled_terminated_filter">Terminées</string>
<string name="conference_scheduled_future_filter">Programmées</string> <string name="conference_scheduled_future_filter">Programmées</string>
<string name="content_description_chat_message_meeting_attachment">Invitation à une réunion</string> <string name="content_description_chat_message_meeting_attachment">Invitation à une réunion</string>
<string name="call_stats_media_encryption">Chiffrement du média :</string>
<string name="call_stats_zrtp_cipher_algo">Algorithme de chiffrement :</string>
<string name="call_stats_zrtp_key_agreement_algo">Algorithme d\'échange de clef :</string>
<string name="call_stats_zrtp_hash_algo">Algorithme de hachage :</string>
<string name="call_stats_zrtp_auth_tag_algo">Algorithme d\'authentification :</string>
<string name="call_stats_zrtp_sas_algo">Algorithme SAS :</string>
</resources> </resources>

View file

@ -224,7 +224,7 @@
<string name="call_settings_encryption_title">Média titkosítás</string> <string name="call_settings_encryption_title">Média titkosítás</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_encryption_mandatory_title">Média titkosítása kötelező</string> <string name="call_settings_encryption_mandatory_title">Média titkosítása kötelező</string>
<string name="call_settings_overlay_title">Hívás értesítés átfedése</string> <string name="call_settings_overlay_title">Hívás értesítés átfedése</string>
<string name="call_settings_system_wide_overlay_title">Átfedés megjelenítése az alkalmazáson kívül</string> <string name="call_settings_system_wide_overlay_title">Átfedés megjelenítése az alkalmazáson kívül</string>

View file

@ -254,7 +254,7 @@
<string name="call_settings_media_encryption_none">Nenhuma</string> <string name="call_settings_media_encryption_none">Nenhuma</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_use_telecom_manager_title">Melhore as interações com dispositivos bluetooth</string> <string name="call_settings_use_telecom_manager_title">Melhore as interações com dispositivos bluetooth</string>
<string name="call_settings_use_telecom_manager_summary">Requer algumas permissões extras</string> <string name="call_settings_use_telecom_manager_summary">Requer algumas permissões extras</string>
<string name="call_settings_system_wide_overlay_title">Mostrar sobreposição fora do aplicativo</string> <string name="call_settings_system_wide_overlay_title">Mostrar sobreposição fora do aplicativo</string>

View file

@ -256,7 +256,7 @@
<string name="call_settings_go_to_android_notification_settings">Настройки уведомлений Android</string> <string name="call_settings_go_to_android_notification_settings">Настройки уведомлений Android</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_auto_start_recording_title">Автоматически начинать запись разговоров</string> <string name="call_settings_auto_start_recording_title">Автоматически начинать запись разговоров</string>
<string name="chat_settings_file_sharing_url_title">URL сервера обмена</string> <string name="chat_settings_file_sharing_url_title">URL сервера обмена</string>
<string name="chat_settings_file_sharing_url_summary">Не изменяйте, если вы не знаете, что делаете!</string> <string name="chat_settings_file_sharing_url_summary">Не изменяйте, если вы не знаете, что делаете!</string>

View file

@ -271,7 +271,7 @@
<string name="call_settings_media_encryption_none"></string> <string name="call_settings_media_encryption_none"></string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_system_wide_overlay_summary">系統將請您授權「顯示在其他應用程式上層」權限</string> <string name="call_settings_system_wide_overlay_summary">系統將請您授權「顯示在其他應用程式上層」權限</string>
<string name="call_settings_rfc2833_dtmf_title">傳送帶内撥號音RFC 2833</string> <string name="call_settings_rfc2833_dtmf_title">傳送帶内撥號音RFC 2833</string>
<string name="call_settings_auto_start_title">立即開始通話</string> <string name="call_settings_auto_start_title">立即開始通話</string>

View file

@ -360,6 +360,12 @@
<string name="call_stats_decoder_name">Decoder:</string> <string name="call_stats_decoder_name">Decoder:</string>
<string name="call_stats_player_filter">Player filter:</string> <string name="call_stats_player_filter">Player filter:</string>
<string name="call_stats_capture_filter">Capture filter:</string> <string name="call_stats_capture_filter">Capture filter:</string>
<string name="call_stats_media_encryption">Media encryption:</string>
<string name="call_stats_zrtp_cipher_algo">Cipher algorithm:</string>
<string name="call_stats_zrtp_key_agreement_algo">Key agreement algorithm:</string>
<string name="call_stats_zrtp_hash_algo">Hash algorithm:</string>
<string name="call_stats_zrtp_auth_tag_algo">Authentication algorithm:</string>
<string name="call_stats_zrtp_sas_algo">SAS algorithm:</string>
<!-- Assistant --> <!-- Assistant -->
<string name="assistant_welcome_title">Welcome</string> <string name="assistant_welcome_title">Welcome</string>
@ -497,7 +503,8 @@
<string name="call_settings_media_encryption_none">None</string> <string name="call_settings_media_encryption_none">None</string>
<string name="call_settings_media_encryption_srtp">SRTP</string> <string name="call_settings_media_encryption_srtp">SRTP</string>
<string name="call_settings_media_encryption_zrtp">ZRTP</string> <string name="call_settings_media_encryption_zrtp">ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS</string> <string name="call_settings_media_encryption_zrtp_post_quantum">Post Quantum ZRTP</string>
<string name="call_settings_media_encryption_dtls">DTLS-SRTP</string>
<string name="call_settings_encryption_mandatory_title">Media encryption mandatory</string> <string name="call_settings_encryption_mandatory_title">Media encryption mandatory</string>
<string name="call_settings_use_telecom_manager_title">Improve interactions with bluetooth devices</string> <string name="call_settings_use_telecom_manager_title">Improve interactions with bluetooth devices</string>
<string name="call_settings_use_telecom_manager_summary">Requires some extra permissions</string> <string name="call_settings_use_telecom_manager_summary">Requires some extra permissions</string>

View file

@ -341,7 +341,7 @@
<style name="dialog_title_font" parent="@android:style/TextAppearance.Medium"> <style name="dialog_title_font" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/white_color</item> <item name="android:textColor">@color/white_color</item>
<item name="android:textSize">21.7sp</item> <item name="android:textSize">20sp</item>
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
<item name="android:fontFamily">sans-serif</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:lineSpacingExtra">6.7sp</item> <item name="android:lineSpacingExtra">6.7sp</item>
@ -349,7 +349,7 @@
<style name="dialog_message_font" parent="@android:style/TextAppearance.Small"> <style name="dialog_message_font" parent="@android:style/TextAppearance.Small">
<item name="android:textColor">@color/white_color</item> <item name="android:textColor">@color/white_color</item>
<item name="android:textSize">21sp</item> <item name="android:textSize">18sp</item>
</style> </style>
<style name="dialog_cancel_button_font" parent="@android:style/TextAppearance.Medium"> <style name="dialog_cancel_button_font" parent="@android:style/TextAppearance.Medium">
@ -374,7 +374,7 @@
<style name="dialog_zrtp_white_font" parent="@android:style/TextAppearance.Medium"> <style name="dialog_zrtp_white_font" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/white_color</item> <item name="android:textColor">@color/white_color</item>
<item name="android:textSize">20sp</item> <item name="android:textSize">18sp</item>
<item name="android:fontFamily">sans-serif</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:lineSpacingExtra">8.3sp</item> <item name="android:lineSpacingExtra">8.3sp</item>
</style> </style>