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
### Added
- Post Quantum encryption when using ZRTP
- Conference creation with scheduling, video, different layouts, showing who is speaking and who is muted, etc...
- Group calls directly from group chat rooms
- 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
ping_with_options=0
use_cpim=1
zrtp_key_agreements_suites=MS_ZRTP_KEY_AGREEMENT_K255_KYB512
[sound]
#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())
}
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())
}
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 mediaEncryptionStats = MutableLiveData<ArrayList<StatItemData>>()
val isVideoEnabled = MutableLiveData<Boolean>()
private var enabled = false
@ -48,11 +50,16 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
val videoEnabled = call.currentParams.isVideoEnabled
isVideoEnabled.value = videoEnabled
updateMediaEncryptionStats()
}
fun enable() {
enabled = true
call.addListener(listener)
// Needed for media encryption stats
updateMediaEncryptionStats()
}
fun disable() {
@ -65,8 +72,13 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
super.destroy()
}
private fun updateMediaEncryptionStats() {
initCallStats()
}
private fun initCallStats() {
val audioList = arrayListOf<StatItemData>()
audioList.add(StatItemData(StatType.CAPTURE))
audioList.add(StatItemData(StatType.PLAYBACK))
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.RECEIVER_LOSS))
audioList.add(StatItemData(StatType.JITTER))
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>()
videoList.add(StatItemData(StatType.CAPTURE))
videoList.add(StatItemData(StatType.PLAYBACK))
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.SENT_FPS))
videoList.add(StatItemData(StatType.RECEIVED_FPS))
videoStats.value = videoList
}
@ -106,6 +136,9 @@ class CallStatisticsData(val call: Call) : GenericContactData(call.remoteAddress
for (stat in audioStats.value.orEmpty()) {
stat.update(call, stats)
}
for (stat in mediaEncryptionStats.value.orEmpty()) {
stat.update(call, stats)
}
} else if (stats.type == StreamType.Video) {
for (stat in videoStats.value.orEmpty()) {
stat.update(call, stats)

View file

@ -23,6 +23,7 @@ import androidx.lifecycle.MutableLiveData
import java.text.DecimalFormat
import org.linphone.R
import org.linphone.core.*
import org.linphone.utils.AppUtils
enum class StatType(val nameResource: Int) {
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),
SENT_FPS(R.string.call_stats_video_fps_sent),
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) {
@ -75,6 +82,26 @@ class StatItemData(val type: StatType) {
StatType.SENT_FPS -> "${call.currentParams.sentFramerate}"
StatType.RECEIVED_FPS -> "${call.currentParams.receivedFramerate}"
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.zrtpListenSas = toListen.uppercase(Locale.getDefault())
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(
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -43,62 +43,6 @@
android:gravity="center"
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
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

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

View file

@ -16,6 +16,24 @@
android:gravity="center"
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
style="@style/call_stats_title_font"
android:layout_width="wrap_content"

View file

@ -15,99 +15,208 @@
android:clickable="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
android:id="@+id/top_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="top"
app:barrierMargin="-10dp"
app:constraint_referenced_ids="ok_button,delete_button,cancel_button"/>
app:constraint_referenced_ids="dialog_icon, dialog_title, dialog_message" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/bottom_barrier"
android:layout_width="wrap_content"
<View
android:id="@+id/background"
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"
app:barrierDirection="bottom"
app:barrierMargin="20dp"
app:constraint_referenced_ids="ok_button,delete_button,cancel_button"/>
android:layout_margin="10dp"
android:gravity="center"
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
android:id="@+id/dialog_message"
style="@style/dialog_message_font"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginStart="20dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="20dp"
android:gravity="center"
android:text="@{viewModel.message, default=Message}"
app:layout_constraintBottom_toTopOf="@id/top_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintBottom_toTopOf="@id/dialog_zrtp_1"
app:layout_constraintEnd_toEndOf="@id/background"
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>

View file

@ -414,7 +414,7 @@
<string name="call_settings_media_encryption_none">Ninguno</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_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_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>

View file

@ -277,7 +277,8 @@
<string name="call_settings_media_encryption_none">Aucun</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_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_go_to_contact">Afficher les détails du contact</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_future_filter">Programmées</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>

View file

@ -224,7 +224,7 @@
<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_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_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>

View file

@ -254,7 +254,7 @@
<string name="call_settings_media_encryption_none">Nenhuma</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_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_summary">Requer algumas permissões extras</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_media_encryption_srtp">SRTP</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="chat_settings_file_sharing_url_title">URL сервера обмена</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_srtp">SRTP</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_rfc2833_dtmf_title">傳送帶内撥號音RFC 2833</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_player_filter">Player 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 -->
<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_srtp">SRTP</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_use_telecom_manager_title">Improve interactions with bluetooth devices</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">
<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:fontFamily">sans-serif</item>
<item name="android:lineSpacingExtra">6.7sp</item>
@ -349,7 +349,7 @@
<style name="dialog_message_font" parent="@android:style/TextAppearance.Small">
<item name="android:textColor">@color/white_color</item>
<item name="android:textSize">21sp</item>
<item name="android:textSize">18sp</item>
</style>
<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">
<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:lineSpacingExtra">8.3sp</item>
</style>