VoipCallMonitor updates; stopFGS when notifs are removed am: 1feb0f280c am: 79e5238418
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telecomm/+/23619482
Change-Id: I16361a9632491b940047ce186a6595bb341f465c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 61381ae..50bead5 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Agtergrondoproepe"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Oproepe is ontkoppel"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Omgevalde foonprogramme"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Oproepstroming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"As jy hierdie oproep maak, sal dit jou <xliff:g id="OTHER_APP">%1$s</xliff:g>-oproep beëindig."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Kies hoe om hierdie oproep te maak"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Herlei oproep deur <xliff:g id="OTHER_APP">%1$s</xliff:g> te gebruik"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Luidspreker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ekstern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Onbekend"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Stroom oudio na ander toestel"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Beëindig oproep"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Skakel hier oor"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 79f29bf..21c8d7c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"የጀርባ ጥሪዎች"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"የተቋረጡ ጥሪዎች"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"የተበላሹ የስልክ መተግበሪያዎች"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"የጥሪ ዥረት"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ይህን ጥሪ ማድረግ የ<xliff:g id="OTHER_APP">%1$s</xliff:g> ጥሪዎን ያቋርጣል።"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ይህን ጥሪ እንዴት እንደሚያደርጉ ይምረጡ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g>ን በመጠቀም አዘዋውር"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ድምጽ ማውጫ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ውጫዊ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ያልታወቀ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ኦዲዮን ወደ ሌላ መሣሪያ በመልቀቅ ላይ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ዝጋ"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"እዚህ ቀይር"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index b9f8842..2a56809 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"مكالمات في الخلفية"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"المكالمات التي تم قطع الاتصال بها"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"تطبيقات الهواتف المعطّلة"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"بث المكالمات"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"يؤدي إجراء هذه المكالمة إلى إنهاء مكالمة <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"اختيار كيفية إجراء هذه المكالمة"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"إعادة توجيه المكالمة باستخدام <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"مكبّر صوت"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"المصادر الخارجية"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"غير معروف"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"بث الصوت على جهاز آخر"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"قطع الاتصال"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"الانتقال إلى هنا"</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 75d3416..72ac4db 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"নেপথ্যৰ কলসমূহ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"সংযোগ বিচ্ছিন্ন কৰা কলসমূহ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ক্ৰেশ্ব হোৱা ফ\'ন এপ্সমূহ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"কল ষ্ট্ৰীমিং"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"এই কলটো কৰিলে আপোনাৰ <xliff:g id="OTHER_APP">%1$s</xliff:g> কলটোৰ অন্ত পৰিব।"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"এই কলটো কেনেকৈ কৰা হ’ব সেয়া বাছনি কৰক"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ব্যৱহাৰ কৰি কল ৰিডাইৰেক্ট কৰক"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"স্পীকাৰ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"বাহ্যিক"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"অজ্ঞাত"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"অন্য এটা ডিভাইচলৈ অডিঅ’ ষ্ট্ৰীম কৰি থকা হৈছে"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"কলটো কাটি দিয়ক"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ইয়াত সলনি কৰক"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index d2368fa..ead7f54 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Arxa fon zəngləri"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Kəsilmiş zənglər"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Tətbiq xətaları"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Zəng yayımı"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Bu zəngin yerləşdirilməsi <xliff:g id="OTHER_APP">%1$s</xliff:g> zəngini sonlandıracaq."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Bu zəngi necə etməyi seçin"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> istifadə edərək zəngi yönləndirin"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Dinamik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Xarici"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Naməlum"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audio digər cihaza ötürülür"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Zəngi sonlandırın"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Buraya keçin"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index f77b0bb..d527842 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Pozivi u pozadini"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Prekinuti pozivi"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikacije za telefoniranje koje su otkazale"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Strimovanje poziva"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ako uputite ovaj poziv, završićete <xliff:g id="OTHER_APP">%1$s</xliff:g> poziv."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Izaberite kako želite da uputite ovaj poziv"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Preusmeri poziv pomoću: <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Zvučnik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Eksterni"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Nepoznato"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Zvuk se strimuje na drugi uređaj"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Prekini vezu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Prebaci ovde"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 8560c9c..c5b59bd 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Фонавыя выклікі"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Перарваныя выклікі"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Збоі ў праграмах \"Тэлефон\""</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Перадача выкліку плынню"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Калі зрабіць гэты выклік, ваш выклік праз праграму <xliff:g id="OTHER_APP">%1$s</xliff:g> скончыцца."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Выберыце, праз які нумар зрабіць выклік"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Перанакіраваць выклік, выкарыстоўваючы нумар \"<xliff:g id="OTHER_APP">%1$s</xliff:g>\""</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Знешні дынамік"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Знешняя прылада"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Невядома"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Перадача аўдыя плынню на іншую прыладу"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Завяршыць выклік"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Пераключыцца"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index c99dcd0..fe5d70f 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Обаждания на заден план"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Прекъснати обаждания"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Приложения за телефон с прекъсната работа"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Поточно предаване на обаждания"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ако извършите това обаждане, обаждането ви през <xliff:g id="OTHER_APP">%1$s</xliff:g> ще прекъсне."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Изберете как да се извърши обаждането"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Пренасочване на обаждането през <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Високоговорител"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Външно"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Неизвестно"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Звукът се предава поточно към друго устройство"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Затваряне"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Превключете тук"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 01b67f0..49e6ba3 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ব্যাকগ্রাউন্ডের কল"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ডিসকানেক্ট করা কলগুলি"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ক্র্যাশ হওয়া ফোন অ্যাপ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"কল স্ট্রিম করা হচ্ছে"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"এই কলটির উত্তর দেওয়া হলে তা আপনার <xliff:g id="OTHER_APP">%1$s</xliff:g> কলটি কেটে যাবে৷"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"এই কলটি কীভাবে করবেন বেছে নিন"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ব্যবহার করে কল রিডাইরেক্ট করুন"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"স্পিকার"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"এক্সটার্নাল"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"অজানা"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"অন্য ডিভাইসে অডিও স্ট্রিম করা হচ্ছে"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"কল কেটে দিন"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"এখানে পাল্টান"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 201d8d1..61b86db 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Pozivi u pozadini"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Prekinuti pozivi"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Padovi aplikacija za telefon"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Prijenos poziva"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Upućivanje ovog poziva će prekinuti poziv: <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Odaberite kako želite uputiti ovaj poziv"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Preusmjeri poziv pomoću aplikacije <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Zvučnik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Vanjski"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Nepoznato"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Prijenos zvuka na drugom uređaju"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Prekini vezu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Prebaci ovdje"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 2c5727d..113d144 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Trucades en segon pla"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Trucades desconnectades"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplicacions del telèfon que han fallat"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Reproducció en directe de trucada"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"En fer aquesta trucada, finalitzarà la de l\'aplicació <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Tria com vols fer aquesta trucada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Desvia la trucada amb <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Altaveu"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Extern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Desconegut"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"S\'està reproduint àudio en continu en un altre dispositiu"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Penja"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Canvia aquí"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 2945d28..ab74d61 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Hovory na pozadí"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Odpojené hovory"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikace, které spadly"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streamování hovoru"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Uskutečněním tohoto hovoru ukončíte hovor <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Vyberte, jak chcete tento hovor provést"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Přesměrovat hovor přes aplikaci <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Reproduktor"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externí"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Není známo"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streamování zvuku do druhého zařízení"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Zavěsit"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Přepnout sem"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 366b584..fff7257 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Opkald i baggrunden"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Afbrudte opkald"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Opkaldsapps, der er gået ned"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Opkaldsstreaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Hvis du foretager dette opkald, afsluttes dit opkald i <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Vælg, hvordan du vil foretage dette opkald"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Omdiriger opkaldet ved hjælp af <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Højttaler"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ekstern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Ukendt"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streamer lyd til en anden enhed"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Læg på"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Skift hertil"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 801321b..dccdb87 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Anrufe im Hintergrund"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Beendete Anrufe"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Abgestürzte Telefon-Apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Anrufstreaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Durch diesen Anruf wird der Anruf in <xliff:g id="OTHER_APP">%1$s</xliff:g> beendet."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Wie möchtest du anrufen?"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Mit <xliff:g id="OTHER_APP">%1$s</xliff:g> weiterleiten"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Lautsprecher"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Extern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unbekannt"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audio auf einem anderen Gerät streamen"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Anruf beenden"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Auf dieses Gerät wechseln"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 7a09f0a..2cf961d 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Κλήσεις στο παρασκήνιο"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Αποσυνδεδεμένες κλήσεις"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Εφαρμογές τηλεφώνου που αντιμετώπισαν σφάλμα λειτουργίας"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Ροή κλήσης"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Εάν πραγματοποιήσετε αυτήν την κλήση, η κλήση σας μέσω <xliff:g id="OTHER_APP">%1$s</xliff:g> θα τερματιστεί."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Επιλέξτε πώς θα πραγματοποιήσετε την κλήση"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Ανακατεύθυνση της κλήσης μέσω <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Ηχείο"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Εξωτερικά"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Άγνωστο"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Ροή ήχου σε άλλη συσκευή"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Απόρριψη"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Εναλλαγή εδώ"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 0249401..250ab62 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Background calls"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Disconnected calls"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Crashed phone apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Call streaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Placing this call will end your <xliff:g id="OTHER_APP">%1$s</xliff:g> call."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choose how to make this call"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirect call using <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unknown"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio to other device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Switch here"</string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 5f857c1..e6291f4 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Background calls"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Disconnected calls"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Crashed phone apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Call streaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Placing this call will end your <xliff:g id="OTHER_APP">%1$s</xliff:g> call."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choose how to place this call"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirect call using <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unknown"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio to other device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Switch here"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 0249401..250ab62 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Background calls"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Disconnected calls"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Crashed phone apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Call streaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Placing this call will end your <xliff:g id="OTHER_APP">%1$s</xliff:g> call."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choose how to make this call"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirect call using <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unknown"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio to other device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Switch here"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 0249401..250ab62 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Background calls"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Disconnected calls"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Crashed phone apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Call streaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Placing this call will end your <xliff:g id="OTHER_APP">%1$s</xliff:g> call."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choose how to make this call"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirect call using <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unknown"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio to other device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Switch here"</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 2ffae87..5bd0e25 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Background calls"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Disconnected calls"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Crashed phone apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Call streaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Placing this call will end your <xliff:g id="OTHER_APP">%1$s</xliff:g> call."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choose how to place this call"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirect call using <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Unknown"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio to other device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Switch here"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index ab8f454..c0f4e17 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Llamadas en segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Llamadas desconectadas"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Apps de teléfono con fallas"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Transmisión de llamadas"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Si realizas esta llamada, finalizará la de <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Elige cómo quieres realizar esta llamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redireccionar la llamada mediante <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Bocina"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externa"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Desconocido"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Transmitiendo el audio a otro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Colgar"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Cambiar aquí"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 65ab627..20b80a5 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Llamadas en segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Llamadas interrumpidas"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplicaciones para teléfonos con fallos"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Transmisión de llamadas"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Si haces esta llamada, se finalizará la de <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Elige cómo quieres hacer esta llamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirigir llamada con <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Altavoz"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Fuentes externas"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Desconocido"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Transmitiendo audio a otro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Colgar"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Cambiar aquí"</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 7d9ad7b..cac1fd6 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Taustal olevad kõned"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Katkestatud kõned"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Kokkujooksnud telefonirakendused"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Kõne voogesitus"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Selle kõne tegemisel lõpetatakse pooleliolev kõne rakenduses <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Valige, kuidas soovite helistada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Suuna kõne ümber rakenduse <xliff:g id="OTHER_APP">%1$s</xliff:g> abil"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Kõlar"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Välised"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Teadmata"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Heli voogesitamine teise seadmesse"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Lõpeta kõne"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Vaheta siia"</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 64645a4..d1aa545 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -47,7 +47,7 @@
<string name="respond_via_sms_failure_format" msgid="5198680980054596391">"Ezin izan da bidali mezua <xliff:g id="PHONE_NUMBER">%s</xliff:g> zenbakira."</string>
<string name="enable_account_preference_title" msgid="6949224486748457976">"Deiak egiteko kontuak"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"Larrialdi-deiak bakarrik egin daitezke."</string>
- <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"Aplikazioak deitu ahal izan dezan, telefonoaren eginbidea erabiltzeko baimena behar du."</string>
+ <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"Aplikazioak irteerako deiak egin ahal izan ditzan, telefonoaren eginbidea erabiltzeko baimena behar du."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"Deitzeko, idatzi balio duen zenbaki bat."</string>
<string name="duplicate_video_call_not_allowed" msgid="5754746140185781159">"Une honetan ezin da deirik gehitu."</string>
<string name="no_vm_number" msgid="2179959110602180844">"Erantzungailuaren zenbakia falta da"</string>
@@ -94,12 +94,13 @@
<string name="cant_call_due_to_ongoing_call" msgid="8004235328451385493">"Ezin da egin deia, beste dei bat abian delako <xliff:g id="OTHER_CALL">%1$s</xliff:g> zerbitzuan."</string>
<string name="cant_call_due_to_ongoing_calls" msgid="6379163795277824868">"Ezin da egin deia, beste dei batzuk abian direlako <xliff:g id="OTHER_CALL">%1$s</xliff:g> zerbitzuan."</string>
<string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"Ezin da egin deia, beste dei bat abian delako beste aplikazio batean."</string>
- <string name="notification_channel_incoming_call" msgid="5245550964701715662">"Jasotako deiak"</string>
+ <string name="notification_channel_incoming_call" msgid="5245550964701715662">"Sarrerako deiak"</string>
<string name="notification_channel_missed_call" msgid="7168893015283909012">"Dei galduak"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"Deiak blokeatzeko aukera"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Atzeko planoko deiak"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Deskonektatutako deiak"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Huts egin duten telefonoko aplikazioak"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Deiak igortzea"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Dei hau egiten baduzu, amaitu egingo da <xliff:g id="OTHER_APP">%1$s</xliff:g> aplikazioko deia."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Aukeratu dei hau egiteko modua"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Birbideratu deia <xliff:g id="OTHER_APP">%1$s</xliff:g> aplikazioaren bidez"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Bozgorailua"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Kanpokoa"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Ezezaguna"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audioa beste gailu batera igortzen ari da"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Amaitu deia"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Aldatu hona"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 83c8034..8d562ec 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"تماسهای پسزمینه"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"تماسهای قطعشده"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"برنامههای تلفن خراب"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"جاریسازی تماس"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"اگر این تماس را برقرار کنید، تماس <xliff:g id="OTHER_APP">%1$s</xliff:g> شما قطع میشود."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"انتخاب نحوه برقراری این تماس"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"هدایت تماس با استفاده از <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"بلندگو"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"خارجی"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"نامشخص"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"درحال جاریسازی صدا به دستگاه دیگر"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"قطع تماس"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"انتقال در اینجا انجام شود"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 4ade7d1..338e429 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Taustapuhelut"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Katkaistut puhelut"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Kaatuneet puhelinsovellukset"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Puhelunstriimaus"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Tämän puhelun soittaminen päättää puhelun sovelluksessa <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Valitse, miten puhelu soitetaan"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Uudelleenohjaa puhelu sovelluksella <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Kaiutin"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ulkoinen"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Tuntematon"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audiota striimataan toiselle laitteelle"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Lopeta puhelu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Vaihda puhelimeen"</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 95b2069..aaf651f 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Appels en arrière-plan"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Appels déconnectés"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Applications téléphoniques qui ont planté"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Diffusion en continu d\'appels"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Si vous passez cet appel, vous mettrez fin à l\'appel <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choisissez comment passer cet appel"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Rediriger l\'appel en utilisant <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Haut-parleur"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externe"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Inconnu"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Diffusion audio en continu vers un autre appareil en cours…"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Raccrocher"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Revenir à cet appareil"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 03f6d87..a14cbb1 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Appels en arrière-plan"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Appels interrompus"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Applications téléphoniques ayant planté"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming de l\'appel"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Si vous passez cet appel, vous mettrez fin à celui qui est en cours dans l\'application <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choisissez comment passer cet appel"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Rediriger l\'appel avec <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Haut-parleur"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externe"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Inconnu"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming de l\'audio sur un autre appareil"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Raccrocher"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Passer ici"</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index a8443dd..8e82fce 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Chamadas en segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Chamadas desconectadas"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Fallaron as aplicacións de teléfono"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Propagación de chamada"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ao facer esta chamada, finalizarase o túa chamada de <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Escolle como facer esta chamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirixir a chamada con <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Altofalante"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externo"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Descoñecido"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Emitindo audio noutro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Colgar"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Volver aquí"</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 883ce52..1b5c5ce 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"બૅકગ્રાઉન્ડ કૉલ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ડિસ્કનેક્ટ કરેલા કૉલ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ફોન ઍપ ક્રૅશ થઈ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"કૉલ સ્ટ્રીમ કરી રહ્યાં છીએ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"આ કૉલ કરવાથી તમારો <xliff:g id="OTHER_APP">%1$s</xliff:g> કૉલ સમાપ્ત થઈ જશે."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"આ કૉલ કેવી રીતે કરવો તે પસંદ કરો"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g>નો ઉપયોગ કરીને કૉલ રીડાયરેક્ટ કરો"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"સ્પીકર"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"બાહ્ય"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"અજાણ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ઑડિયોને અન્ય ડિવાઇસ પર સ્ટ્રીમ કરી રહ્યાં છીએ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"સમાપ્ત કરો"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"અહીં સ્વિચ કરો"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 918051a..c32f582 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"बैकग्राउंड कॉल"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"डिसकनेक्ट किए गए कॉल"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"फ़ोन ऐप्लिकेशन जो बंद हो गए"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"कॉल स्ट्रीमिंग"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"इस कॉल को करने से आपका <xliff:g id="OTHER_APP">%1$s</xliff:g> कॉल खत्म हो जाएगा."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"चुनें कि आप इस कॉल को कैसे करना चाहते हैं"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> का इस्तेमाल करके कॉल को दूसरे नंबर पर भेजें"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"स्पीकर"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"बाहरी सोर्स"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"कोई जानकारी नहीं है"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ऑडियो को दूसरे डिवाइस पर स्ट्रीम किया जा रहा है"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"कॉल खत्म करें"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"यहां स्विच करें"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 02c91fb..d6b209e 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Pozivi u pozadini"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Prekinuti pozivi"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Rušenja aplikacija telefona"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming poziva"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Upućivanjem ovog poziva prekinut ćete poziv u aplikaciji <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Odaberite kako ćete uputiti poziv"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Preusmjeri poziv putem aplikacije <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Zvučnik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Vanjski izvori"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Nepoznato"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming zvuka na drugi uređaj"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Prekini vezu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Promijeni ovdje"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index cdda34a..63f04b6 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Háttérbeli hívások"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Bontott hívások"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Telefonalkalmazások összeomlása"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Hívás átvitele"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ha hívást indít, azzal megszakítja a(z) <xliff:g id="OTHER_APP">%1$s</xliff:g>-hívást."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"A hívás módjának kiválasztása"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Hívás átirányítása a következővel: <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Hangszóró"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Külső"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Ismeretlen"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Hang átvitele másik eszközre"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Hívás befejezése"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Váltás itt"</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index d85d037..169ea36 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Ֆոնային զանգեր"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Անջատված զանգեր"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Հեռախոսի հավելվածներ, որոնց աշխատանքը սխալի պատճառով խափանվել է"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Զանգի հեռարձակում"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Այս զանգը կատարելու դեպքում <xliff:g id="OTHER_APP">%1$s</xliff:g>-ի ընթացիկ զանգը կընդհատվի"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Ընտրեք, թե ինչպես եք ուզում կատարել այս զանգը"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Վերահասցեավորել զանգը <xliff:g id="OTHER_APP">%1$s</xliff:g> հավելվածով"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Բարձրախոս"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Արտաքին"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Անհայտ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Աուդիոյի հեռարձակում այլ սարքում"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Ավարտել զանգը"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Անցնել այստեղ"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 84c0d39..1e51f7a 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Panggilan telepon latar belakang"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Panggilan terputus"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikasi telepon error"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming panggilan"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Melakukan panggilan ini akan mengakhiri panggilan <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Pilih cara melakukan panggilan ini"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Alihkan panggilan menggunakan <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Eksternal"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Tidak diketahui"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio ke perangkat lain"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Akhiri"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Beralih ke sini"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index db7dbeb..7009b7c 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Bakgrunnssímtöl"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Aftengd símtöl"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Hrun í símaforritum"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Símtal í streymi"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ef þú hringir mun þessu símtali í <xliff:g id="OTHER_APP">%1$s</xliff:g> ljúka."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Veldu hvernig hringt er"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Framsenda símtal með <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Hátalari"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ytra tæki"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Óþekkt"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streymir hljóði í annað tæki"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Leggja á"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Skipta hingað"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index ad070d6..4a17d18 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Chiamate in sottofondo"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Chiamate disconnesse"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"App per telefono arrestate in modo anomalo"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming chiamata"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Se effettui questa chiamata, la chiamata di <xliff:g id="OTHER_APP">%1$s</xliff:g> verrà terminata."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Scegli come effettuare questa chiamata"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Reindirizza la chiamata utilizzando <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Vivavoce"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Esterno"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Sconosciuto"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio all\'altro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Riaggancia"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Passa qui"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index d557599..05ec712 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"שיחות ברקע"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"שיחות שנותקו"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"אפליקציות טלפון שקרסו"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"העברת השיחה"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ביצוע השיחה הזו יסיים את השיחה ב-<xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"איך להתקשר?"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"ניתוב דרך <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"רמקול"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"מכשיר חיצוני"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"לא ידוע"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"הקול מושמע במכשיר אחר"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ניתוק"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"העברת השיחה בחזרה לטלפון"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 73b85d9..19387ff 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"バックグラウンドでの通話"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"通話の切断"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"通話アプリがクラッシュしたとき"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"通話ストリーミング"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"この通話を発信すると、<xliff:g id="OTHER_APP">%1$s</xliff:g> の通話が終了します。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"通話の発信方法を選択してください"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> を使用して通話をリダイレクト"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"スピーカー"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"外部"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"不明"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"他のデバイスに音声をストリーミングしています"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"通話を終了"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"このデバイスに切り替える"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 33c5a47..d56873f 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ზარები ფონში"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"გათიშული ზარები"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ავარიულად გათიშული ტელეფონის აპები"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ზარის სტრიმინგი"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ამ ზარის განხორციელება თქვენს <xliff:g id="OTHER_APP">%1$s</xliff:g> ზარს დაასრულებს."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"აირჩიეთ, როგორ განათავსოთ ეს ზარი"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"ზარის გადამისამართება <xliff:g id="OTHER_APP">%1$s</xliff:g>-ის გამოყენებით"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"დინამიკი"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"გარე"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"უცნობი"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"მიმდინარეობს აუდიოს სტრიმინგი სხვა მოწყობილობაზე"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"გათიშვა"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"გადართვა"</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 29fdc4a..628b440 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Фондық қоңыраулар"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Ажыратылған қоңыраулар"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Бұзылған телефон қолданбалары"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Қоңырауды трансляциялау"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Жаңа қоңырау шалу <xliff:g id="OTHER_APP">%1$s</xliff:g> қоңырауын тоқтатады."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Қоңырау шалу әдісін таңдаңыз."</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Қоңырау бағытын <xliff:g id="OTHER_APP">%1$s</xliff:g> арқылы ауыстыру"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Динамик"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Сыртқы"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Белгісіз"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Аудионы басқа құрылғыға трансляциялау"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Қоңырауды аяқтау"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Осы жерде ауысу"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 64e47ef..1c28d37 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ការហៅនៅផ្ទៃខាងក្រោយ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ការហៅទូរសព្ទដែលបានផ្ដាច់"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"កម្មវិធីទូរសព្ទគាំង"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"មុខងារផ្សាយការហៅទូរសព្ទ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ការហៅទូរសព្ទនេះ នឹងបញ្ចប់ការហៅ <xliff:g id="OTHER_APP">%1$s</xliff:g> របស់អ្នក។"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ជ្រើសរើសរបៀបធ្វើការហៅទូរសព្ទនេះ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"បញ្ជូនការហៅទូរសព្ទបន្តដោយប្រើប្រាស់ <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ឧបករណ៍បំពងសំឡេង"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ខាងក្រៅ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"មិនស្គាល់"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"កំពុងផ្សាយសំឡេងទៅឧបករណ៍ផ្សេងទៀត"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"បញ្ចប់ការហៅទូរសព្ទ"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ប្ដូរនៅទីនេះ"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 68d8078..cbaa203 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ಹಿನ್ನೆಲೆ ಕರೆಗಳು"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಕರೆಗಳು"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ಕ್ರ್ಯಾಶ್ ಆಗಿರುವ ಫೋನ್ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ಕರೆ ಸ್ಟ್ರೀಮಿಂಗ್"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ಈ ಕರೆಯನ್ನು ಮಾಡುವುದರಿಂದ ನಿಮ್ಮ <xliff:g id="OTHER_APP">%1$s</xliff:g> ಕರೆಯು ಅಂತ್ಯಗೊಳ್ಳುತ್ತದೆ."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ಈ ಕರೆ ಮಾಡುವುದು ಹೇಗೆ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ಬಳಸಿಕೊಂಡು ಕರೆಯನ್ನು ಮರುನಿರ್ದೇರ್ಶಿಸಿ"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ಸ್ಪೀಕರ್"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ಬಾಹ್ಯ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ಅಪರಿಚಿತ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ಇತರ ಸಾಧನಕ್ಕೆ ಆಡಿಯೊವನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ಹ್ಯಾಂಗ್ ಅಪ್"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ಇಲ್ಲಿಗೆ ಬದಲಾಯಿಸಿ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 6b4c2f1..dc793e3 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"백그라운드 통화"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"연결 해제된 통화"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"다운된 전화 앱"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"통화 스트리밍"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"이 전화를 걸면 현재 <xliff:g id="OTHER_APP">%1$s</xliff:g>에서 진행 중인 통화가 종료됩니다."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"전화 걸 방법 선택"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> 앱으로 전화 리디렉션"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"스피커"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"외부"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"알 수 없음"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"다른 기기로 오디오 스트리밍"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"전화 끊기"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"현재 기기로 전환"</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index aa8ce3e..43def8b 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Фондогу чалуулар"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Ажыратылган чалуулар"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Катадан улам иштебей калган телефон колдонмолору"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Чалууну берүү"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Эгер чалып баштасаңыз, <xliff:g id="OTHER_APP">%1$s</xliff:g> чалууңуз аяктайт."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Чалуу жолун тандаңыз"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> аркылуу чалуу багытын буруу"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Динамик"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Тышкы"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Белгисиз"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Аудио башка түзмөккө берилүүдө"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Чалууну бүтүрүү"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Бул жерге которулуу"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 45c2b70..ff79144 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ການໂທໃນພື້ນຫຼັງ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ສາຍຖືກຕັດແລ້ວ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ແອັບໂທລະສັບຂັດຂ້ອງ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ການສະຕຣີມການໂທ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ການໂທສາຍນີ້ຈະເປັນການສິ້ນສຸດສາຍ <xliff:g id="OTHER_APP">%1$s</xliff:g> ຂອງທ່ານ."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ເລືອກວິທີໂທສາຍນີ້"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"ປ່ຽນເສັ້ນທາງການໂທໂດຍໃຊ້ <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ລຳໂພງ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ພາຍນອກ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ສະຕຣີມສຽງໄປໃສ່ອຸປະກອນອື່ນ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ວາງສາຍ"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ສະຫຼັບບ່ອນນີ້"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 5e8b1f2..9454431 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Skambučiai fone"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Skambučiai atjungti"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Užstrigusios telefono programos"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Srautinis skambučio perdavimas"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Atliekant šį skambutį bus užbaigtas „<xliff:g id="OTHER_APP">%1$s</xliff:g>“ skambutis."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Pasirinkite, kaip norite skambinti"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Peradresuoti skambutį naudojant programą „<xliff:g id="OTHER_APP">%1$s</xliff:g>“"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Garsiakalbis"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Išoriniai šaltiniai"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Nežinoma"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Srautinis garso perdavimas į kitą įrenginį"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Baigti skambutį"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Perjungti čia"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 0433037..5ebdd8e 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Sarunas fonā"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Pārtrauktie zvani"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Avarējušās tālruņa lietotnes"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Zvana straumēšana"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Veicot šo zvanu, tiks beigts zvans lietotnē <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Izvēlieties, kā veikt šo zvanu"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Novirzīt zvanu, izmantojot lietotni <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Skaļrunis"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ārēja ierīce"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Nezināma ierīce"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Notiek audio straumēšana uz citu ierīci."</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Beigt zvanu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Pārslēgties šeit"</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 4873380..57a3fce 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Повици во заднина"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Прекинати повици"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Паднати апликации за телефон"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Стримување повик"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ако се воспостави повиков, вашиот повик на <xliff:g id="OTHER_APP">%1$s</xliff:g> ќе заврши."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Изберете како да се воспостави повиков"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Пренасочи го повикот со <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -109,7 +110,7 @@
<string name="phone_settings_number_not_in_contact_txt" msgid="2602249106007265757">"Броеви што не се наведени во „Контакти“"</string>
<string name="phone_settings_number_not_in_contact_summary_txt" msgid="963327038085718969">"Блокирани броеви што не се наведени во вашите „Контакти“"</string>
<string name="phone_settings_private_num_txt" msgid="6339272760338475619">"Приватно"</string>
- <string name="phone_settings_private_num_summary_txt" msgid="6755758240544021037">"Блокирај повикувачи со сокриен број"</string>
+ <string name="phone_settings_private_num_summary_txt" msgid="6755758240544021037">"Блокирај повикувачи со скриен број"</string>
<string name="phone_settings_payphone_txt" msgid="5003987966052543965">"Телефонска говорница"</string>
<string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"Блокирај повици од телефонски говорници"</string>
<string name="phone_settings_unknown_txt" msgid="3577926178354772728">"Непознато"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Звучник"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Надворешно"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Непознато"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Звукот се стримува на друг уред"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Спушти"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Префрли овде"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 9e6b8ca..a6d1626 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"പശ്ചാത്തല കോളുകൾ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"വിച്ഛേദിക്കപ്പെട്ട കോളുകൾ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ക്രാഷായ ഫോൺ ആപ്പുകൾ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"കോൾ സ്ട്രീമിംഗ്"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ഈ കോൾ ചെയ്യുന്നത് നിങ്ങളുടെ <xliff:g id="OTHER_APP">%1$s</xliff:g> കോൾ അവസാനിക്കാനിടയാക്കും."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ഈ കോൾ എങ്ങനെ ചെയ്യണമെന്ന് തിരഞ്ഞെടുക്കുക"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ഉപയോഗിച്ച് കോൾ റീഡയറക്റ്റ് ചെയ്യുക"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"സ്പീക്കർ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"എക്സ്റ്റേണൽ സ്ട്രീമിംഗ്"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"അജ്ഞാതം"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ഓഡിയോ മറ്റൊരു ഉപകരണത്തിലേക്ക് സ്ട്രീം ചെയ്യുന്നു"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"മാറ്റി വയ്ക്കുക"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ഇവിടേക്ക് മാറുക"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 2c90998..70dde8a 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Арын дуудлагууд"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Салсан дуудлагууд"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Гэмтсэн гар утасны аппууд"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Дуудлага дамжуулах"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Энэ дуудлагыг хийснээр таны <xliff:g id="OTHER_APP">%1$s</xliff:g> дуудлагыг дуусгана."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Энэ дуудлагыг хэрхэн хийхийг сонгох"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g>-г ашиглан дуудлагыг дахин чиглүүлэх"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Чанга яригч"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Гадны"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Тодорхойгүй"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Бусад төхөөрөмж рүү аудио дамжуулж байна"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Таслах"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Ийшээ сэлгэх"</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 263433d..c4438ae 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"बॅकग्राउंड कॉल"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"डिस्कनेक्ट केलेले कॉल"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"क्रॅश झालेली फोन ॲप्स"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"कॉल स्ट्रीमिंग"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"हा कॉल केल्याने तुमचा <xliff:g id="OTHER_APP">%1$s</xliff:g> कॉल समाप्त होईल."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"हा कॉल कसा करायचा ते निवडा"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> वापरून कॉल रीडिरेक्ट करा"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"स्पीकर"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"बाह्य"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"अज्ञात"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ऑडिओ हा दुसऱ्या डिव्हाइसवर स्ट्रीम करत आहे"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"बंद करा"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"येथे स्विच करा"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 4a8d554..355502c 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Panggilan latar belakang"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Panggilan diputuskan sambungan"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikasi telefon yang ranap"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Penstriman panggilan"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Membuat panggilan ini akan menamatkan panggilan <xliff:g id="OTHER_APP">%1$s</xliff:g> anda."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Pilih cara untuk membuat panggilan ini"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Ubah hala panggilan menggunakan <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Pembesar suara"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Luaran"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Tidak diketahui"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Penstriman audio pada peranti lain"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Tamatkan panggilan"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Tukar di sini"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 3511bca..9ead5f4 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"နောက်ခံမှ ခေါ်ဆိုမှုများ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ပြတ်တောက်သွားသည့် ခေါ်ဆိုမှုများ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ရပ်တန့်သွားသော ဖုန်းအက်ပ်များ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ခေါ်ဆိုမှု တိုက်ရိုက်လွှင့်ခြင်း"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ဤခေါ်ဆိုမှု ပြုလုပ်ပါက <xliff:g id="OTHER_APP">%1$s</xliff:g> သုံးပြီးပြောနေခြင်းကို ဖြတ်ပစ်ပါမည်။"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ဤခေါ်ဆိုမှု ပြုလုပ်ပုံကို ရွေးချယ်ပါ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"ခေါ်ဆိုမှုကို <xliff:g id="OTHER_APP">%1$s</xliff:g> ဖြင့် တစ်ဆင့်ပြန်ညွှန်ရန်"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"စပီကာ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ပြင်ပ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"မသိ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"အသံကို အခြားစက်တွင် တိုက်ရိုက်လွှင့်နေသည်"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ဖုန်းချရန်"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ဤနေရာသို့ လွှဲပြောင်းရန်"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index fb4dc97..8bebbff 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Bakgrunnsanrop"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Frakoblede anrop"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Telefonapper som har krasjet"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Anropsstrømming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Samtalen din i <xliff:g id="OTHER_APP">%1$s</xliff:g> avsluttes hvis du foretar dette anropet."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Velg hvordan du vil ringe"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Viderekoble anropet med <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Høyttaler"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ekstern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Ukjent"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Strømmer lyden til en annen enhet"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Legg på"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Flytt hit"</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 8c02676..44645dc 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ब्याकग्राउन्डका कलहरू"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"विच्छेद गरिएका कल"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"फोनमा रहेका क्र्यास भएका एपहरू"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"कल स्ट्रिमिङ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"यो कल गर्नुले तपाईंको <xliff:g id="OTHER_APP">%1$s</xliff:g> कल अन्त्य गर्दछ।"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"यो कल गर्ने तरिका छनौट गर्नुहोस्"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> प्रयोग गरी कल रिडाइरेक्ट गर्नुहोस्"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"स्पिकर"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"बाह्य"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"अज्ञात"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"अर्को डिभाइसमा अडियो स्ट्रिम गरिँदै छ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"कल काट्नुहोस्"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"यहाँ गई बदल्नुहोस्"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 726ab60..8dfee81 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Achtergrondgesprekken"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Beëindigde gesprekken"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Gecrashte telefoon-apps"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Oproepstreaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Als je dit gesprek start, wordt je <xliff:g id="OTHER_APP">%1$s</xliff:g>-gesprek beëindigd."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Kies hoe je dit gesprek wilt plaatsen"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Gesprek omleiden via <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Extern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Onbekend"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audio streamen naar ander apparaat"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Ophangen"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Hiernaartoe schakelen"</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index c25ec86..787711b 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ କଲ୍ଗୁଡ଼ିକ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ବିଚ୍ଛିନ୍ନ କରାଯାଇଥିବା କଲ୍ଗୁଡ଼ିକ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"କ୍ରାସ୍ ହୋଇଥିବା ଫୋନ୍ ଆପ୍ସ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"କଲ ଷ୍ଟ୍ରିମିଂ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ଏହି କଲ୍କୁ ସ୍ଥାପନ କରିବା ଦ୍ଵାରା ଆପଣଙ୍କର <xliff:g id="OTHER_APP">%1$s</xliff:g> କଲ୍ ସମାପ୍ତ ହୋଇଯିବ।"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ଏହି କଲ୍ କିପରି କରିବାକୁ ଚାହାନ୍ତି ବାଛନ୍ତୁ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ବ୍ୟବହାର କରି କଲ୍ ରିଡାଇରେକ୍ଟ କରନ୍ତୁ"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ସ୍ପିକର"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ଏକ୍ସଟର୍ନଲ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ଅଜଣା"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ଅନ୍ୟ ଡିଭାଇସରେ ଅଡିଓ ଷ୍ଟ୍ରିମ କରାଯାଉଛି"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"କଲ ସମାପ୍ତ କରନ୍ତୁ"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ଏଠାରେ ସୁଇଚ କରନ୍ତୁ"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 65073e2..b96a1db 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ਬੈਕਗ੍ਰਾਊਂਡ ਕਾਲਾਂ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ਡਿਸਕਨੈਕਟ ਕੀਤੀਆਂ ਕਾਲਾਂ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ਕ੍ਰੈਸ਼ ਹੋਈਆਂ ਫ਼ੋਨ ਐਪਾਂ"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ਕਾਲ ਸਟ੍ਰੀਮਿੰਗ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ਇਹ ਕਾਲ ਕਰਨ ਨਾਲ ਤੁਹਾਡੀ <xliff:g id="OTHER_APP">%1$s</xliff:g> ਕਾਲ ਸਮਾਪਤ ਹੋ ਜਾਵੇਗੀ।"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ਚੁਣੋ ਕਿ ਕਾਲ ਕਿਵੇਂ ਕਰਨੀ ਹੈ"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕਾਲ ਰੀਡਾਇਰੈਕਟ ਕਰੋ"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ਸਪੀਕਰ"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ਬਾਹਰੀ"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ਅਗਿਆਤ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ਆਡੀਓ ਨੂੰ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ \'ਤੇ ਸਟ੍ਰੀਮ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ਕਾਲ ਸਮਾਪਤ ਕਰੋ"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ਇੱਥੇ ਸਵਿੱਚ ਕਰੋ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a10d29f..df5d29e 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Połączenia w tle"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Przerwane połączenia"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikacje telefoniczne po awarii"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Strumieniowanie połączenia"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Jeśli zadzwonisz, połączenie w aplikacji <xliff:g id="OTHER_APP">%1$s</xliff:g> zostanie zakończone."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Wybierz, jak chcesz zadzwonić"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Przekieruj połączenie za pomocą aplikacji <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Głośnik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Zewnętrzne"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Brak informacji"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Strumieniowanie dźwięku na inne urządzenie"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Rozłącz"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Przełącz tutaj"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 0b279b4..e68f3c8 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Chamadas em segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Chamadas desligadas"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Apps Telefone com falhas"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming de chamadas"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ao efetuar esta chamada, irá terminar a chamada na app <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Escolha como pretende efetuar esta chamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirecionar chamada através de <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Altifalante"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externo"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Desconhecido"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"A fazer stream de áudio para outro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Desligar"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Mudar aqui"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a5628c4..afb8eca 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Chamadas em segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Chamadas desconectadas"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Falha com os apps de telefone"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming de ligação"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Se você ligar agora, sua chamada será encerrada no <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Escolha como fazer esta chamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirecionar a chamada usando o <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Alto-falante"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externo"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Desconhecido"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Fazendo streaming de áudio para outro dispositivo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Desligar"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Mudar para este dispositivo"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 2332d4d..8e485d0 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Apeluri în fundal"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Apeluri deconectate"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplicații pentru telefon blocate"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streaming de apeluri"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Dacă inițiezi acest apel, cel din <xliff:g id="OTHER_APP">%1$s</xliff:g> va fi încheiat."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Alege cum vrei să inițiezi apelul"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirecționezi apelul folosind <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Difuzor"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Extern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Necunoscut"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streaming audio pe alt dispozitiv"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Încheie apelul"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Treci la alt cont aici"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 139108d..67ab2e9 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Фоновые вызовы"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Прекращенные вызовы"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Приложения для телефона, работа которых прекращена из-за ошибки"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Потоковая передача звонков"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Если вы начнете этот звонок, вызов в <xliff:g id="OTHER_APP">%1$s</xliff:g> будет завершен."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Выберите, как хотите позвонить."</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Перенаправить вызов с использованием <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Динамик"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Внешнее устройство"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Неизвестно"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Потоковая передача аудио на другое устройство"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Завершить"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Переключиться"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index e3faf49..71442e0 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"පසුබිම් ඇමතුම්"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"විසන්ධි කළ ඇමතුම්"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"බිඳ වැටුණු දුරකථන යෙදුම්"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"ඇමතුම් ප්රවාහය"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"මෙම ඇමතුම ගැනීම ඔබේ <xliff:g id="OTHER_APP">%1$s</xliff:g> ඇමතුම අවසන් කරනු ඇත."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"මෙම ඇමතුම ගන්නා ආකාරය තෝරන්න"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> භාවිතයෙන් ඇමතුම ප්රතියොමු කරන්න"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ස්පීකරය"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"බාහිර"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"නොදනී"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"වෙනත් උපාංගයකට ශ්රව්ය ප්රවාහ කිරීම"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"විසන්ධි කරන්න"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"මෙතැනට මාරු වෙන්න"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index f7606ec..a001130 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Hovory na pozadí"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Zrušené hovory"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Zrútené telefónne aplikácie"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Streamovanie hovoru"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ak uskutočníte tento hovor, hovor cez <xliff:g id="OTHER_APP">%1$s</xliff:g> bude ukončený."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Vyberte, ako chcete tento hovor uskutočniť"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Presmerovať hovor cez aplikáciu <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Reproduktor"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Externé"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Neznáme"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streamovanie zvuku do iného zariadenia"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Zložiť"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Prepnúť sem"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 138524b..994bc7e 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Klici v ozadju"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Prekinjeni klici"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Zrušene aplikacije za klicanje"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Pretočno predvajanje klicev"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Če opravite ta klic, bo končan klic prek aplikacije <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Izberite, kako želite opraviti klic"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Preusmeri klic z aplikacijo <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Zvočnik"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Zunanje"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Neznano"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Pretočno predvajanje zvoka v drugo napravo"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Prekini klic"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Preklopi sem"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 0a36a40..89ae852 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Telefonatat në sfond"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Telefonatat e shkëputura"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplikacionet e telefonit që kanë pësuar ndërprerje aksidentale"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Transmetimi i telefonatave"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Kryerja e kësaj telefonate do të mbyllë telefonatën tënde në <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Zgjidh se si do ta kryesh këtë telefonatë"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Ridrejtoje telefonatën duke përdorur <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Altoparlant"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"E jashtme"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"E panjohur"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Po transmetohet audioja te një pajisje tjetër"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Mbyll"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Ndërro këtu"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index b846841..1134380 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Позиви у позадини"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Прекинути позиви"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Апликације за телефонирање које су отказале"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Стримовање позива"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ако упутите овај позив, завршићете <xliff:g id="OTHER_APP">%1$s</xliff:g> позив."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Изаберите како желите да упутите овај позив"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Преусмери позив помоћу: <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Звучник"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Екстерни"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Непознато"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Звук се стримује на други уређај"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Прекини везу"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Пребаци овде"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index acc6dc6..c6f6ec9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Bakgrundssamtal"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Frånkopplade samtal"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Kraschade telefonappar"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Samtalsstreaming"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ringer du det här samtalet avslutas samtalet i <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Välj hur du vill ringa samtalet"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Omdirigera samtal med <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Högtalare"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Extern"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Okänd"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Streama ljud till en annan enhet"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Lägg på"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Koppla hit"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 84f7294..1b49990 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Simu za chinichini"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Simu zilizokatwa"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Programu za simu zilizoacha kufanya kazi"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Utiririshaji wa simu"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ukipiga simu hii, simu yako kwenye <xliff:g id="OTHER_APP">%1$s</xliff:g> itakatwa."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Chagua jinsi utakavyopiga simu hii"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Elekeza simu ukitumia <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Spika"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Ya nje"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Haijulikani"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Inatiririsha sauti kwenye kifaa kingine"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Kata simu"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Badili hapa"</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 18b5861..9f37d87 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"பின்னணி அழைப்புகள்"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"துண்டிக்கப்பட்ட அழைப்புகள்"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"சிதைவடைந்த மொபைல் ஆப்ஸ்"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"அழைப்பு ஸ்ட்ரீமிங்"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"புதிய அழைப்பைச் செய்தால், செயலில் உள்ள <xliff:g id="OTHER_APP">%1$s</xliff:g> அழைப்பு துண்டிக்கப்படும்."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"இந்த அழைப்பை எவ்வாறு மேற்கொள்ள வேண்டும் எனத் தேர்ந்தெடுக்கவும்"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g>ஐப் பயன்படுத்தி அழைப்பைத் திருப்பி விடு"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ஸ்பீக்கர்"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"வெளிப்புறச் சாதனம்"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"தெரியவில்லை"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"வேறு சாதனத்திற்கு ஆடியோவை ஸ்ட்ரீம் செய்கிறது"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"அழைப்பைத் துண்டி"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"இங்கே மாற்று"</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 5ed2ebe..8f8a23e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"బ్యాక్గ్రౌండ్ కాల్స్"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"డిస్కనెక్ట్ చేసిన కాల్స్"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"క్రాష్ అయిన ఫోన్ యాప్స్"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"కాల్ స్ట్రీమింగ్"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ఈ కాల్ చేయడం వలన మీ <xliff:g id="OTHER_APP">%1$s</xliff:g> కాల్ ముగుస్తుంది."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ఈ కాల్ ఎలా చేయాలో ఎంచుకోండి"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ఉపయోగించి కాల్ మళ్లించు"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"స్పీకర్"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"వెలుపలి"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"తెలియదు"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"ఆడియోను ఇతర పరికరానికి స్ట్రీమింగ్ చేయండి"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"ముగించండి"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"ఇక్కడకు స్విచ్ అవ్వండి"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 678af2d..b8dc9f0 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"การโทรในเบื้องหลัง"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"สายถูกตัด"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"แอปโทรศัพท์ขัดข้อง"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"การสตรีมการโทร"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"การโทรออกนี้จะวางสายใน <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"เลือกวิธีโทรออก"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"โอนสายโดยใช้ <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"ลำโพง"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"ภายนอก"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"ไม่ทราบ"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"กำลังสตรีมเสียงไปยังอุปกรณ์อื่นๆ"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"วางสาย"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"เปลี่ยนที่นี่"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 495c191..91e1b33 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Mga tawag sa background"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Nadiskonektang mga tawag"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Nag-crash na mga phone app"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Pag-stream ng tawag"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Tatapusin ng pagtawag na ito ang iyong tawag sa <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Piliin kung paano gagawin ang tawag na ito"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"I-redirect ang tawag gamit ang <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Speaker"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"External"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Hindi Alam"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Naka-stream ang audio sa ibang device"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Mag-hang up"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Lumipat dito"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 1309682..0aa2e20 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Arka plandaki aramalar"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Bağlantısı kesilen aramalar"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Kilitlenen telefon uygulamaları"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Görüşme aktarımı"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Bu çağrıyı yaptığınızda <xliff:g id="OTHER_APP">%1$s</xliff:g> çağrınız sona erecek."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Bu aramanın nasıl yapılacağını seçin"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> uygulamasını kullanarak aramayı yönlendir"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Hoparlör"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Harici"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Bilinmiyor"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Ses başka bir cihaza aktarılıyor"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Görüşmeyi bitir"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Buraya dön"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 7b81d25..a4d01d1 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Виклики у фоновому режимі"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Припинені виклики"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Збої в додатках для дзвінків"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Трансляція дзвінків"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Якщо здійснити цей виклик, буде завершено виклик у додатку <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Виберіть, як здійснити цей виклик"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Переспрямувати через додаток <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Гучний зв’язок"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Зовнішні джерела"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Невідомо"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Аудіо транслюється на інший пристрій"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Завершити"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Перевести сюди"</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 689828e..6649f42 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"پس منظر کی کالز"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"منقطع کالز"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"کریشڈ فون ایپس"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"کال اسٹریمنگ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"یہ کال کرنے سے <xliff:g id="OTHER_APP">%1$s</xliff:g> کال ختم ہو جائے گی۔"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"یہ کال کرنے کا طریقہ منتخب کریں"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> کے ذریعے کال کو ریڈائریکٹ کریں"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"اسپیکر"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"خارجی"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"نامعلوم"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"دوسرے آلے پر آڈیو کی سلسلہ بندی کی جا رہی ہے"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"منقطع کریں"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"یہاں سوئچ کریں"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 688b6a7..c6805ea 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Orqa fondagi chaqiruvlar"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Tugatilgan chaqiruvlar"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Ishdan chiqqan telefon ilovalari"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Chaqiruv translatsiyasi"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Bu qo‘ng‘iroqni amalga oshirsangiz, <xliff:g id="OTHER_APP">%1$s</xliff:g> qo‘ng‘irog‘i tugatiladi."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Telefon qilish usulini tanlang"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Chaqiruv <xliff:g id="OTHER_APP">%1$s</xliff:g> orqali qayta uzatilsin"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Karnay"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Tashqi"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Noaniq"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Audio translatsiyani boshqa qurilmaga olish"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Tugatish"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Shu yerga olish"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 0920d3b..5ae2e79 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Cuộc gọi trong nền"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Các cuộc gọi bị ngắt kết nối"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Các ứng dụng điện thoại bị lỗi"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Truyền trực tuyến cuộc gọi"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Thực hiện cuộc gọi này sẽ kết thúc cuộc gọi <xliff:g id="OTHER_APP">%1$s</xliff:g> của bạn."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Chọn cách thực hiện cuộc gọi này"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Chuyển hướng cuộc gọi bằng cách sử dụng <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Loa"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Bên ngoài"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Không xác định"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Đang truyền trực tuyến âm thanh tới thiết bị khác"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Kết thúc"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Chuyển đổi tại đây"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b926e55..071289e 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"后台通话"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"通话中断"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"手机应用崩溃"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"通话流式传输"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"拨打此电话将导致<xliff:g id="OTHER_APP">%1$s</xliff:g>通话结束。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"选择拨打此电话的方式"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"使用<xliff:g id="OTHER_APP">%1$s</xliff:g>转移呼叫"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"免提"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"外部"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"未知"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"将音频流式传输到其他设备"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"挂断"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"在此处切换"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index b422c73..0140f26 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"背景通話"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"已中斷的通話"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"當機的手機應用程式"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"串流通話"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"如果撥打此電話,你的 <xliff:g id="OTHER_APP">%1$s</xliff:g> 通話將會結束。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"選擇如何撥打此電話"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"使用「<xliff:g id="OTHER_APP">%1$s</xliff:g>」將通話重新導向"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"喇叭"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"外部"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"不明"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"正在串流音訊至其他裝置"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"結束通話"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"在這裡切換"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 21b8ae9..eeb98b5 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"背景通話"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"通話中斷"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"通話應用程式異常終止"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"通話串流"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"撥打這通電話將結束你的「<xliff:g id="OTHER_APP">%1$s</xliff:g>」通話。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"選擇撥打這通電話的方式"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"使用「<xliff:g id="OTHER_APP">%1$s</xliff:g>」轉接電話"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"喇叭"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"外部"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"不明"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"正在將音訊串流到其他裝置"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"掛斷"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"切換到這部裝置"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index fbde58b..faee0d9 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -100,6 +100,7 @@
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Amakholi angemuva"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Amakholi anqanyuliwe"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Izinhlelo zokusebenza ezikhubazekile zefoni"</string>
+ <string name="notification_channel_call_streaming" msgid="5100510699787538991">"Ukusakaza ikholi"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ukwenza le kholi kuzoqeda enye ikholi yakho ye-<xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Khetha ukuthi uyibeka kanjani le kholi"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Qondisa kabusha ikholi usebenzisa i-<xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
@@ -130,4 +131,7 @@
<string name="callendpoint_name_speaker" msgid="1971760468695323189">"Isipikha"</string>
<string name="callendpoint_name_streaming" msgid="2337595450408275576">"Okungaphandle"</string>
<string name="callendpoint_name_unknown" msgid="2199074708477193852">"Akwaziwa"</string>
+ <string name="call_streaming_notification_body" msgid="502216105683378263">"Sakaza umsindo kwenye idivayisi"</string>
+ <string name="call_streaming_notification_action_hang_up" msgid="7017663335289063827">"Beka phansi"</string>
+ <string name="call_streaming_notification_action_switch_here" msgid="3524180754186221228">"Shintsha lapha"</string>
</resources>
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 7b0b697..2454ba0 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -4499,6 +4499,7 @@
}
public void setStartFailCause(CallFailureCause cause) {
+ Log.i(this, "setStartFailCause: cause = %s; callId = %s", cause, this.getId());
mCallStateChangedAtomWriter.setStartFailCause(cause);
}
diff --git a/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java b/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java
new file mode 100644
index 0000000..43624a3
--- /dev/null
+++ b/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 com.android.server.telecom;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+import android.telecom.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Helper class used to keep track of the requested communication device within Telecom for audio
+ * use cases. Handles the set/clear communication use case logic for all audio routes (speaker, BT,
+ * headset, and earpiece). For BT devices, this handles switches between hearing aids, SCO, and LE
+ * audio (also takes into account switching between multiple LE audio devices).
+ */
+public class CallAudioCommunicationDeviceTracker {
+
+ // Use -1 indicates device is not set for any communication use case
+ private static final int sAUDIO_DEVICE_TYPE_INVALID = -1;
+ // Possible bluetooth audio device types
+ private static final Set<Integer> sBT_AUDIO_DEVICE_TYPES = Set.of(
+ AudioDeviceInfo.TYPE_BLE_HEADSET,
+ AudioDeviceInfo.TYPE_HEARING_AID,
+ AudioDeviceInfo.TYPE_BLUETOOTH_SCO
+ );
+ private AudioManager mAudioManager;
+ private BluetoothRouteManager mBluetoothRouteManager;
+ private int mAudioDeviceType = sAUDIO_DEVICE_TYPE_INVALID;
+ // Keep track of the locally requested BT audio device if set
+ private String mBtAudioDevice = null;
+
+ public CallAudioCommunicationDeviceTracker(Context context) {
+ mAudioManager = context.getSystemService(AudioManager.class);
+ }
+
+ public void setBluetoothRouteManager(BluetoothRouteManager bluetoothRouteManager) {
+ mBluetoothRouteManager = bluetoothRouteManager;
+ }
+
+ public boolean isAudioDeviceSetForType(int audioDeviceType) {
+ return mAudioDeviceType == audioDeviceType;
+ }
+
+ @VisibleForTesting
+ public void setTestCommunicationDevice(int audioDeviceType) {
+ mAudioDeviceType = audioDeviceType;
+ }
+
+ public void clearBtCommunicationDevice() {
+ if (mBtAudioDevice == null) {
+ Log.i(this, "No bluetooth device was set for communication that can be cleared.");
+ return;
+ }
+ // If mBtAudioDevice is set, we know a BT audio device was set for communication so
+ // mAudioDeviceType corresponds to a BT device type (e.g. hearing aid, SCO, LE).
+ clearCommunicationDevice(mAudioDeviceType);
+ }
+
+ /*
+ * Sets the communication device for the passed in audio device type, if it's available for
+ * communication use cases. Tries to clear any communication device which was previously
+ * requested for communication before setting the new device.
+ * @param audioDeviceTypes The supported audio device types for the device.
+ * @param btDevice The bluetooth device to connect to (only used for switching between multiple
+ * LE audio devices).
+ * @return {@code true} if the device was set for communication, {@code false} if the device
+ * wasn't set.
+ */
+ public boolean setCommunicationDevice(int audioDeviceType,
+ BluetoothDevice btDevice) {
+ // There is only one audio device type associated with each type of BT device.
+ boolean isBtDevice = sBT_AUDIO_DEVICE_TYPES.contains(audioDeviceType);
+ Log.i(this, "setCommunicationDevice: type = %s, isBtDevice = %s, btDevice = %s",
+ audioDeviceType, isBtDevice, btDevice);
+
+ // Account for switching between multiple LE audio devices.
+ boolean handleLeAudioDeviceSwitch = btDevice != null
+ && !btDevice.getAddress().equals(mBtAudioDevice);
+ if ((audioDeviceType == mAudioDeviceType
+ || isUsbHeadsetType(audioDeviceType, mAudioDeviceType))
+ && !handleLeAudioDeviceSwitch) {
+ Log.i(this, "Communication device is already set for this audio type");
+ return false;
+ }
+
+ AudioDeviceInfo activeDevice = null;
+ List<AudioDeviceInfo> devices = mAudioManager.getAvailableCommunicationDevices();
+ if (devices.size() == 0) {
+ Log.w(this, "No communication devices available");
+ return false;
+ }
+
+ for (AudioDeviceInfo device : devices) {
+ Log.i(this, "Available device type: " + device.getType());
+ // Ensure that we do not select the same BT LE audio device for communication.
+ if ((audioDeviceType == device.getType()
+ || isUsbHeadsetType(audioDeviceType, device.getType()))
+ && !device.getAddress().equals(mBtAudioDevice)) {
+ activeDevice = device;
+ break;
+ }
+ }
+
+ if (activeDevice == null) {
+ Log.i(this, "No active device of type(s) %s available",
+ audioDeviceType == AudioDeviceInfo.TYPE_WIRED_HEADSET
+ ? Arrays.asList(AudioDeviceInfo.TYPE_WIRED_HEADSET,
+ AudioDeviceInfo.TYPE_USB_HEADSET)
+ : audioDeviceType);
+ return false;
+ }
+
+ // Force clear previous communication device, if one was set, before setting the new device.
+ if (mAudioDeviceType != sAUDIO_DEVICE_TYPE_INVALID) {
+ clearCommunicationDevice(mAudioDeviceType);
+ }
+
+ // Turn activeDevice ON.
+ boolean result = mAudioManager.setCommunicationDevice(activeDevice);
+ if (!result) {
+ Log.w(this, "Could not set active device");
+ } else {
+ Log.i(this, "Active device set");
+ mAudioDeviceType = activeDevice.getType();
+ if (isBtDevice) {
+ mBtAudioDevice = activeDevice.getAddress();
+ if (audioDeviceType == AudioDeviceInfo.TYPE_BLE_HEADSET) {
+ mBluetoothRouteManager.onAudioOn(mBtAudioDevice);
+ }
+ }
+ }
+ return result;
+ }
+
+ /*
+ * Clears the communication device for the passed in audio device types, given that the device
+ * has previously been set for communication.
+ * @param audioDeviceTypes The supported audio device types for the device.
+ */
+ public void clearCommunicationDevice(int audioDeviceType) {
+ // There is only one audio device type associated with each type of BT device.
+ boolean isBtDevice = sBT_AUDIO_DEVICE_TYPES.contains(audioDeviceType);
+ Log.i(this, "clearCommunicationDevice: type = %s, isBtDevice = %s",
+ audioDeviceType, isBtDevice);
+
+ if (audioDeviceType != mAudioDeviceType
+ && !isUsbHeadsetType(audioDeviceType, mAudioDeviceType)) {
+ Log.i(this, "Unable to clear communication device of type(s), %s. "
+ + "Device does not correspond to the locally requested device type.",
+ audioDeviceType == AudioDeviceInfo.TYPE_WIRED_HEADSET
+ ? Arrays.asList(AudioDeviceInfo.TYPE_WIRED_HEADSET,
+ AudioDeviceInfo.TYPE_USB_HEADSET)
+ : audioDeviceType
+ );
+ return;
+ }
+
+ if (isBtDevice && mBtAudioDevice != null) {
+ // Signal that BT audio was lost for device.
+ mBluetoothRouteManager.onAudioLost(mBtAudioDevice);
+ mBtAudioDevice = null;
+ }
+
+ if (mAudioManager == null) {
+ Log.i(this, "clearCommunicationDevice: mAudioManager is null");
+ return;
+ }
+
+ // Clear device and reset locally saved device type.
+ mAudioManager.clearCommunicationDevice();
+ mAudioDeviceType = sAUDIO_DEVICE_TYPE_INVALID;
+ }
+
+ private boolean isUsbHeadsetType(int audioDeviceType, int sourceType) {
+ return audioDeviceType != AudioDeviceInfo.TYPE_WIRED_HEADSET
+ ? false : sourceType == AudioDeviceInfo.TYPE_USB_HEADSET;
+ }
+}
diff --git a/src/com/android/server/telecom/CallAudioRouteStateMachine.java b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
index c5423c2..a709040 100644
--- a/src/com/android/server/telecom/CallAudioRouteStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
@@ -83,7 +83,8 @@
StatusBarNotifier statusBarNotifier,
CallAudioManager.AudioServiceFactory audioServiceFactory,
int earpieceControl,
- Executor asyncTaskExecutor) {
+ Executor asyncTaskExecutor,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
return new CallAudioRouteStateMachine(context,
callsManager,
bluetoothManager,
@@ -91,7 +92,8 @@
statusBarNotifier,
audioServiceFactory,
earpieceControl,
- asyncTaskExecutor);
+ asyncTaskExecutor,
+ communicationDeviceTracker);
}
}
/** Values for CallAudioRouteStateMachine constructor's earPieceRouting arg. */
@@ -371,6 +373,8 @@
public void enter() {
super.enter();
setSpeakerphoneOn(false);
+ mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE, null);
CallAudioState newState = new CallAudioState(mIsMuted, ROUTE_EARPIECE,
mAvailableRoutes, null,
mBluetoothRouteManager.getConnectedDevices());
@@ -401,6 +405,8 @@
case SWITCH_BLUETOOTH:
case USER_SWITCH_BLUETOOTH:
if ((mAvailableRoutes & ROUTE_BLUETOOTH) != 0) {
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);
if (mAudioFocusType == ACTIVE_FOCUS
|| mBluetoothRouteManager.isInbandRingingEnabled()) {
String address = (msg.obj instanceof SomeArgs) ?
@@ -417,6 +423,8 @@
case SWITCH_HEADSET:
case USER_SWITCH_HEADSET:
if ((mAvailableRoutes & ROUTE_WIRED_HEADSET) != 0) {
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);
transitionTo(mActiveHeadsetRoute);
} else {
Log.w(this, "Ignoring switch to headset command. Not available.");
@@ -426,6 +434,8 @@
// fall through; we want to switch to speaker mode when docked and in a call.
case SWITCH_SPEAKER:
case USER_SWITCH_SPEAKER:
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);
setSpeakerphoneOn(true);
// fall through
case SPEAKER_ON:
@@ -579,6 +589,8 @@
public void enter() {
super.enter();
setSpeakerphoneOn(false);
+ mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_WIRED_HEADSET, null);
CallAudioState newState = new CallAudioState(mIsMuted, ROUTE_WIRED_HEADSET,
mAvailableRoutes, null, mBluetoothRouteManager.getConnectedDevices());
setSystemAudioState(newState, true);
@@ -600,6 +612,8 @@
case SWITCH_EARPIECE:
case USER_SWITCH_EARPIECE:
if ((mAvailableRoutes & ROUTE_EARPIECE) != 0) {
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_WIRED_HEADSET);
transitionTo(mActiveEarpieceRoute);
} else {
Log.w(this, "Ignoring switch to earpiece command. Not available.");
@@ -615,6 +629,8 @@
|| mBluetoothRouteManager.isInbandRingingEnabled()) {
String address = (msg.obj instanceof SomeArgs) ?
(String) ((SomeArgs) msg.obj).arg2 : null;
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_WIRED_HEADSET);
// Omit transition to ActiveBluetoothRoute until actual connection.
setBluetoothOn(address);
} else {
@@ -631,6 +647,8 @@
return HANDLED;
case SWITCH_SPEAKER:
case USER_SWITCH_SPEAKER:
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_WIRED_HEADSET);
setSpeakerphoneOn(true);
// fall through
case SPEAKER_ON:
@@ -793,6 +811,12 @@
public void enter() {
super.enter();
setSpeakerphoneOn(false);
+ // Try arbitrarily connecting to BT audio if we haven't already. This handles
+ // the edge case of when the audio route is in a quiescent route while in-call and
+ // the BT connection fails to be set. Previously, the logic was to setBluetoothOn in
+ // ACTIVE_FOCUS but the route would still remain in a quiescent route, so instead we
+ // should be transitioning directly into the active route.
+ setBluetoothOn(null);
CallAudioState newState = new CallAudioState(mIsMuted, ROUTE_BLUETOOTH,
mAvailableRoutes, mBluetoothRouteManager.getBluetoothAudioConnectedDevice(),
mBluetoothRouteManager.getConnectedDevices());
@@ -1065,7 +1089,9 @@
return HANDLED;
case SWITCH_FOCUS:
if (msg.arg1 == ACTIVE_FOCUS) {
- setBluetoothOn(null);
+ // It is possible that the connection to BT will fail while in-call, in
+ // which case, we want to transition into the active route.
+ transitionTo(mActiveBluetoothRoute);
} else if (msg.arg1 == RINGING_FOCUS) {
if (mBluetoothRouteManager.isInbandRingingEnabled()) {
setBluetoothOn(null);
@@ -1514,6 +1540,7 @@
private CallAudioState mLastKnownCallAudioState;
private CallAudioManager mCallAudioManager;
+ private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
public CallAudioRouteStateMachine(
Context context,
@@ -1523,7 +1550,8 @@
StatusBarNotifier statusBarNotifier,
CallAudioManager.AudioServiceFactory audioServiceFactory,
int earpieceControl,
- Executor asyncTaskExecutor) {
+ Executor asyncTaskExecutor,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
super(NAME);
mContext = context;
mCallsManager = callsManager;
@@ -1534,6 +1562,7 @@
mAudioServiceFactory = audioServiceFactory;
mLock = callsManager.getLock();
mAsyncTaskExecutor = asyncTaskExecutor;
+ mCommunicationDeviceTracker = communicationDeviceTracker;
createStates(earpieceControl);
}
@@ -1545,7 +1574,8 @@
WiredHeadsetManager wiredHeadsetManager,
StatusBarNotifier statusBarNotifier,
CallAudioManager.AudioServiceFactory audioServiceFactory,
- int earpieceControl, Looper looper, Executor asyncTaskExecutor) {
+ int earpieceControl, Looper looper, Executor asyncTaskExecutor,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
super(NAME, looper);
mContext = context;
mCallsManager = callsManager;
@@ -1556,6 +1586,7 @@
mAudioServiceFactory = audioServiceFactory;
mLock = callsManager.getLock();
mAsyncTaskExecutor = asyncTaskExecutor;
+ mCommunicationDeviceTracker = communicationDeviceTracker;
createStates(earpieceControl);
}
@@ -1742,25 +1773,13 @@
// These APIs are all via two-way binder calls so can potentially block Telecom. Since none
// of this has to happen in the Telecom lock we'll offload it to the async executor.
mAsyncTaskExecutor.execute(() -> {
- AudioDeviceInfo speakerDevice = null;
- for (AudioDeviceInfo info : mAudioManager.getAvailableCommunicationDevices()) {
- if (info.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
- speakerDevice = info;
- break;
- }
- }
boolean speakerOn = false;
- if (speakerDevice != null && on) {
- boolean result = mAudioManager.setCommunicationDevice(speakerDevice);
- if (result) {
- speakerOn = true;
- }
+ if (on) {
+ speakerOn = mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, null);
} else {
- AudioDeviceInfo curDevice = mAudioManager.getCommunicationDevice();
- if (curDevice != null
- && curDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
- mAudioManager.clearCommunicationDevice();
- }
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
}
mStatusBarNotifier.notifySpeakerphone(hasAnyCalls && speakerOn);
});
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 70ebbb8..b0db65c 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -140,8 +140,8 @@
import com.android.server.telecom.ui.DisconnectedCallNotifier;
import com.android.server.telecom.ui.IncomingCallNotifier;
import com.android.server.telecom.ui.ToastFactory;
-import com.android.server.telecom.voip.TransactionManager;
import com.android.server.telecom.voip.VoipCallMonitor;
+import com.android.server.telecom.voip.TransactionManager;
import java.util.ArrayList;
import java.util.Arrays;
@@ -565,6 +565,7 @@
BlockedNumbersAdapter blockedNumbersAdapter,
TransactionManager transactionManager,
EmergencyCallDiagnosticLogger emergencyCallDiagnosticLogger,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker,
CallStreamingNotification callStreamingNotification) {
mContext = context;
@@ -596,7 +597,8 @@
statusBarNotifier,
audioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT,
- asyncTaskExecutor
+ asyncTaskExecutor,
+ communicationDeviceTracker
);
callAudioRouteStateMachine.initialize();
@@ -650,10 +652,10 @@
mClockProxy = clockProxy;
mToastFactory = toastFactory;
mRoleManagerAdapter = roleManagerAdapter;
+ mVoipCallMonitor = new VoipCallMonitor(mContext, mLock);
mTransactionManager = transactionManager;
mBlockedNumbersAdapter = blockedNumbersAdapter;
mCallStreamingController = new CallStreamingController(mContext, mLock);
- mVoipCallMonitor = new VoipCallMonitor(mContext, mLock);
mCallStreamingNotification = callStreamingNotification;
mListeners.add(mInCallWakeLockController);
@@ -2022,7 +2024,7 @@
+ " available accounts.");
showErrorMessage(R.string.cant_call_due_to_no_supported_service);
mListeners.forEach(l -> l.onCreateConnectionFailed(callToPlace));
- if (callToPlace.isEmergencyCall()){
+ if (callToPlace.isEmergencyCall()) {
mAnomalyReporter.reportAnomaly(
EMERGENCY_CALL_ABORTED_NO_PHONE_ACCOUNTS_ERROR_UUID,
EMERGENCY_CALL_ABORTED_NO_PHONE_ACCOUNTS_ERROR_MSG);
@@ -2855,8 +2857,6 @@
call.answer(videoState);
} else {
// Hold or disconnect the active call and request call focus for the incoming call.
- Call activeCall = (Call) mConnectionSvrFocusMgr.getCurrentFocusCall();
- Log.d(this, "answerCall: Incoming call = %s Ongoing call %s", call, activeCall);
holdActiveCallForNewCall(call);
mConnectionSvrFocusMgr.requestFocus(
call,
diff --git a/src/com/android/server/telecom/ConnectionServiceFocusManager.java b/src/com/android/server/telecom/ConnectionServiceFocusManager.java
index 3694727..72cb7c4 100644
--- a/src/com/android/server/telecom/ConnectionServiceFocusManager.java
+++ b/src/com/android/server/telecom/ConnectionServiceFocusManager.java
@@ -26,6 +26,8 @@
import android.telecom.Logging.Session;
import android.text.TextUtils;
import android.util.LocalLog;
+import android.util.LogPrinter;
+import android.util.Printer;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
@@ -35,6 +37,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -44,6 +47,11 @@
private static final String TAG = "ConnectionSvrFocusMgr";
private static final int GET_CURRENT_FOCUS_TIMEOUT_MILLIS = 1000;
private final LocalLog mLocalLog = new LocalLog(20);
+ private final AnomalyReporterAdapter mAnomalyReporter = new AnomalyReporterAdapterImpl();
+ public static final UUID WATCHDOG_GET_CALL_FOCUS_TIMEOUT_UUID =
+ UUID.fromString("edd7334a-ef87-432b-a1d0-a2f23959c73e");
+ public static final String WATCHDOG_GET_CALL_FOCUS_TIMEOUT_MSG =
+ "Telecom CallAnomalyWatchdog detected a timeout while getting the call focus.";
/** Factory interface used to create the {@link ConnectionServiceFocusManager} instance. */
public interface ConnectionServiceFocusManagerFactory {
@@ -333,7 +341,17 @@
return syncCallFocus.orElse(null);
} else {
Log.w(TAG, "Timed out waiting for synchronous current focus. Returning possibly"
- + " inaccurate result");
+ + " inaccurate result. returning currentFocusCall=[%s]", mCurrentFocusCall);
+
+ // dump the state of the handler to better understand the timeout
+ mEventHandler.dump(
+ new LogPrinter(android.util.Log.INFO, TAG), "CsFocusMgr_timeout");
+
+ // report the timeout
+ mAnomalyReporter.reportAnomaly(
+ WATCHDOG_GET_CALL_FOCUS_TIMEOUT_UUID,
+ WATCHDOG_GET_CALL_FOCUS_TIMEOUT_MSG);
+
return mCurrentFocusCall;
}
} catch (InterruptedException e) {
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
old mode 100755
new mode 100644
index c550ede..de1ecec
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -23,10 +23,10 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationRequest;
-import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
@@ -516,10 +516,12 @@
// Check status hints image for cross user access
if (parcelableConference.getStatusHints() != null) {
Icon icon = parcelableConference.getStatusHints().getIcon();
- parcelableConference.getStatusHints().setIcon(StatusHints.
- validateAccountIconUserBoundary(icon, callingUserHandle));
+ parcelableConference.getStatusHints().setIcon(StatusHints
+ .validateAccountIconUserBoundary(icon, callingUserHandle));
}
+ if (ConnectionServiceWrapper.this.mIsRemoteConnectionService) return;
+
if (parcelableConference.getConnectElapsedTimeMillis() != 0
&& mContext.checkCallingOrSelfPermission(MODIFY_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
@@ -934,6 +936,9 @@
public void addExistingConnection(String callId, ParcelableConnection connection,
Session.Info sessionInfo) {
Log.startSession(sessionInfo, "CSW.aEC", mPackageAbbreviation);
+
+ if (ConnectionServiceWrapper.this.mIsRemoteConnectionService) return;
+
UserHandle userHandle = Binder.getCallingUserHandle();
// Check that the Calling Package matches PhoneAccountHandle's Component Package
PhoneAccountHandle callingPhoneAccountHandle = connection.getPhoneAccount();
@@ -992,6 +997,12 @@
connectIdToCheck = callId;
}
+ // Check status hints image for cross user access
+ if (connection.getStatusHints() != null) {
+ Icon icon = connection.getStatusHints().getIcon();
+ connection.getStatusHints().setIcon(StatusHints.
+ validateAccountIconUserBoundary(icon, userHandle));
+ }
// Handle the case where an existing connection was added by Telephony via
// a connection manager. The remote connection service API does not include
// the ability to specify a parent connection when adding an existing
@@ -1030,14 +1041,6 @@
connection.getCallDirection(),
connection.getCallerNumberVerificationStatus());
}
-
- // Check status hints image for cross user access
- if (connection.getStatusHints() != null) {
- Icon icon = connection.getStatusHints().getIcon();
- connection.getStatusHints().setIcon(StatusHints.
- validateAccountIconUserBoundary(icon, userHandle));
- }
-
// Check to see if this Connection has already been added.
Call alreadyAddedConnection = mCallsManager
.getAlreadyAddedConnection(connectIdToCheck);
@@ -1350,6 +1353,7 @@
private final CallsManager mCallsManager;
private final AppOpsManager mAppOpsManager;
private final Context mContext;
+ public boolean mIsRemoteConnectionService = false;
private ConnectionServiceFocusManager.ConnectionServiceFocusListener mConnSvrFocusListener;
@@ -2506,13 +2510,13 @@
private void logIncoming(String msg, Object... params) {
// Keep these as debug; the incoming logging is traced on a package level through the
// session logging.
- Log.d(this, "CS -> TC[" + Log.getPackageAbbreviation(mComponentName) + "]: "
- + msg, params);
+ Log.d(this, "CS -> TC[" + Log.getPackageAbbreviation(mComponentName) + "]:"
+ + " isRCS = " + this.mIsRemoteConnectionService + ": " + msg, params);
}
private void logOutgoing(String msg, Object... params) {
- Log.d(this, "TC -> CS[" + Log.getPackageAbbreviation(mComponentName) + "]: "
- + msg, params);
+ Log.d(this, "TC -> CS[" + Log.getPackageAbbreviation(mComponentName) + "]:"
+ + " isRCS = " + this.mIsRemoteConnectionService + ": " + msg, params);
}
private void queryRemoteConnectionServices(final UserHandle userHandle,
@@ -2539,6 +2543,7 @@
ConnectionServiceWrapper service = mConnectionServiceRepository.getService(
handle.getComponentName(), handle.getUserHandle());
if (service != null && service != this) {
+ service.mIsRemoteConnectionService = true;
simServices.add(service);
} else {
// This is unexpected, normally PhoneAccounts with CAPABILITY_CALL_PROVIDER are not
diff --git a/src/com/android/server/telecom/RingbackPlayer.java b/src/com/android/server/telecom/RingbackPlayer.java
index a8af3ac..e0c6136 100644
--- a/src/com/android/server/telecom/RingbackPlayer.java
+++ b/src/com/android/server/telecom/RingbackPlayer.java
@@ -19,6 +19,7 @@
import static com.android.server.telecom.LogUtils.Events.START_RINBACK;
import static com.android.server.telecom.LogUtils.Events.STOP_RINGBACK;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import android.telecom.Log;
@@ -42,8 +43,12 @@
*/
private InCallTonePlayer mTonePlayer;
- RingbackPlayer(InCallTonePlayer.Factory playerFactory) {
+ private final Object mLock;
+
+ @VisibleForTesting
+ public RingbackPlayer(InCallTonePlayer.Factory playerFactory) {
mPlayerFactory = playerFactory;
+ mLock = new Object();
}
/**
@@ -52,25 +57,27 @@
* @param call The call for which to ringback.
*/
public void startRingbackForCall(Call call) {
- Preconditions.checkState(call.getState() == CallState.DIALING);
+ synchronized (mLock) {
+ Preconditions.checkState(call.getState() == CallState.DIALING);
- if (mCall == call) {
- Log.w(this, "Ignoring duplicate requests to ring for %s.", call);
- return;
- }
+ if (mCall == call) {
+ Log.w(this, "Ignoring duplicate requests to ring for %s.", call);
+ return;
+ }
- if (mCall != null) {
- // We only get here for the foreground call so, there's no reason why there should
- // exist a current dialing call.
- Log.wtf(this, "Ringback player thinks there are two foreground-dialing calls.");
- }
+ if (mCall != null) {
+ // We only get here for the foreground call so, there's no reason why there should
+ // exist a current dialing call.
+ Log.wtf(this, "Ringback player thinks there are two foreground-dialing calls.");
+ }
- mCall = call;
- if (mTonePlayer == null) {
- Log.i(this, "Playing the ringback tone for %s.", call);
- Log.addEvent(call, START_RINBACK);
- mTonePlayer = mPlayerFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
- mTonePlayer.startTone();
+ mCall = call;
+ if (mTonePlayer == null) {
+ Log.i(this, "Playing the ringback tone for %s.", call);
+ Log.addEvent(call, START_RINBACK);
+ mTonePlayer = mPlayerFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
+ mTonePlayer.startTone();
+ }
}
}
@@ -80,19 +87,27 @@
* @param call The call for which to stop ringback.
*/
public void stopRingbackForCall(Call call) {
- if (mCall == call) {
- // The foreground call is no longer dialing or is no longer the foreground call. In
- // either case, stop the ringback tone.
- mCall = null;
+ synchronized (mLock) {
+ if (mCall == call) {
+ // The foreground call is no longer dialing or is no longer the foreground call. In
+ // either case, stop the ringback tone.
+ mCall = null;
- if (mTonePlayer == null) {
- Log.w(this, "No player found to stop.");
- } else {
- Log.i(this, "Stopping the ringback tone for %s.", call);
- Log.addEvent(call, STOP_RINGBACK);
- mTonePlayer.stopTone();
- mTonePlayer = null;
+ if (mTonePlayer == null) {
+ Log.w(this, "No player found to stop.");
+ } else {
+ Log.i(this, "Stopping the ringback tone for %s.", call);
+ Log.addEvent(call, STOP_RINGBACK);
+ mTonePlayer.stopTone();
+ mTonePlayer = null;
+ }
}
}
}
+
+ public boolean isRingbackPlaying() {
+ synchronized (mLock) {
+ return mTonePlayer != null;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index 67bb81f..d8e9e8d 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -249,13 +249,17 @@
return context.getContentResolver().openInputStream(uri);
}
});
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker = new
+ CallAudioCommunicationDeviceTracker(mContext);
BluetoothDeviceManager bluetoothDeviceManager = new BluetoothDeviceManager(mContext,
- mContext.getSystemService(BluetoothManager.class).getAdapter());
+ mContext.getSystemService(BluetoothManager.class).getAdapter(),
+ communicationDeviceTracker);
BluetoothRouteManager bluetoothRouteManager = new BluetoothRouteManager(mContext, mLock,
- bluetoothDeviceManager, new Timeouts.Adapter());
+ bluetoothDeviceManager, new Timeouts.Adapter(), communicationDeviceTracker);
BluetoothStateReceiver bluetoothStateReceiver = new BluetoothStateReceiver(
- bluetoothDeviceManager, bluetoothRouteManager);
+ bluetoothDeviceManager, bluetoothRouteManager, communicationDeviceTracker);
mContext.registerReceiver(bluetoothStateReceiver, BluetoothStateReceiver.INTENT_FILTER);
+ communicationDeviceTracker.setBluetoothRouteManager(bluetoothRouteManager);
WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext);
SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock);
@@ -399,6 +403,7 @@
blockedNumbersAdapter,
transactionManager,
emergencyCallDiagnosticLogger,
+ communicationDeviceTracker,
callStreamingNotification);
mIncomingCallNotifier = incomingCallNotifier;
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
index 473e7b9..303f41c 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
@@ -28,10 +28,13 @@
import android.media.AudioManager;
import android.media.AudioDeviceInfo;
import android.media.audio.common.AudioDevice;
+import android.os.Bundle;
import android.telecom.Log;
+import android.util.ArraySet;
import android.util.LocalLog;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import java.util.ArrayList;
import java.util.Collection;
@@ -194,8 +197,10 @@
private BluetoothAdapter mBluetoothAdapter;
private AudioManager mAudioManager;
private Executor mExecutor;
+ private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
- public BluetoothDeviceManager(Context context, BluetoothAdapter bluetoothAdapter) {
+ public BluetoothDeviceManager(Context context, BluetoothAdapter bluetoothAdapter,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
if (bluetoothAdapter != null) {
mBluetoothAdapter = bluetoothAdapter;
bluetoothAdapter.getProfileProxy(context, mBluetoothProfileServiceListener,
@@ -206,6 +211,7 @@
BluetoothProfile.LE_AUDIO);
mAudioManager = context.getSystemService(AudioManager.class);
mExecutor = context.getMainExecutor();
+ mCommunicationDeviceTracker = communicationDeviceTracker;
}
}
@@ -234,18 +240,38 @@
}
public int getNumConnectedDevices() {
- synchronized (mLock) {
- return mHfpDevicesByAddress.size() +
- mHearingAidDevicesByAddress.size() +
- getLeAudioConnectedDevices().size();
- }
+ return getConnectedDevices().size();
}
public Collection<BluetoothDevice> getConnectedDevices() {
synchronized (mLock) {
- ArrayList<BluetoothDevice> result = new ArrayList<>(mHfpDevicesByAddress.values());
+ ArraySet<BluetoothDevice> result = new ArraySet<>();
+
+ // Set storing the group ids of all dual mode audio devices to de-dupe them
+ Set<Integer> dualModeGroupIds = new ArraySet<>();
+ for (BluetoothDevice hfpDevice: mHfpDevicesByAddress.values()) {
+ result.add(hfpDevice);
+ if (mBluetoothLeAudioService == null) {
+ continue;
+ }
+ int groupId = mBluetoothLeAudioService.getGroupId(hfpDevice);
+ if (groupId != BluetoothLeAudio.GROUP_ID_INVALID) {
+ dualModeGroupIds.add(groupId);
+ }
+ }
+
result.addAll(mHearingAidDevicesByAddress.values());
- result.addAll(getLeAudioConnectedDevices());
+ if (mBluetoothLeAudioService == null) {
+ return Collections.unmodifiableCollection(result);
+ }
+ for (BluetoothDevice leAudioDevice: getLeAudioConnectedDevices()) {
+ // Exclude dual mode audio devices included from the HFP devices list
+ int groupId = mBluetoothLeAudioService.getGroupId(leAudioDevice);
+ if (groupId != BluetoothLeAudio.GROUP_ID_INVALID
+ && !dualModeGroupIds.contains(groupId)) {
+ result.add(leAudioDevice);
+ }
+ }
return Collections.unmodifiableCollection(result);
}
}
@@ -253,9 +279,9 @@
// Same as getConnectedDevices except it filters out the hearing aid devices that are linked
// together by their hiSyncId.
public Collection<BluetoothDevice> getUniqueConnectedDevices() {
- ArrayList<BluetoothDevice> result;
+ ArraySet<BluetoothDevice> result;
synchronized (mLock) {
- result = new ArrayList<>(mHfpDevicesByAddress.values());
+ result = new ArraySet<>(mHfpDevicesByAddress.values());
}
Set<Long> seenHiSyncIds = new LinkedHashSet<>();
// Add the left-most active device to the seen list so that we match up with the list
@@ -367,6 +393,8 @@
return;
}
if (!targetDeviceMap.containsKey(device.getAddress())) {
+ Log.i(this, "Adding device with address: " + device + " and devicetype="
+ + getDeviceTypeString(deviceType));
targetDeviceMap.put(device.getAddress(), device);
mBluetoothRouteManager.onDeviceAdded(device.getAddress());
}
@@ -391,6 +419,8 @@
return;
}
if (targetDeviceMap.containsKey(device.getAddress())) {
+ Log.i(this, "Removing device with address: " + device + " and devicetype="
+ + getDeviceTypeString(deviceType));
targetDeviceMap.remove(device.getAddress());
mBluetoothRouteManager.onDeviceLost(device.getAddress());
}
@@ -398,12 +428,7 @@
}
public void disconnectAudio() {
- disconnectSco();
- clearLeAudioCommunicationDevice();
- clearHearingAidCommunicationDevice();
- }
-
- public void disconnectSco() {
+ mCommunicationDeviceTracker.clearBtCommunicationDevice();
if (mBluetoothHeadset == null) {
Log.w(this, "Trying to disconnect audio but no headset service exists.");
} else {
@@ -568,50 +593,72 @@
// Connect audio to the bluetooth device at address, checking to see whether it's
// le audio, hearing aid or a HFP device, and using the proper BT API.
public boolean connectAudio(String address, boolean switchingBtDevices) {
+ int callProfile = BluetoothProfile.LE_AUDIO;
+ Log.i(this, "Telecomm connecting audio to device: " + address);
+ BluetoothDevice device = null;
if (mLeAudioDevicesByAddress.containsKey(address)) {
+ Log.i(this, "Telecomm found LE Audio device for address: " + address);
if (mBluetoothLeAudioService == null) {
Log.w(this, "Attempting to turn on audio when the le audio service is null");
return false;
}
- BluetoothDevice device = mLeAudioDevicesByAddress.get(address);
- if (mBluetoothAdapter.setActiveDevice(
- device, BluetoothAdapter.ACTIVE_DEVICE_ALL)) {
-
- /* ACTION_ACTIVE_DEVICE_CHANGED intent will trigger setting communication device.
- * Only after receiving ACTION_ACTIVE_DEVICE_CHANGED it is known that device that
- * will be audio switched to is available to be choose as communication device */
- if (!switchingBtDevices) {
- return setLeAudioCommunicationDevice();
- }
-
- return true;
- }
- return false;
+ device = mLeAudioDevicesByAddress.get(address);
+ callProfile = BluetoothProfile.LE_AUDIO;
} else if (mHearingAidDevicesByAddress.containsKey(address)) {
+ Log.i(this, "Telecomm found hearing aid device for address: " + address);
if (mBluetoothHearingAid == null) {
Log.w(this, "Attempting to turn on audio when the hearing aid service is null");
return false;
}
- if (mBluetoothAdapter.setActiveDevice(
- mHearingAidDevicesByAddress.get(address),
- BluetoothAdapter.ACTIVE_DEVICE_ALL)) {
-
- /* ACTION_ACTIVE_DEVICE_CHANGED intent will trigger setting communication device.
- * Only after receiving ACTION_ACTIVE_DEVICE_CHANGED it is known that device that
- * will be audio switched to is available to be choose as communication device */
- if (!switchingBtDevices) {
- return setHearingAidCommunicationDevice();
- }
-
- return true;
- }
- return false;
+ device = mHearingAidDevicesByAddress.get(address);
+ callProfile = BluetoothProfile.HEARING_AID;
} else if (mHfpDevicesByAddress.containsKey(address)) {
- BluetoothDevice device = mHfpDevicesByAddress.get(address);
+ Log.i(this, "Telecomm found HFP device for address: " + address);
if (mBluetoothHeadset == null) {
Log.w(this, "Attempting to turn on audio when the headset service is null");
return false;
}
+ device = mHfpDevicesByAddress.get(address);
+ callProfile = BluetoothProfile.HEADSET;
+ }
+
+ if (device == null) {
+ Log.w(this, "No active profiles for Bluetooth address=" + address);
+ return false;
+ }
+
+ Bundle preferredAudioProfiles = mBluetoothAdapter.getPreferredAudioProfiles(device);
+ if (preferredAudioProfiles != null && !preferredAudioProfiles.isEmpty()
+ && preferredAudioProfiles.getInt(BluetoothAdapter.AUDIO_MODE_DUPLEX) != 0) {
+ Log.i(this, "Preferred duplex profile for device=" + address + " is "
+ + preferredAudioProfiles.getInt(BluetoothAdapter.AUDIO_MODE_DUPLEX));
+ callProfile = preferredAudioProfiles.getInt(BluetoothAdapter.AUDIO_MODE_DUPLEX);
+ }
+
+ if (callProfile == BluetoothProfile.LE_AUDIO) {
+ if (mBluetoothAdapter.setActiveDevice(
+ device, BluetoothAdapter.ACTIVE_DEVICE_ALL)) {
+ /* ACTION_ACTIVE_DEVICE_CHANGED intent will trigger setting communication device.
+ * Only after receiving ACTION_ACTIVE_DEVICE_CHANGED it is known that device that
+ * will be audio switched to is available to be choose as communication device */
+ if (!switchingBtDevices) {
+ return mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_BLE_HEADSET, device);
+ }
+ }
+ return false;
+ } else if (callProfile == BluetoothProfile.HEARING_AID) {
+ if (mBluetoothAdapter.setActiveDevice(device, BluetoothAdapter.ACTIVE_DEVICE_ALL)) {
+ /* ACTION_ACTIVE_DEVICE_CHANGED intent will trigger setting communication device.
+ * Only after receiving ACTION_ACTIVE_DEVICE_CHANGED it is known that device that
+ * will be audio switched to is available to be choose as communication device */
+ if (!switchingBtDevices) {
+ return mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_HEARING_AID, null);
+ }
+ }
+ return false;
+ } else if (callProfile == BluetoothProfile.HEADSET) {
boolean success = mBluetoothAdapter.setActiveDevice(device,
BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL);
if (!success) {
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
index 7966f73..556a8a5 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
@@ -23,6 +23,7 @@
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothLeAudio;
import android.content.Context;
+import android.media.AudioDeviceInfo;
import android.os.Message;
import android.telecom.Log;
import android.telecom.Logging.Session;
@@ -33,6 +34,7 @@
import com.android.internal.util.IState;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
@@ -469,15 +471,18 @@
private BluetoothDevice mHearingAidActiveDeviceCache = null;
private BluetoothDevice mLeAudioActiveDeviceCache = null;
private BluetoothDevice mMostRecentlyReportedActiveDevice = null;
+ private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
public BluetoothRouteManager(Context context, TelecomSystem.SyncRoot lock,
- BluetoothDeviceManager deviceManager, Timeouts.Adapter timeoutsAdapter) {
+ BluetoothDeviceManager deviceManager, Timeouts.Adapter timeoutsAdapter,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
super(BluetoothRouteManager.class.getSimpleName());
mContext = context;
mLock = lock;
mDeviceManager = deviceManager;
mDeviceManager.setBluetoothRouteManager(this);
mTimeoutsAdapter = timeoutsAdapter;
+ mCommunicationDeviceTracker = communicationDeviceTracker;
mAudioOffState = new AudioOffState();
addState(mAudioOffState);
@@ -621,12 +626,14 @@
if (deviceType == BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO) {
mLeAudioActiveDeviceCache = device;
if (device == null) {
- mDeviceManager.clearLeAudioCommunicationDevice();
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
}
} else if (deviceType == BluetoothDeviceManager.DEVICE_TYPE_HEARING_AID) {
mHearingAidActiveDeviceCache = device;
if (device == null) {
- mDeviceManager.clearHearingAidCommunicationDevice();
+ mCommunicationDeviceTracker.clearCommunicationDevice(
+ AudioDeviceInfo.TYPE_HEARING_AID);
}
} else if (deviceType == BluetoothDeviceManager.DEVICE_TYPE_HEADSET) {
mHfpActiveDeviceCache = device;
@@ -798,7 +805,8 @@
}
if (bluetoothHearingAid != null) {
- if (mDeviceManager.isHearingAidSetAsCommunicationDevice()) {
+ if (mCommunicationDeviceTracker.isAudioDeviceSetForType(
+ AudioDeviceInfo.TYPE_HEARING_AID)) {
for (BluetoothDevice device : bluetoothAdapter.getActiveDevices(
BluetoothProfile.HEARING_AID)) {
if (device != null) {
@@ -811,7 +819,8 @@
}
if (bluetoothLeAudio != null) {
- if (mDeviceManager.isLeAudioCommunicationDevice()) {
+ if (mCommunicationDeviceTracker.isAudioDeviceSetForType(
+ AudioDeviceInfo.TYPE_BLE_HEADSET)) {
for (BluetoothDevice device : bluetoothAdapter.getActiveDevices(
BluetoothProfile.LE_AUDIO)) {
if (device != null) {
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java b/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
index 20af7b5..ec4f263 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
@@ -16,6 +16,7 @@
package com.android.server.telecom.bluetooth;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothHearingAid;
@@ -25,10 +26,13 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.media.AudioDeviceInfo;
+import android.os.Bundle;
import android.telecom.Log;
import android.telecom.Logging.Session;
import com.android.internal.os.SomeArgs;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import static com.android.server.telecom.bluetooth.BluetoothRouteManager.BT_AUDIO_IS_ON;
import static com.android.server.telecom.bluetooth.BluetoothRouteManager.BT_AUDIO_LOST;
@@ -54,6 +58,7 @@
private boolean mIsInCall = false;
private final BluetoothRouteManager mBluetoothRouteManager;
private final BluetoothDeviceManager mBluetoothDeviceManager;
+ private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
public void onReceive(Context context, Intent intent) {
Log.startSession("BSR.oR");
@@ -84,7 +89,7 @@
intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
BluetoothDevice device =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothDevice.class);
if (device == null) {
Log.w(LOG_TAG, "Got null device from broadcast. " +
"Ignoring.");
@@ -115,7 +120,7 @@
int bluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
BluetoothHeadset.STATE_DISCONNECTED);
BluetoothDevice device =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothDevice.class);
if (device == null) {
Log.w(LOG_TAG, "Got null device from broadcast. " +
@@ -149,7 +154,7 @@
private void handleActiveDeviceChanged(Intent intent) {
BluetoothDevice device =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothDevice.class);
int deviceType;
if (BluetoothLeAudio.ACTION_LE_AUDIO_ACTIVE_DEVICE_CHANGED.equals(intent.getAction())) {
@@ -181,11 +186,32 @@
}
args.arg2 = device.getAddress();
+ boolean usePreferredAudioProfile = false;
+ BluetoothAdapter bluetoothAdapter = mBluetoothDeviceManager.getBluetoothAdapter();
+ int preferredDuplexProfile = BluetoothProfile.LE_AUDIO;
+ if (bluetoothAdapter != null) {
+ Bundle preferredAudioProfiles = bluetoothAdapter.getPreferredAudioProfiles(
+ device);
+ if (preferredAudioProfiles != null && !preferredAudioProfiles.isEmpty()
+ && preferredAudioProfiles.getInt(BluetoothAdapter.AUDIO_MODE_DUPLEX)
+ != 0) {
+ Log.i(this, "Preferred duplex profile for device=" + device + " is "
+ + preferredAudioProfiles.getInt(
+ BluetoothAdapter.AUDIO_MODE_DUPLEX));
+ usePreferredAudioProfile = true;
+ preferredDuplexProfile =
+ preferredAudioProfiles.getInt(BluetoothAdapter.AUDIO_MODE_DUPLEX);
+ }
+ }
+
if (deviceType == BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO) {
/* In Le Audio case, once device got Active, the Telecom needs to make sure it
* is set as communication device before we can say that BT_AUDIO_IS_ON
*/
- if (!mBluetoothDeviceManager.setLeAudioCommunicationDevice()) {
+ if ((!usePreferredAudioProfile
+ || preferredDuplexProfile == BluetoothProfile.LE_AUDIO)
+ && !mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_BLE_HEADSET, device)) {
Log.w(LOG_TAG,
"Device %s cannot be use as LE audio communication device.",
device);
@@ -193,7 +219,8 @@
}
} else {
/* deviceType == BluetoothDeviceManager.DEVICE_TYPE_HEARING_AID */
- if (!mBluetoothDeviceManager.setHearingAidCommunicationDevice()) {
+ if (!mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_HEARING_AID, null)) {
Log.w(LOG_TAG,
"Device %s cannot be use as hearing aid communication device.",
device);
@@ -210,9 +237,11 @@
}
public BluetoothStateReceiver(BluetoothDeviceManager deviceManager,
- BluetoothRouteManager routeManager) {
+ BluetoothRouteManager routeManager,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
mBluetoothDeviceManager = deviceManager;
mBluetoothRouteManager = routeManager;
+ mCommunicationDeviceTracker = communicationDeviceTracker;
}
public void setIsInCall(boolean isInCall) {
diff --git a/tests/src/com/android/server/telecom/tests/BasicCallTests.java b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
index bd81a2f..68eb8b2 100644
--- a/tests/src/com/android/server/telecom/tests/BasicCallTests.java
+++ b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
@@ -39,10 +39,10 @@
import android.content.Context;
import android.content.IContentProvider;
-import android.content.pm.PackageManager;
-import android.media.AudioDeviceInfo;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.graphics.drawable.Icon;
+import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Binder;
@@ -651,8 +651,8 @@
.getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT);
ArgumentCaptor<AudioDeviceInfo> infoArgumentCaptor =
ArgumentCaptor.forClass(AudioDeviceInfo.class);
- verify(audioManager, timeout(TEST_TIMEOUT)).setCommunicationDevice(
- infoArgumentCaptor.capture());
+ verify(audioManager, timeout(TEST_TIMEOUT).atLeast(1))
+ .setCommunicationDevice(infoArgumentCaptor.capture());
assertEquals(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, infoArgumentCaptor.getValue().getType());
mInCallServiceFixtureX.mInCallAdapter.setAudioRoute(CallAudioState.ROUTE_EARPIECE, null);
waitForHandlerAction(mTelecomSystem.getCallsManager().getCallAudioManager()
@@ -1339,7 +1339,6 @@
public void testValidateStatusHintsImage_addExistingConnection() throws Exception {
IdPair outgoing = startAndMakeActiveOutgoingCall("650-555-1214",
mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA);
- Connection existingConnection = mConnectionServiceFixtureA.mLatestConnection;
// Modify existing connection with StatusHints image exploit
Icon icon = Icon.createWithContentUri("content://10@media/external/images/media/");
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
index c37d136..de57984 100644
--- a/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
@@ -24,13 +24,14 @@
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothProfile;
-import android.content.BroadcastReceiver;
import android.content.Intent;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
+import android.os.Bundle;
import android.os.Parcel;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.bluetooth.BluetoothStateReceiver;
@@ -76,6 +77,7 @@
BluetoothDeviceManager mBluetoothDeviceManager;
BluetoothProfile.ServiceListener serviceListenerUnderTest;
BluetoothStateReceiver receiverUnderTest;
+ CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
ArgumentCaptor<BluetoothLeAudio.Callback> leAudioCallbacksTest;
private BluetoothDevice device1;
@@ -103,8 +105,11 @@
when(mBluetoothHearingAid.getHiSyncId(device4)).thenReturn(100L);
mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
- mBluetoothDeviceManager = new BluetoothDeviceManager(mContext, mAdapter);
+ mCommunicationDeviceTracker = new CallAudioCommunicationDeviceTracker(mContext);
+ mBluetoothDeviceManager = new BluetoothDeviceManager(mContext, mAdapter,
+ mCommunicationDeviceTracker);
mBluetoothDeviceManager.setBluetoothRouteManager(mRouteManager);
+ mCommunicationDeviceTracker.setBluetoothRouteManager(mRouteManager);
mockAudioManager = mContext.getSystemService(AudioManager.class);
@@ -114,7 +119,8 @@
serviceCaptor.capture(), eq(BluetoothProfile.HEADSET));
serviceListenerUnderTest = serviceCaptor.getValue();
- receiverUnderTest = new BluetoothStateReceiver(mBluetoothDeviceManager, mRouteManager);
+ receiverUnderTest = new BluetoothStateReceiver(mBluetoothDeviceManager,
+ mRouteManager, mCommunicationDeviceTracker);
mBluetoothDeviceManager.setHeadsetServiceForTesting(mBluetoothHeadset);
mBluetoothDeviceManager.setHearingAidServiceForTesting(mBluetoothHearingAid);
@@ -178,6 +184,7 @@
buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device5,
BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
leAudioCallbacksTest.getValue().onGroupNodeAdded(device5, 1);
+ when(mBluetoothLeAudio.getGroupId(device5)).thenReturn(1);
when(mBluetoothLeAudio.getConnectedGroupLeadDevice(1)).thenReturn(device5);
receiverUnderTest.onReceive(mContext,
@@ -188,6 +195,7 @@
BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
leAudioCallbacksTest.getValue().onGroupNodeAdded(device6, 2);
when(mBluetoothLeAudio.getConnectedGroupLeadDevice(2)).thenReturn(device6);
+ when(mBluetoothLeAudio.getGroupId(device6)).thenReturn(1);
receiverUnderTest.onReceive(mContext,
buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device3,
BluetoothDeviceManager.DEVICE_TYPE_HEADSET));
@@ -263,17 +271,19 @@
@Test
public void testLeAudioDedup() {
receiverUnderTest.onReceive(mContext,
- buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1,
+ buildConnectionActionIntent(BluetoothProfile.STATE_CONNECTED, device1,
BluetoothDeviceManager.DEVICE_TYPE_HEADSET));
receiverUnderTest.onReceive(mContext,
- buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device5,
+ buildConnectionActionIntent(BluetoothProfile.STATE_CONNECTED, device5,
BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
leAudioCallbacksTest.getValue().onGroupNodeAdded(device5, 1);
receiverUnderTest.onReceive(mContext,
- buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device6,
+ buildConnectionActionIntent(BluetoothProfile.STATE_CONNECTED, device6,
BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
leAudioCallbacksTest.getValue().onGroupNodeAdded(device6, 1);
when(mBluetoothLeAudio.getConnectedGroupLeadDevice(1)).thenReturn(device5);
+ when(mBluetoothLeAudio.getGroupId(device5)).thenReturn(1);
+ when(mBluetoothLeAudio.getGroupId(device6)).thenReturn(1);
assertEquals(2, mBluetoothDeviceManager.getNumConnectedDevices());
assertEquals(2, mBluetoothDeviceManager.getUniqueConnectedDevices().size());
}
@@ -408,8 +418,8 @@
when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
eq(BluetoothAdapter.ACTIVE_DEVICE_ALL))).thenReturn(true);
- AudioDeviceInfo mockAudioDeviceInfo = mock(AudioDeviceInfo.class);
- when(mockAudioDeviceInfo.getType()).thenReturn(AudioDeviceInfo.TYPE_HEARING_AID);
+ AudioDeviceInfo mockAudioDeviceInfo = createMockAudioDeviceInfo(device5.getAddress(),
+ AudioDeviceInfo.TYPE_HEARING_AID);
List<AudioDeviceInfo> devices = new ArrayList<>();
devices.add(mockAudioDeviceInfo);
@@ -443,8 +453,8 @@
when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
eq(BluetoothAdapter.ACTIVE_DEVICE_ALL))).thenReturn(true);
- AudioDeviceInfo mockAudioDeviceInfo = mock(AudioDeviceInfo.class);
- when(mockAudioDeviceInfo.getType()).thenReturn(AudioDeviceInfo.TYPE_BLE_HEADSET);
+ AudioDeviceInfo mockAudioDeviceInfo = createMockAudioDeviceInfo(device5.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
List<AudioDeviceInfo> devices = new ArrayList<>();
devices.add(mockAudioDeviceInfo);
@@ -458,6 +468,8 @@
verify(mBluetoothHeadset, never()).connectAudio();
verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
+ verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_AUDIO));
receiverUnderTest.onReceive(mContext, buildActiveDeviceChangeActionIntent(device5,
BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
@@ -485,6 +497,8 @@
verify(mBluetoothHeadset, never()).connectAudio();
verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
+ verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
when(mAdapter.getActiveDevices(eq(BluetoothProfile.LE_AUDIO)))
.thenReturn(Arrays.asList(device5, device6));
@@ -499,6 +513,182 @@
@SmallTest
@Test
+ public void testConnectMultipleLeAudioDevices() {
+ receiverUnderTest.setIsInCall(true);
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeAdded(device1, 1);
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeAdded(device2, 1);
+ when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_ALL))).thenReturn(true);
+
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ AudioDeviceInfo leAudioDevice1 = createMockAudioDeviceInfo(device1.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ AudioDeviceInfo leAudioDevice2 = createMockAudioDeviceInfo(device2.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ devices.add(leAudioDevice1);
+ devices.add(leAudioDevice2);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(any(AudioDeviceInfo.class)))
+ .thenReturn(true);
+
+ // Connect LE audio device
+ mBluetoothDeviceManager.connectAudio(device1.getAddress(), false);
+ verify(mAdapter).setActiveDevice(device1, BluetoothAdapter.ACTIVE_DEVICE_ALL);
+ verify(mBluetoothHeadset, never()).connectAudio();
+ verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
+ // Verify that we set the communication device for device 1
+ verify(mockAudioManager).setCommunicationDevice(leAudioDevice1);
+
+ // Change active device to other LE audio device
+ receiverUnderTest.onReceive(mContext, buildActiveDeviceChangeActionIntent(device2,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+
+ // Verify call to clearLeAudioCommunicationDevice
+ verify(mRouteManager).onAudioLost(eq(DEVICE_ADDRESS_1));
+ // Verify that we set the communication device for device2
+ verify(mockAudioManager).setCommunicationDevice(leAudioDevice2);
+ }
+
+ @SmallTest
+ @Test
+ public void testClearCommunicationDeviceOnActiveDeviceChange() {
+ receiverUnderTest.setIsInCall(true);
+// receiverUnderTest.onReceive(mContext,
+// buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1,
+// BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+// leAudioCallbacksTest.getValue().onGroupNodeAdded(device1, 1);
+// when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
+// eq(BluetoothAdapter.ACTIVE_DEVICE_ALL))).thenReturn(true);
+
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ AudioDeviceInfo leAudioDevice1 = createMockAudioDeviceInfo(device1.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ devices.add(leAudioDevice1);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(any(AudioDeviceInfo.class)))
+ .thenReturn(true);
+
+ // Pretend that the speaker device is currently the requested device set for communication.
+ // This test ensures that the set/clear communication logic for audio switching in/out of BT
+ // is properly working when the receiver processes an active device change intent.
+ mCommunicationDeviceTracker.setTestCommunicationDevice(TYPE_BUILTIN_SPEAKER);
+
+ // Notify that LE audio device has been turned on
+ receiverUnderTest.onReceive(mContext, buildActiveDeviceChangeActionIntent(device1,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ // Verify call to clear speaker communication device
+ verify(mockAudioManager).clearCommunicationDevice();
+ // Verify that LE audio communication device was set after clearing the speaker device
+ verify(mockAudioManager).setCommunicationDevice(leAudioDevice1);
+ }
+
+ @SmallTest
+ @Test
+ public void testConnectDualModeEarbud() {
+ receiverUnderTest.setIsInCall(true);
+
+ // LE Audio earbuds connected
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device5,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeAdded(device5, 1);
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothLeAudio.STATE_CONNECTED, device6,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeAdded(device6, 1);
+ // HFP device connected
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device5,
+ BluetoothDeviceManager.DEVICE_TYPE_HEADSET));
+ when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_ALL))).thenReturn(true);
+
+ AudioDeviceInfo mockAudioDevice5Info = createMockAudioDeviceInfo(device5.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ AudioDeviceInfo mockAudioDevice6Info = createMockAudioDeviceInfo(device6.getAddress(),
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ when(mockAudioDevice5Info.getType()).thenReturn(AudioDeviceInfo.TYPE_BLE_HEADSET);
+ when(mockAudioDevice6Info.getType()).thenReturn(AudioDeviceInfo.TYPE_BLE_HEADSET);
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ devices.add(mockAudioDevice5Info);
+ devices.add(mockAudioDevice6Info);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(mockAudioDevice5Info))
+ .thenReturn(true);
+
+ Bundle hfpPreferred = new Bundle();
+ hfpPreferred.putInt(BluetoothAdapter.AUDIO_MODE_DUPLEX, BluetoothProfile.HEADSET);
+ Bundle leAudioPreferred = new Bundle();
+ leAudioPreferred.putInt(BluetoothAdapter.AUDIO_MODE_DUPLEX, BluetoothProfile.LE_AUDIO);
+
+ // TEST 1: LE Audio preferred for DUPLEX
+ when(mAdapter.getPreferredAudioProfiles(device5)).thenReturn(leAudioPreferred);
+ when(mAdapter.getPreferredAudioProfiles(device6)).thenReturn(leAudioPreferred);
+ mBluetoothDeviceManager.connectAudio(device5.getAddress(), false);
+ verify(mAdapter, times(1)).setActiveDevice(device5, BluetoothAdapter.ACTIVE_DEVICE_ALL);
+ verify(mBluetoothHeadset, never()).connectAudio();
+ verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
+ verify(mockAudioManager).setCommunicationDevice(mockAudioDevice5Info);
+
+ when(mAdapter.getActiveDevices(eq(BluetoothProfile.LE_AUDIO)))
+ .thenReturn(Arrays.asList(device5, device6));
+
+ // Check disconnect during a call
+ devices.remove(mockAudioDevice5Info);
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_DISCONNECTED, device5,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeRemoved(device5, 1);
+
+ mBluetoothDeviceManager.connectAudio(device6.getAddress(), false);
+ verify(mAdapter).setActiveDevice(device6, BluetoothAdapter.ACTIVE_DEVICE_ALL);
+ verify(mBluetoothHeadset, never()).connectAudio();
+ verify(mAdapter, never()).setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL));
+ verify(mockAudioManager, times(1)).clearCommunicationDevice();
+
+ // Reconnect other LE Audio earbud
+ devices.add(mockAudioDevice5Info);
+ receiverUnderTest.onReceive(mContext,
+ buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device5,
+ BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO));
+ leAudioCallbacksTest.getValue().onGroupNodeAdded(device5, 1);
+
+ // Disconnects audio
+ mBluetoothDeviceManager.disconnectAudio();
+ verify(mockAudioManager, times(2)).clearCommunicationDevice();
+ verify(mBluetoothHeadset, times(1)).disconnectAudio();
+
+ // TEST 2: HFP preferred for DUPLEX
+ when(mAdapter.getPreferredAudioProfiles(device5)).thenReturn(hfpPreferred);
+ when(mAdapter.getPreferredAudioProfiles(device6)).thenReturn(hfpPreferred);
+ when(mAdapter.setActiveDevice(nullable(BluetoothDevice.class),
+ eq(BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL))).thenReturn(true);
+ mBluetoothDeviceManager.connectAudio(device5.getAddress(), false);
+ verify(mAdapter).setActiveDevice(device5, BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL);
+ verify(mAdapter, times(1)).setActiveDevice(device5,
+ BluetoothAdapter.ACTIVE_DEVICE_ALL);
+ verify(mBluetoothHeadset).connectAudio();
+ mBluetoothDeviceManager.disconnectAudio();
+ verify(mBluetoothHeadset, times(2)).disconnectAudio();
+ }
+
+ @SmallTest
+ @Test
public void testClearHearingAidCommunicationDevice() {
AudioDeviceInfo mockAudioDeviceInfo = mock(AudioDeviceInfo.class);
when(mockAudioDeviceInfo.getAddress()).thenReturn(DEVICE_ADDRESS_1);
@@ -511,11 +701,34 @@
when(mockAudioManager.setCommunicationDevice(eq(mockAudioDeviceInfo)))
.thenReturn(true);
- mBluetoothDeviceManager.setHearingAidCommunicationDevice();
+ mCommunicationDeviceTracker.setCommunicationDevice(AudioDeviceInfo.TYPE_HEARING_AID, null);
when(mockAudioManager.getCommunicationDevice()).thenReturn(mSpeakerInfo);
- mBluetoothDeviceManager.clearHearingAidCommunicationDevice();
+ mCommunicationDeviceTracker.clearCommunicationDevice(AudioDeviceInfo.TYPE_HEARING_AID);
verify(mRouteManager).onAudioLost(eq(DEVICE_ADDRESS_1));
- assertFalse(mBluetoothDeviceManager.isHearingAidSetAsCommunicationDevice());
+ assertFalse(mCommunicationDeviceTracker.isAudioDeviceSetForType(
+ AudioDeviceInfo.TYPE_HEARING_AID));
+ }
+
+ @SmallTest
+ @Test
+ public void testClearLeAudioCommunicationDevice() {
+ AudioDeviceInfo mockAudioDeviceInfo = createMockAudioDeviceInfo(DEVICE_ADDRESS_1,
+ AudioDeviceInfo.TYPE_BLE_HEADSET);
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ devices.add(mockAudioDeviceInfo);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(eq(mockAudioDeviceInfo)))
+ .thenReturn(true);
+
+ mCommunicationDeviceTracker.setCommunicationDevice(
+ AudioDeviceInfo.TYPE_BLE_HEADSET, device1);
+ when(mockAudioManager.getCommunicationDevice()).thenReturn(mSpeakerInfo);
+ mCommunicationDeviceTracker.clearCommunicationDevice(AudioDeviceInfo.TYPE_BLE_HEADSET);
+ verify(mRouteManager).onAudioLost(eq(DEVICE_ADDRESS_1));
+ assertFalse(mCommunicationDeviceTracker.isAudioDeviceSetForType(
+ AudioDeviceInfo.TYPE_BLE_HEADSET));
}
@SmallTest
@@ -541,6 +754,15 @@
assertTrue(mBluetoothDeviceManager.isInbandRingingEnabled());
}
+ private AudioDeviceInfo createMockAudioDeviceInfo(String address, int audioType) {
+ AudioDeviceInfo mockAudioDeviceInfo = mock(AudioDeviceInfo.class);
+ when(mockAudioDeviceInfo.getType()).thenReturn(audioType);
+ if (address != null) {
+ when(mockAudioDeviceInfo.getAddress()).thenReturn(address);
+ }
+ return mockAudioDeviceInfo;
+ }
+
private Intent buildConnectionActionIntent(int state, BluetoothDevice device, int deviceType) {
String intentString;
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java
index 1a6fb88..2b5e5ac 100644
--- a/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java
@@ -29,6 +29,7 @@
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.os.SomeArgs;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
@@ -71,6 +72,7 @@
@Mock private BluetoothLeAudio mBluetoothLeAudio;
@Mock private Timeouts.Adapter mTimeoutsAdapter;
@Mock private BluetoothRouteManager.BluetoothStateListener mListener;
+ @Mock private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
@Override
@Before
@@ -175,7 +177,8 @@
BluetoothDevice initialDevice) {
resetMocks();
BluetoothRouteManager sm = new BluetoothRouteManager(mContext,
- new TelecomSystem.SyncRoot() { }, mDeviceManager, mTimeoutsAdapter);
+ new TelecomSystem.SyncRoot() { }, mDeviceManager,
+ mTimeoutsAdapter, mCommunicationDeviceTracker);
sm.setListener(mListener);
sm.setInitialStateForTesting(initialState, initialDevice);
waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java b/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
index 5eecccc..b31ad5f 100644
--- a/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
+++ b/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
@@ -28,6 +28,7 @@
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.os.SomeArgs;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
@@ -263,6 +264,7 @@
@Mock private BluetoothLeAudio mBluetoothLeAudio;
@Mock private Timeouts.Adapter mTimeoutsAdapter;
@Mock private BluetoothRouteManager.BluetoothStateListener mListener;
+ @Mock private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
@Override
@Before
@@ -413,7 +415,8 @@
when(mTimeoutsAdapter.getBluetoothPendingTimeoutMillis(
nullable(ContentResolver.class))).thenReturn(100000L);
BluetoothRouteManager sm = new BluetoothRouteManager(mContext,
- new TelecomSystem.SyncRoot() { }, mDeviceManager, mTimeoutsAdapter);
+ new TelecomSystem.SyncRoot() { }, mDeviceManager,
+ mTimeoutsAdapter, mCommunicationDeviceTracker);
sm.setListener(mListener);
sm.setInitialStateForTesting(initialState, initialDevice);
waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
index 569c487..5b3d6f1 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
@@ -29,6 +29,7 @@
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.Call;
import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -50,6 +51,7 @@
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -100,6 +102,7 @@
private AudioManager mockAudioManager;
private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
private HandlerThread mThreadHandler;
+ CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
@Override
@Before
@@ -110,6 +113,8 @@
mThreadHandler.start();
mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
mockAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mCommunicationDeviceTracker = new CallAudioCommunicationDeviceTracker(mContext);
+ mCommunicationDeviceTracker.setBluetoothRouteManager(mockBluetoothRouteManager);
mAudioServiceFactory = new CallAudioManager.AudioServiceFactory() {
@Override
@@ -154,7 +159,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
// Since we don't know if we're on a platform with an earpiece or not, all we can do
// is ensure the stateMachine construction didn't fail. But at least we exercised the
@@ -174,7 +180,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
Set<Call> trackedCalls = new HashSet<>(Arrays.asList(fakeCall, fakeSelfManagedCall));
@@ -220,7 +227,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_SPEAKER,
CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER);
@@ -264,7 +272,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true);
@@ -310,7 +319,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
@@ -355,7 +365,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
Collection<BluetoothDevice> availableDevices = Collections.singleton(bluetoothDevice1);
@@ -434,7 +445,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
@@ -471,7 +483,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
setInBandRing(false);
when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
@@ -512,7 +525,10 @@
.thenReturn(bluetoothDevice1);
stateMachine.sendMessage(CallAudioRouteStateMachine.BT_AUDIO_CONNECTED);
waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
- verify(mockCallAudioManager, times(1)).onRingerModeChange();
+ // It is possible that this will be called twice from ActiveBluetoothRoute#enter. The extra
+ // call to setBluetoothOn will trigger BT_AUDIO_CONNECTED, which also ends up invoking
+ // CallAudioManager#onRingerModeChange.
+ verify(mockCallAudioManager, atLeastOnce()).onRingerModeChange();
}
@SmallTest
@@ -527,7 +543,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
List<BluetoothDevice> availableDevices =
Arrays.asList(bluetoothDevice1, bluetoothDevice2, bluetoothDevice3);
@@ -578,7 +595,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
when(mockAudioManager.isSpeakerphoneOn()).thenReturn(false);
CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_SPEAKER,
@@ -610,7 +628,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
when(mockAudioManager.isSpeakerphoneOn()).thenReturn(false);
@@ -645,7 +664,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
List<BluetoothDevice> availableDevices =
Arrays.asList(bluetoothDevice1, bluetoothDevice2);
@@ -678,6 +698,106 @@
@SmallTest
@Test
+ public void testSetAndClearEarpieceCommunicationDevice() {
+ CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
+ mContext,
+ mockCallsManager,
+ mockBluetoothRouteManager,
+ mockWiredHeadsetManager,
+ mockStatusBarNotifier,
+ mAudioServiceFactory,
+ CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
+ mThreadHandler.getLooper(),
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
+ stateMachine.setCallAudioManager(mockCallAudioManager);
+
+ AudioDeviceInfo earpiece = mock(AudioDeviceInfo.class);
+ when(earpiece.getType()).thenReturn(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);
+ when(earpiece.getAddress()).thenReturn("");
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ devices.add(earpiece);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(eq(earpiece)))
+ .thenReturn(true);
+ when(mockAudioManager.getCommunicationDevice()).thenReturn(earpiece);
+
+ CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE,
+ CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER |
+ CallAudioState.ROUTE_WIRED_HEADSET);
+ stateMachine.initialize(initState);
+
+ // Switch to active
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
+ CallAudioRouteStateMachine.ACTIVE_FOCUS);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Make sure that we've successfully switched to the active earpiece and that we set the
+ // communication device.
+ assertTrue(stateMachine.isInActiveState());
+ ArgumentCaptor<AudioDeviceInfo> infoArgumentCaptor = ArgumentCaptor.forClass(
+ AudioDeviceInfo.class);
+ verify(mockAudioManager).setCommunicationDevice(infoArgumentCaptor.capture());
+ assertEquals(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE,
+ infoArgumentCaptor.getValue().getType());
+
+ // Route earpiece to speaker
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_SPEAKER,
+ CallAudioRouteStateMachine.SPEAKER_ON);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Assert that communication device was cleared
+ verify(mockAudioManager).clearCommunicationDevice();
+ }
+
+ @SmallTest
+ @Test
+ public void testSetAndClearWiredHeadsetCommunicationDevice() {
+ verifySetAndClearHeadsetCommunicationDevice(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ }
+
+ @SmallTest
+ @Test
+ public void testSetAndClearUsbHeadsetCommunicationDevice() {
+ verifySetAndClearHeadsetCommunicationDevice(AudioDeviceInfo.TYPE_USB_HEADSET);
+ }
+
+ @SmallTest
+ @Test
+ public void testActiveFocusRouteSwitchFromQuiescentBluetooth() {
+ CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
+ mContext,
+ mockCallsManager,
+ mockBluetoothRouteManager,
+ mockWiredHeadsetManager,
+ mockStatusBarNotifier,
+ mAudioServiceFactory,
+ CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
+ mThreadHandler.getLooper(),
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
+ stateMachine.setCallAudioManager(mockCallAudioManager);
+
+ // Start the route in quiescent and ensure that a switch to ACTIVE_FOCUS transitions to
+ // the corresponding active route even when there aren't any active BT devices available.
+ CallAudioState initState = new CallAudioState(false,
+ CallAudioState.ROUTE_BLUETOOTH,
+ CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_EARPIECE);
+ stateMachine.initialize(initState);
+
+ // Switch to active
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
+ CallAudioRouteStateMachine.ACTIVE_FOCUS);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Make sure that we've successfully switched to the active route on BT
+ assertTrue(stateMachine.isInActiveState());
+ }
+
+ @SmallTest
+ @Test
public void testInitializationWithEarpieceNoHeadsetNoBluetooth() {
CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE,
CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER);
@@ -761,7 +881,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.initialize();
assertEquals(expectedState, stateMachine.getCurrentCallAudioState());
}
@@ -778,7 +899,8 @@
mAudioServiceFactory,
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE,
@@ -816,7 +938,8 @@
mAudioServiceFactory,
earpieceControl,
mThreadHandler.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.initialize();
assertEquals(expectedState, stateMachine.getCurrentCallAudioState());
}
@@ -856,4 +979,58 @@
doNothing().when(mockConnectionServiceWrapper).onCallAudioStateChanged(any(Call.class),
any(CallAudioState.class));
}
+
+ private void verifySetAndClearHeadsetCommunicationDevice(int audioType) {
+ CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
+ mContext,
+ mockCallsManager,
+ mockBluetoothRouteManager,
+ mockWiredHeadsetManager,
+ mockStatusBarNotifier,
+ mAudioServiceFactory,
+ CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
+ mThreadHandler.getLooper(),
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
+ stateMachine.setCallAudioManager(mockCallAudioManager);
+
+ AudioDeviceInfo headset = mock(AudioDeviceInfo.class);
+ when(headset.getType()).thenReturn(audioType);
+ when(headset.getAddress()).thenReturn("");
+ List<AudioDeviceInfo> devices = new ArrayList<>();
+ devices.add(headset);
+
+ when(mockAudioManager.getAvailableCommunicationDevices())
+ .thenReturn(devices);
+ when(mockAudioManager.setCommunicationDevice(eq(headset)))
+ .thenReturn(true);
+ when(mockAudioManager.getCommunicationDevice()).thenReturn(headset);
+
+ CallAudioState initState = new CallAudioState(false,
+ CallAudioState.ROUTE_WIRED_HEADSET,
+ CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_EARPIECE);
+ stateMachine.initialize(initState);
+
+ // Switch to active
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
+ CallAudioRouteStateMachine.ACTIVE_FOCUS);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Make sure that we've successfully switched to the active headset and that we set the
+ // communication device.
+ assertTrue(stateMachine.isInActiveState());
+ ArgumentCaptor<AudioDeviceInfo> infoArgumentCaptor = ArgumentCaptor.forClass(
+ AudioDeviceInfo.class);
+ verify(mockAudioManager).setCommunicationDevice(infoArgumentCaptor.capture());
+ assertEquals(audioType, infoArgumentCaptor.getValue().getType());
+
+ // Route out of headset route
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
+ CallAudioRouteStateMachine.ACTIVE_FOCUS);
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.USER_SWITCH_EARPIECE);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Assert that communication device was cleared
+ verify(mockAudioManager).clearCommunicationDevice();
+ }
}
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteTransitionTests.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteTransitionTests.java
index cf684de..804ef17 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteTransitionTests.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteTransitionTests.java
@@ -20,6 +20,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -40,6 +41,7 @@
import android.test.suitebuilder.annotation.SmallTest;
import com.android.server.telecom.Call;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.CallAudioRouteStateMachine;
import com.android.server.telecom.CallsManager;
@@ -155,6 +157,7 @@
@Mock StatusBarNotifier mockStatusBarNotifier;
@Mock Call fakeCall;
@Mock CallAudioManager mockCallAudioManager;
+ private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
private CallAudioManager.AudioServiceFactory mAudioServiceFactory;
private static final int TEST_TIMEOUT = 500;
private AudioManager mockAudioManager;
@@ -174,6 +177,8 @@
mHandlerThread.start();
mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
mockAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mCommunicationDeviceTracker = new CallAudioCommunicationDeviceTracker(mContext);
+ mCommunicationDeviceTracker.setBluetoothRouteManager(mockBluetoothRouteManager);
mAudioServiceFactory = new CallAudioManager.AudioServiceFactory() {
@Override
@@ -270,7 +275,8 @@
mAudioServiceFactory,
mParams.earpieceControl,
mHandlerThread.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
setupMocksForParams(stateMachine, mParams);
@@ -311,7 +317,7 @@
break;
case ON:
if (mParams.expectedBluetoothDevice == null) {
- verify(mockBluetoothRouteManager).connectBluetoothAudio(null);
+ verify(mockBluetoothRouteManager, atLeastOnce()).connectBluetoothAudio(null);
} else {
verify(mockBluetoothRouteManager).connectBluetoothAudio(
mParams.expectedBluetoothDevice.getAddress());
@@ -367,7 +373,8 @@
mAudioServiceFactory,
mParams.earpieceControl,
mHandlerThread.getLooper(),
- Runnable::run /** do async stuff sync for test purposes */);
+ Runnable::run /** do async stuff sync for test purposes */,
+ mCommunicationDeviceTracker);
stateMachine.setCallAudioManager(mockCallAudioManager);
// Set up bluetooth and speakerphone state
diff --git a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
index 8a7d22c..ddb48ec 100644
--- a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
@@ -85,6 +85,7 @@
import com.android.server.telecom.AsyncRingtonePlayer;
import com.android.server.telecom.Call;
import com.android.server.telecom.CallAnomalyWatchdog;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.CallAudioModeStateMachine;
import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -258,6 +259,7 @@
@Mock private Ringer.AccessibilityManagerAdapter mAccessibilityManagerAdapter;
@Mock private BlockedNumbersAdapter mBlockedNumbersAdapter;
@Mock private PhoneCapability mPhoneCapability;
+ @Mock private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
@Mock private CallStreamingNotification mCallStreamingNotification;
private CallsManager mCallsManager;
@@ -278,7 +280,7 @@
when(mCallEndpointControllerFactory.create(any(), any(), any())).thenReturn(
mCallEndpointController);
when(mCallAudioRouteStateMachineFactory.create(any(), any(), any(), any(), any(), any(),
- anyInt(), any())).thenReturn(mCallAudioRouteStateMachine);
+ anyInt(), any(), any())).thenReturn(mCallAudioRouteStateMachine);
when(mCallAudioModeStateMachineFactory.create(any(), any()))
.thenReturn(mCallAudioModeStateMachine);
when(mClockProxy.currentTimeMillis()).thenReturn(System.currentTimeMillis());
@@ -330,6 +332,7 @@
mBlockedNumbersAdapter,
TransactionManager.getTestInstance(),
mEmergencyCallDiagnosticLogger,
+ mCommunicationDeviceTracker,
mCallStreamingNotification);
when(mPhoneAccountRegistrar.getPhoneAccount(
diff --git a/tests/src/com/android/server/telecom/tests/RingbackPlayerTest.java b/tests/src/com/android/server/telecom/tests/RingbackPlayerTest.java
new file mode 100644
index 0000000..8de5e28
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/RingbackPlayerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 com.android.server.telecom.tests;
+
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.server.telecom.Call;
+import com.android.server.telecom.CallState;
+import com.android.server.telecom.InCallTonePlayer;
+import com.android.server.telecom.RingbackPlayer;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+
+import java.util.concurrent.CountDownLatch;
+
+@RunWith(JUnit4.class)
+public class RingbackPlayerTest extends TelecomTestCase {
+ @Mock InCallTonePlayer.Factory mFactory;
+ @Mock Call mCall;
+ @Mock InCallTonePlayer mTonePlayer;
+
+ private RingbackPlayer mRingbackPlayer;
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ when(mFactory.createPlayer(anyInt())).thenReturn(mTonePlayer);
+ mRingbackPlayer = new RingbackPlayer(mFactory);
+ }
+
+ @SmallTest
+ @Test
+ public void testPlayerSync() {
+ // make sure InCallTonePlayer try to start playing the tone after RingbackPlayer receives
+ // stop tone request.
+ CountDownLatch latch = new CountDownLatch(1);
+ doReturn(CallState.DIALING).when(mCall).getState();
+ doAnswer(x -> {
+ new Thread(() -> {
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }).start();
+ return true;
+ }).when(mTonePlayer).startTone();
+
+ mRingbackPlayer.startRingbackForCall(mCall);
+ mRingbackPlayer.stopRingbackForCall(mCall);
+ assertFalse(mRingbackPlayer.isRingbackPlaying());
+ latch.countDown();
+ }
+}
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index b962b2a..32437e8 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -69,6 +69,7 @@
import com.android.internal.telecom.IInCallAdapter;
import com.android.server.telecom.AsyncRingtonePlayer;
+import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.CallAudioModeStateMachine;
import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -214,6 +215,8 @@
@Mock Ringer.AccessibilityManagerAdapter mAccessibilityManagerAdapter;
@Mock
BlockedNumbersAdapter mBlockedNumbersAdapter;
+ @Mock
+ CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;
final ComponentName mInCallServiceComponentNameX =
new ComponentName(
@@ -518,7 +521,8 @@
StatusBarNotifier statusBarNotifier,
CallAudioManager.AudioServiceFactory audioServiceFactory,
int earpieceControl,
- Executor asyncTaskExecutor) {
+ Executor asyncTaskExecutor,
+ CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
return new CallAudioRouteStateMachine(context,
callsManager,
bluetoothManager,
@@ -528,7 +532,8 @@
// Force enable an earpiece for the end-to-end tests
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
mHandlerThread.getLooper(),
- Runnable::run /* async tasks as now sync for testing! */);
+ Runnable::run /* async tasks as now sync for testing! */,
+ communicationDeviceTracker);
}
},
new CallAudioModeStateMachine.Factory() {