[automerger skipped] Merge "Binds to 3rd-party InCallService with MANAGE_ONGOING_CALL permission" into rvc-qpr-dev-plus-aosp am: 9d151e24c8 -s ours
am skip reason: Change-Id I28ada2b72d3955dfd500d34317b24dd7385fbc2b with SHA-1 4cc5a541d2 is in history
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telecomm/+/12974617
Change-Id: Ie14f899f149f9fe2a3ede29eb5f26e6daa2bf90b
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 327d0a2..45e3151 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -47,6 +47,7 @@
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.STOP_APP_SWITCHES"/>
<uses-permission android:name="android.permission.VIBRATE"/>
@@ -165,6 +166,7 @@
<activity-alias android:name="PrivilegedCallActivity"
android:targetActivity=".components.UserCallActivity"
android:permission="android.permission.CALL_PRIVILEGED"
+ android:exported="true"
android:process=":ui">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.CALL_PRIVILEGED"/>
@@ -200,6 +202,7 @@
<activity-alias android:name="EmergencyCallActivity"
android:targetActivity=".components.UserCallActivity"
android:permission="android.permission.CALL_PRIVILEGED"
+ android:exported="true"
android:process=":ui">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.CALL_EMERGENCY"/>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 1c2d161..e9db1ef 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"የጀርባ ጥሪ"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ጥሪን ወደ ጀርባ አስቀምጧል። ይህ መተግበሪያ ጥሪው ላይ ኦዲዮ ላይ እየደረሰ ወይም እያጫወተ ሊሆን ይችላል።"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"የተበላሸ የስልክ መተግበሪያ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"የስልክ መተግበሪያዎ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ተበላሽቷል። ከእርስዎ መሣሪያ ጋር የመጣውን የስልክ መተግበሪያ በመጠቀም ጥሪዎ ቀጥሏል።"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ጥሪ ፀጥ ብሏል"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"የስልክ ድምፅ ማጉያ ነቅቷል።"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"አሁን ማውራት አልችልም። ሰላም ነው?"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 70d2334..d939749 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"مكالمة في الخلفية"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"وضَع <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> مكالمة في الخلفية. يمكن لهذا التطبيق الوصول إلى الصوت وتشغيله عبر المكالمة."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"لقد تعطّل تطبيق الهاتف"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"لقد تعطّل تطبيق هاتفك <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>. تمت مواصلة مكالمتك باستخدام تطبيق \"الهاتف\" الذي أتى مع جهازك."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"تم كتم صوت المكالمة."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"تم تفعيل مكبر صوت الهاتف."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"لا يمكنني التحدث الآن. ما الأمر؟"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 3668e38..83b34f8 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Фонавы выклік"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Праграма \"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g>\" перавяла выклік у фонавы рэжым і можа прайграваць аўдыя падчас выкліку."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Збой у праграме \"Тэлефон\""</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"У праграме \"<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>\" адбыўся збой. Выклік працягнуты ў стандартнай праграме \"Тэлефон\" на прыладзе."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Гук выключаны."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Уключаная гучная сувязь."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Не магу гаварыць. У чым справа?"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index cfb9c12..b7a65ab 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Обаждане: заден план"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> постави обаждане на заден план. Приложението може да има достъп до обаждането и да възпроизвежда звук върху него."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Приложение за телефон с прекъсната работа"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Приложението за телефон <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> претърпя срив. Обаждането ви продължи чрез използването на приложението за телефон, което сте получили с устройството си."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Обаждането бе спряно."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Високоговорителят бе активиран."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Сега не мога да говоря. Какво има?"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 7bdbcf7..5092328 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"ব্যাকগ্রাউন্ডের কল"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ব্যাকগ্রাউন্ডে কল রেখেছে। এই অ্যাপটি হয়ত কলের মাধ্যমে অডিও অ্যাক্সেস করে চালাচ্ছে।"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ক্র্যাশ হওয়া ফোন অ্যাপ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"আপনার ফোন অ্যাপ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ক্র্যাশ হয়েছে। আপনার ডিভাইসের ফোন অ্যাপ ব্যবহার করে করা কল সম্পূর্ণ করা হচ্ছে।"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"কল মিউট করা আছে৷"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"স্পীকারফোন সক্ষম করা আছে৷"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"এখন কথা বলতে পারছি না৷ কি খবর?"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index f6619e5..8a59e1f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Poziv u pozadini"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Aplikacija <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> je uputila poziv u pozadini. Ova aplikacija može pristupati zvuku i reproducirati ga tokom poziva."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Pad aplikacije za telefon"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Došlo je do pada aplikacije za telefon <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>. Vaš poziv se nastavio putem aplikacije za telefon koju ste dobili uz uređaj."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Zvuk poziva je isključen."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Zvučnik je omogućen."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Ne mogu sada pričati. O čemu se radi?"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 2d856b1..79e59a9 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Κλήση στο παρασκήνιο"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Η εφαρμογή <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> πραγματοποίησε μια κλήση στο παρασκήνιο. Η εφαρμογή αυτή ενδέχεται να έχει δικαίωμα προσπέλασης και αναπαραγωγής ήχου κατά τη διάρκεια της κλήσης."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Εφαρμογή τηλεφώνου που αντιμετώπισε σφάλμα λειτουργίας"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Η εφαρμογή τηλεφώνου <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> αντιμετώπισε σφάλμα λειτουργίας. Η κλήση σας συνεχίστηκε μέσω της αρχικής εφαρμογής τηλεφώνου της συσκευής σας."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Η κλήση τέθηκε σε σίγαση."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Η ανοικτή συνομιλία ενεργοποιήθηκε."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Δεν μπορώ τώρα. Συμβαίνει κάτι;"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 89ba06f..83079f9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Llamada en 2.° plano"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> movió una a segundo plano. Es posible que esta app acceda a la llamada y reproduzca audio."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"App de teléfono con fallas"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Tu app de teléfono <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> falló. La llamada continuó a través de la app de teléfono de tu dispositivo."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Llamada silenciada"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Altavoz habilitado"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"No puedo hablar ahora. ¿Todo bien?"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 71531f1..bc93638 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Taustal olev kõne"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> lülitas kõne taustale. See rakendus võib helile juurde pääseda ja seda kõne ajal esitada."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Kokkujooksnud telefonirakendus"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Teie telefonirakendus <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> jooksis kokku. Kõnet jätkati teie seadmega kaasas olnud telefonirakendusega."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Kõne on summutatud."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Valjuhääldi on sisse lülitatud."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Ei saa praegu rääkida. Milles asi?"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index ab0830c..2c46993 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Taustapuhelu"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> on asettanut puhelun taustalle. Tämä sovellus voi käyttää ja toistaa ääntä puhelun päällä."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Kaatunut puhelinsovellus"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Puhelinsovellus <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> kaatui. Puhelua jatkettiin laitteen mukana tulleella puhelinsovelluksella."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Puhelu mykistetty."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Kaiutin käytössä."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"En voi vastata. Mitä asiaa?"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 24c2eff..dc41023 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Appel en arrière-plan"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> a passé un appel en arrière-plan. Cette application peut accéder à l\'audio de l\'appel et faire jouer un contenu audio par l\'intermédiaire de l\'appel."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"L\'application téléphonique a planté"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Votre application téléphonique <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> a planté. Votre appel s\'est poursuivi au moyen de l\'application téléphonique intégrée à votre appareil."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Son coupé"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Haut-parleur activé"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Peux pas parler. Quoi de neuf?"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 071f208..355f480 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Appel en arrière-plan"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> a placé un appel en arrière-plan. Il est possible que cette application lise des fichiers audio pendant l\'appel."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Une application d\'appel a planté"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"L\'application <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> a planté. L\'appel s\'est poursuivi dans l\'application d\'appel préinstallée sur votre appareil."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Son coupé"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Haut-parleur activé"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Je ne peux pas répondre. Ça va ?"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index d558f99..382f649 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Chamada seg. plano"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> chamou en segundo plano. Pode que esta aplicación acceda ao audio e o reproduza durante a chamada."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Fallou a aplicación de teléfono"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Fallou a aplicación de teléfono <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>. A chamada continuou coa aplicación Teléfono do teu dispositivo."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Chamada silenciada"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Altofalante activado"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Non podo falar agora. Que pasa?"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index c20fb1b..575f4c2 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"બૅકગ્રાઉન્ડ કૉલ"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g>એ કૉલ બેકગ્રાઉન્ડમાં રાખ્યો છે. આ ઍપ કૉલ પરથી ઑડિયો ઍક્સેસ કરીને તેને ચલાવી શકે છે."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ફોન ઍપ ક્રૅશ થઈ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"તમારી ફોન ઍપ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ક્રૅશ થઈ ગઈ છે. તમારો કૉલ તમારા ડિવાઇસમાં પહેલેથી ઇન્સ્ટૉલ કરેલી ફોન ઍપનો ઉપયોગ કરીને ચાલુ રાખવામાં આવ્યો છે."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"કૉલ મ્યૂટ કરેલ છે."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"સ્પીકરફોન પસંદ કરેલ છે."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"હમણાં વાત નહીં કરી શકું. શું હતું?"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index cfea7a5..2d23726 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"बैकग्राउंड कॉल"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ने कॉल को बैकग्राउंड में रखा है हो सकता है कि यह ऐप्लिकेशन आपके कॉल से ऑडियो ऐक्सेस करके उसे चला रहा हो."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"फ़ोन ऐप्लिकेशन जो बंद हो गया"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"आपका फ़ोन ऐप <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> बंद हो गया है. आपके कॉल को डिवाइस में पहले से इंस्टॉल फ़ोन ऐप का इस्तेमाल करके जारी रखा गया है."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"कॉल म्यूट की गई."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"स्पीकरफ़ोन सक्षम."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"अभी बात नहीं हो सकती. क्या हो रहा है?"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 184ebfb..2dd15b8 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Poziv u pozadini"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Aplikacija <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> prebacila je poziv u pozadinu. Ta aplikacija možda pristupa zvuku i reproducira ga putem poziva."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplikacija telefona srušila se"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikacija telefona <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> srušila se. Vaš je poziv nastavljen pomoću aplikacije telefona koju ste dobili na uređaju."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Zvuk poziva isključen."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Zvučnik je omogućen."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Sada ne mogu razgovarati. Što ima?"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 47bda07..de71322 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -31,7 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Panggilan latar belakang"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> telah menempatkan panggilan telepon ke latar belakang. Aplikasi ini mungkin mengakses dan memutar audio melalui panggilan telepon."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplikasi telepon error"</string>
- <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikasi telepon <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> mengalami error. Panggilan Anda dilanjutkan menggunakan aplikasi telepon yang disertakan dengan perangkat."</string>
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikasi telepon <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> mengalami error. Panggilan Anda dilanjutkan menggunakan aplikasi telepon bawaan perangkat Anda."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Panggilan disenyapkan."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Pengeras suara ponsel diaktifkan."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Tak bisa bicara sekarang. Ada apa?"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index a7037cc..89ac403 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Bakgrunnssímtal"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> hefur sett símtal í bakgrunn. Hugsanlega fær þetta forrit aðgang að hljóði yfir símtalið og spilar það."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Hrun í símaforriti"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Símaforritið <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> hrundi. Haldið var áfram með símtalið í símaforritinu sem fylgdi tækinu."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Símtal þaggað."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Kveikt á hátalara."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Kemst ekki í símann. Eitthvað títt?"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index ba34c94..4db3f0f 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"In sottofondo"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ha spostato una chiamata in sottofondo. L\'app potrà accedere all\'audio e riprodurlo in sovrapposizione alla chiamata."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"App per telefono arrestata in modo anomalo"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"La tua app per telefono <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ha avuto un arresto anomalo. La tua chiamata ha potuto continuare mediante l\'app per telefono integrata nel tuo dispositivo."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Chiamata disattivata."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Vivavoce attivo."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Non posso parlare ora. Che succede?"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 1937bf4..9939901 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"バックグラウンド通話"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> が通話をバックグラウンドに切り替えました。これで、このアプリは通話を通じて音声にアクセスして再生できます。"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"スマートフォン アプリがクラッシュしました"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ご利用の通話アプリ(<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>)がクラッシュしました。通話は、デバイスにプリインストールされていた通話アプリを使用して継続されました。"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"通話がミュートされています。"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"スピーカーが有効です。"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ただいま電話に出られません。ご用件をお知らせください。"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 442f54a..a50572d 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"ზარი ფონში"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g>-მა განათავსა ზარი ფონში. ამ აპმა შეიძლება წვდომა იქონიოს აუდიოზე ზარიდან და დაუკრას ის."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ავარიულად გათიშული ტელეფონის აპი"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"თქვენი ტელეფონის აპი <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> გათიშულია ავარიულად. თქვენი ზარი გაგრძელდა იმ ტელეფონის აპის გამოყენებით, რომელიც თქვენს მოწყობილობას მოჰყვა."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ზარი დადუმებულია."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"სპიკერები ჩართულია."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ვერ ვპასუხობ. რა ხდება?"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 6155604..9cb5728 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Фондық қоңырау"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> қоңырауды фондық режимге ауыстырды. Бұл қолданба қоңырау барысында аудионы пайдалана және ойната алады."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Бұзылған телефон қолданбасы"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> телефон қолданбасы бұзылды. Қоңырау құрылғының әдепкі телефон қолданбасы арқылы жалғастырылды."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Қоңырау үнсіздендірілген."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Үндеткішті телефон қосылды."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Қазір сөйлесе алмаймын. Не болды?"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index c7873f5..9aa59de 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"ಹಿನ್ನೆಲೆ ಕರೆ"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ಆ್ಯಪ್, ಕರೆಯನ್ನು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಇರಿಸಿದೆ. ಈ ಆ್ಯಪ್ ಕರೆಯ ಮೂಲಕ ಆಡಿಯೊವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಮತ್ತು ಪ್ಲೇ ಮಾಡಬಹುದು."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ಕ್ರ್ಯಾಶ್ ಆಗಿರುವ ಫೋನ್ ಆ್ಯಪ್"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ನಿಮ್ಮ ಫೋನ್ ಆ್ಯಪ್ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ. ಸಾಧನದ ಜೊತೆಗೆ ನೀಡಲಾದ ಫೋನ್ ಆ್ಯಪ್ ಬಳಸಿ ನಿಮ್ಮ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ಕರೆಯನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"ಸ್ಪೀಕರ್ಫೋನ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ಕ್ಷಮಿಸಿ, ಈಗ ಮಾತನಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಸಮಾಚಾರವೇನು?"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 03a89d6..079d007 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"백그라운드 통화"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g>에서 통화를 백그라운드로 전환했습니다. 앱이 통화에 사용되는 오디오에 액세스하거나 재생 중일 수 있습니다."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"다운된 전화 앱"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"전화 앱 <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>이(가) 다운되었습니다. 통화는 기기의 기본 전화 앱을 사용하여 계속 진행되었습니다."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"통화가 음소거되었습니다."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"스피커폰이 사용 설정되었습니다."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"통화 불가. 용무를 남겨주세요."</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index d5c2e6c..caf6408 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"ການໂທໃນພື້ນຫຼັງ"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ວາງການໂທໄວ້ພື້ນຫຼັງແລ້ວ. ແອັບນີ້ອາດເຂົ້າເຖິງ ແລະ ຫຼິ້ນສຽງຜ່ານການໂທໄດ້."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ແອັບໂທລະສັບຂັດຂ້ອງ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ແອັບໂທລະສັບຂອງທ່ານ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ຂັດຂ້ອງ. ການໂທຂອງທ່ານສືບຕໍ່ໂດຍໃຊ້ແອັບໂທລະສັບທີ່ມາພ້ອມກັບອຸປະກອນຂອງທ່ານ."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ປິດສຽງການໂທແລ້ວ."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"ເປີດລຳໂພງແລ້ວ."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ບໍ່ສາມາດລົມໄດ້ໃນຕອນນີ້. ມີຫຍັງບໍ່?"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 7acbc58..a4da042 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Skambutis fone"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Programa „<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g>“ perkėlė skambutį į foną. Ši programa gali pasiekti ir leisti garsą vykstant skambučiui."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Užstrigusi telefono programa"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Telefono programa „<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>“ užstrigo. Skambutis buvo tęsiamas naudojant telefono programą, kuri buvo įrenginyje jį įsigijus."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Skambutis nutildytas."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Garsiakalbis įgalintas."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Dabar negaliu kalbėti. Kas nutiko?"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 1e88d48..7bac553 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Saruna fonā"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> pārcēla sarunu uz darbību fonā. Sarunas laikā šī lietotne var piekļūt audio saturam un to atskaņot."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Avarējusī tālruņa lietotne"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Jūsu tālruņa lietotne <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> avarēja. Zvans tika turpināts, izmantojot ierīcē iebūvēto tālruņa lietotni."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Zvana skaņa ir izslēgta."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Skaļrunis ir iespējots."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Nevaru runāt. Kas gadījās?"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 4cc54b1..f8f84c8 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Повик во заднина"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> воспостави повик во заднината. Апликацијава можеби пристапува до и пушта аудио во повикот."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Падната апликација за телефон"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Апликацијата за телефон <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> падна. Повикот продолжи на апликацијата за телефон што дојде со уредот."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Повикот е со исклучен звук"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Интерфонот е овозможен."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Не можам да зборувам сега. Што има?"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index de08a5b..9318177 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"പശ്ചാത്തല കോൾ"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> കോൾ പശ്ചാത്തലത്തിലേക്ക് മാറ്റി. കോൾ ചെയ്യുമ്പോൾ ഈ ആപ്പിന് ഓഡിയോ ആക്സസ് ചെയ്യാനും പ്ലേ ചെയ്യാനും കഴിഞ്ഞേക്കാം."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ക്രാഷായ ഫോൺ ആപ്പ്"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"നിങ്ങളുടെ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ഫോൺ ആപ്പ് ക്രാഷായി. നിങ്ങളുടെ ഉപകരണത്തിനൊപ്പം ലഭ്യമായ ഫോൺ ആപ്പ് മുഖേന കോൾ തുടർന്നു."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"കോൾ നിശബ്ദമാക്കി."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"സ്പീക്കർഫോൺ പ്രവർത്തനക്ഷമമാക്കി."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ഇപ്പോൾ സംസാരിക്കാനാകില്ല. എന്താ വിളിച്ചത്?"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 5230356..f334b6d 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"बॅकग्राउंड कॉल"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> यांनी कॉल बॅकग्राउंडवर ठेवला आहे हे ॲप कदाचित कॉलद्वारे ऑडिओ ॲक्सेस आणि प्ले करत आहे."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"क्रॅश झालेले फोन ॲप"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"तुमचे फोन ॲप <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> क्रॅश झाले. तुमच्या डिव्हाइससोबत दिलेले फोन अॅप वापरून तुमचा कॉल पुढे सुरू ठेवला गेला."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"कॉल नि.शब्द केला."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"स्पीकरफोन सक्षम केला."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"आत्ता बोलू शकत नाही. कशासाठी कॉल केला होता?"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index fe724dc..9f45baf 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"နောက်ခံမှ ခေါ်ဆိုမှု"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> သည် ခေါ်ဆိုမှုကို နောက်ခံသို့ ထည့်လိုက်ပါသည်။ ဤအက်ပ်သည် ခေါ်ဆိုမှုမှတစ်ဆင့် အသံများကို သုံးခြင်းနှင့် ဖွင့်ခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ရပ်တန့်သွားသော ဖုန်းအက်ပ်"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"သင်၏ ဖုန်းအက်ပ် <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ရပ်တန့်သွားသည်။ သင့်စက်ပစ္စည်းနှင့် အတူပါလာသော ဖုန်းအက်ပ်သုံးပြီး ခေါ်ဆိုမှုကို ဆက်လက်ပြုလုပ်ထားသည်။"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"နားထောင်ရုံသာ (စကားပြောပိတ်ထားသည်)"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"စပီကာဖုန်း သုံးလို့ရသည်"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"အခုပြောလို့မရဘူး။ အကြောင်းထူးရှိလား။"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 915c37b..5f2c66e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Bakgrunnsanrop"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> har flyttet et anrop til bakgrunnen. Det kan hende denne appen bruker og spiller av lyd over anropet."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Krasjet telefonapp"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Telefonappen din, <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>, har krasjet. Anropet ditt ble fortsatt med telefonappen som fulgte med enheten din."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Samtalelyd er kuttet."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Høyttaler er aktivert."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Kan ikke snakke nå. Hva skjer?"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 9acbdcf..1d310b1 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"पृष्ठभूमिको कल"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ले एउटा कल पृष्ठभूमिमा राखेको छ। कल गरेको बेला यो अनुप्रयोगले अडियोमाथि पहुँच राखेर प्ले गरिरहेको हुन सक्छ।"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"क्र्यास भएको फोन एप"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"तपाईंको फोन एप <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> क्र्यास भएको छ। तपाईंको यन्त्रमा पहिलेदेखि नै रहेको फोन अनुप्रयोग प्रयोग गरी तपाईंको कल जारी राखिएको थियो।"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"कल म्युट भयो।"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"स्पिकरफोन सक्षम भयो।"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"अहिले कुरा गर्न मिल्दैन। के भइरहेको छ?"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 10b8d82..f23b657 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Achtergrondgesprek"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> heeft een gesprek op de achtergrond geplaatst. Deze app kan audio openen en afspelen over het gesprek."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Gecrashte telefoon-app"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Je telefoon-app <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> is gecrasht. Je gesprek is voortgezet met de telefoon-app van je apparaat."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Gesprek gedempt."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Luidspreker is aan."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Kan nu niet opnemen. Alles goed?"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 40f513c..a48ed04 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ କଲ୍"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଏକ କଲ୍ କରିଛି। ଏହା ଆପ୍ କଲ୍ ସମୟରେ ଅଡିଓ ଆକ୍ସେସ୍ କରିପାରେ ଏବଂ ଚଲେଇପାରେ।"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"କ୍ରାଶ୍ ହୋଇଥିବା ଫୋନ୍ ଆପ୍"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ଆପଣଙ୍କର ଫୋନ୍ ଆପ୍ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> କ୍ରାଶ୍ ହୋଇଯାଇଛି। ଆପଣଙ୍କ ଡିଭାଇସରେ ଥିବା ଫୋନ୍ ଆପ୍ ବ୍ୟବହାର କରି ଆପଣଙ୍କର କଲକୁ ଜାରି ରଖାଯାଇଥିଲା।"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"କଲ୍ ମ୍ୟୁଟ୍ କରାଯାଇଛି।"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"ସ୍ପିକରଫୋନ୍କୁ ସକ୍ଷମ କରାଯାଇଛି ।"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ବର୍ତ୍ତମାନ କଥା ହୋଇପାରିବ ନାହିଁ। କଥା କ’ଣ?"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 5a5bc35..b8b0bb3 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Background call"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> has placed a call into the background. This app may be accessing and playing audio over the call."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"ਕ੍ਰੈਸ਼ ਹੋਈ ਫ਼ੋਨ ਐਪ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ਤੁਹਾਡੀ ਫ਼ੋਨ ਐਪ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ਕ੍ਰੈਸ਼ ਹੋ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਪਹਿਲਾਂ ਤੋਂ ਸਥਾਪਤ ਫ਼ੋਨ ਐਪ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤੁਹਾਡੀ ਕਾਲ ਜਾਰੀ ਰੱਖੀ ਗਈ।"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ਕਾਲ ਮਿਊਟ ਕੀਤੀ।"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"ਸਪੀਕਰਫੋਨ ਸਮਰਥਿਤ।"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ਹੁਣੇ ਗੱਲ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਕੀ ਹੋਇਆ?"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index d103958..ad1df2a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Połączenie w tle"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Aplikacja <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> umieściła połączenie w tle. Może ona uzyskiwać dostęp do dźwięku i odtwarzać go podczas połączenia."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplikacja telefoniczna uległa awarii"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikacja do obsługi telefonu (<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>) uległa awarii. Połączenie zostało utrzymane za pomocą aplikacji do obsługi telefonu zainstalowanej na urządzeniu."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Połączenie wyciszone."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Głośnik włączony."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Nie mogę rozmawiać. Co słychać?"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index e91ac83..0d88aed 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Cham. segundo plano"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> colocou uma chamada em segundo plano. Esta aplicação pode estar a aceder e a reproduzir áudio sobre a chamada."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplicação Telefone com falha"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Ocorreu uma falha na sua aplicação telefone <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>. A sua chamada foi continuada através da aplicação telefone incluída com o dispositivo."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Chamada sem som."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Alta voz ativada."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Não posso falar agora. Que se passa?"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 808da40..d5a49a3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Фоновый вызов"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Приложение <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> перевело вызов в фоновый режим. Это приложение может получать доступ к аудио вызова или воспроизводить в нем свое аудио."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Прекращена работа приложения телефона"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Работа приложения <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> на вашем смартфоне прервана из-за возникшей ошибки. Вызов был продолжен с использованием приложения \"Телефон\", которое установлено на ваше устройство производителем."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Звук выключен."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Громкая связь включена."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Не могу говорить. Что случилось?"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 9ce63d4..8e371a8 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"පසුබිම් ඇමතුම"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> පසුබිම තුළට ඇමතුමක් ගෙන ඇත. මෙම යෙදුම ඇමතුම හරහා ඕඩියෝ වෙත ප්රවේශ වෙමින් සහ වාදනය කරමින් සිටිය හැකිය."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"බිඳ වැටුණු දුරකථන යෙදුම"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"ඔබේ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> දුරකථන යෙදුම බිඳ වැටී ඇත. ඔබේ උපාංගය සමඟ පැමිණි දුරකථන යෙදුම භාවිතයෙන් ඔබේ ඇමතුම කෙරීගෙන යන ලදී."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ඇමතුම නිශ්ශබ්දයි."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"ස්පිකර්ෆෝන් සබලයි."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"දැන් කතාකරන්න බැහැ. මොකද වෙලා තියෙන්නෙ?"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index af4dedf..9a5d490 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Hovor na pozadí"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Aplikácia <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> umiestnila hovor do pozadia. Táto aplikácia môže mať počas hovoru prístup k zvuku a prehrávať ho."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Telefónna aplikácia sa zrútila"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Vaša telefónna aplikácia <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> sa zrútila. Hovor pokračoval v telefónnej aplikácii, ktorá bola vopred nainštalovaná vo vašom zariadení."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Zvuk hovoru bol vypnutý."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Reproduktor je povolený."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Teraz nemôžem hovoriť, o čo ide?"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 7cb871e..94cc680 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Klic v ozadju"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Aplikacija <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> je klic premaknila v ozadje. Ta aplikacija morda dostopa do zvoka in ga predvaja prek klica."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplikacija za klicanje se je zrušila"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikacija za klicanje <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> se je zrušila. Klic se je nadaljeval prek aplikacije za klicanje, ki jo je v napravo namestil proizvajalec."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Klic izključen."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Zvočnik omogočen."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Zdaj ne morem govoriti. Za kaj gre?"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 859cc05..516d5c7 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Telefonatë në sfond"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> e ka vendosur një telefonatë në sfond. Ky aplikacion mund të ketë qasje dhe të luajë audio mbi telefonatë."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Aplikacioni i telefonit që ka pësuar një ndërprerje aksidentale"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Aplikacioni i telefonit <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ka pësuar një ndërprerje aksidentale. Telefonata jote ka vazhduar me aplikacionin e telefonit që ke marrë me pajisjen tënde."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Telefonata kaloi në heshtje."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Altoparlanti u aktivizua."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Nuk flas dot tani. Si është puna?"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 90becc5..3bc02c5 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Simu ya chinichini"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> inapiga simu chinichini. Huenda programu hii inafikia na kucheza sauti huku simu ikiendelea."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Programu ya simu iliyoacha kufanya kazi"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Programu yako ya simu inayoitwa <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> imeacha kufanya kazi. Uliendelea kupiga simu kwa kutumia programu ya simu iliyokuja na kifaa chako."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Simu imezimwa."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Spika za simu zimewezeshwa"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Siwezi kuongea sasa. Kuna nini?"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 1837ef3..639ce97 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"నేపథ్యం కాల్"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> కాల్ను నేపథ్యంలోకి పంపింది. కాల్ ద్వారా ఈ యాప్, ఆడియోను యాక్సెస్ ఇంకా ప్లే చేస్తుండవచ్చు."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"క్రాష్ అయిన ఫోన్ యాప్"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"మీ ఫోన్ యాప్ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> క్రాష్ అయ్యింది. మీ పరికరంతో వచ్చిన ఫోన్ యాప్ను ఉపయోగించి మీ కాల్ కొనసాగించబడింది."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"కాల్ మ్యూట్ చేయబడింది."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"స్పీకర్ ఫోన్ ప్రారంభించబడింది."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ఇప్పుడు మాట్లాడలేను. విషయం ఏమిటి?"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1dfb513..e2aa954 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"การโทรในเบื้องหลัง"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ได้ทำการโทรในเบื้องหลัง แอปนี้อาจกำลังเข้าถึงและเล่นเสียงผ่านการโทร"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"แอปโทรศัพท์ขัดข้อง"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"แอปโทรศัพท์ <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ขัดข้อง การโทรจะดำเนินต่อไปผ่านแอปโทรศัพท์ที่มาพร้อมกับอุปกรณ์"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"ปิดเสียงการโทร"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"เปิดใช้งานลำโพงแล้ว"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ตอนนี้คุยไม่ได้ มีอะไรหรือเปล่า"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 06cd979..4050277 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Tawag sa background"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"Naglagay ng tawag ang <xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> sa background. Posibleng ina-access at pine-play ng app na ito ang audio sa tawag."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Nag-crash ang phone app"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Nag-crash ang iyong app na telepono na <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>. Ipinagpatuloy ang iyong tawag gamit ang app na telepono na kasama sa iyong device."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Naka-mute ang tawag."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Pinapagana ang speakerphone."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Di masagot ngayon. Ano\'ng meron?"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 8f93ff1..b6cc32f 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Arka plandaki arama"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> arka plana bir arama yerleştirdi. Bu uygulama arama üzerinden sese erişiyor ve ses çalıyor olabilir."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Kilitlenen telefon uygulaması"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Telefon uygulamanız <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> kilitlendi. Görüşmeniz, cihazınızla birlikte gelen telefon uygulaması kullanılarak sürdürüldü."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Çağrı sesi kapatıldı."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Hoparlör etkin."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Şimdi konuşamam. Konu nedir?"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index b0c622e..80aae40 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"پس منظر کی کال"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> نے پس منظر میں کال لگا دیا ہے۔ یہ ایپ کال کے دوران آواز تک رسائی حاصل اور چلا سکتی ہے۔"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"کریشڈ فون ایپ"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"آپ کی <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> فون ایپ ناکام ہو گئی ہے۔ آپ کے آلہ کے ساتھ آئی ہوئی فون ایپ کا استعمال کرتے ہوئے آپ کی کال کو جاری رکھا گیا تھا۔"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"کال خاموش کر دی گئی۔"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"اسپیکر فون فعال ہوگیا۔"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"ابھی بات نہیں کرسکتے۔ کیا ہو رہا ہے؟"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 253734b..9398865 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Orqa fondagi chaqiruv"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ilovasi chaqiruvni orqa fonga joyladi. Bu ilova ovozli chaqiruvga kirishi yoki unda audio ijro etishi mumkin."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Telefon ilovasi ishi xatolik tufayli to‘xtatildi"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Telefoningizdagi <xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ilovasi ishi xatolik tufayli to‘xtatildi. Chaqiruvingiz qurilmangizga avvaldan o‘rnatilgan Telefon ilovasi orqali davom ettirildi."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Qo‘ng‘iroq ovozi o‘chirildi."</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Karnaychalar yoqildi."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Hozir gaplasholmayman. Tinchlikmi?"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index e3c7f31..e4f83a1 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"后台通话"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> 已将通话切换到后台进行。此应用可以接入通话,并播放通话音频。"</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"崩溃的手机应用"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"您的手机应用“<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g>”已崩溃。系统使用设备自带的“电话”应用继续通话。"</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"通话已静音。"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"扬声器已启用。"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"现在无法接听。有什么事吗?"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 674af06..acb8f55 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -31,8 +31,7 @@
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"Ikholi engemuva"</string>
<string name="notification_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> yenze ikholi ngemuva. Kungenzeka ukuthi lolu hlelo lokusebenza lufinyelela futhi ludlala okulalelwayo ngaphezu kwekholi."</string>
<string name="notification_crashedInCallService_title" msgid="7440244344965656743">"Uhlelo lokusebenza lwefoni olukhubazekile"</string>
- <!-- no translation found for notification_crashedInCallService_body (7821729360036047995) -->
- <skip />
+ <string name="notification_crashedInCallService_body" msgid="7821729360036047995">"Uhlelo lwakho lokusebenza lwefoni lwe-<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> lukhubazekile. Ikholi yakho iye yaqhutshekiswa kusetshenziswa uhlelo lokusebenza lwefoni oluze nedivayisi yakho."</string>
<string name="accessibility_call_muted" msgid="2968461092554300779">"Ikholu ithulisiwe"</string>
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"Isipikha sefoni sinikwe amandla"</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"Angikwazi ukukhuluma okwamanje. Kwenzenjani?"</string>
diff --git a/src/com/android/server/telecom/CarModeTracker.java b/src/com/android/server/telecom/CarModeTracker.java
index e64ef5d..737ce5a 100644
--- a/src/com/android/server/telecom/CarModeTracker.java
+++ b/src/com/android/server/telecom/CarModeTracker.java
@@ -30,6 +30,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.PriorityQueue;
+import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -40,30 +41,40 @@
* Data class holding information about apps which have requested to enter car mode.
*/
private class CarModeApp {
- private @IntRange(from = 0) int mPriority;
+ private final boolean mAutomotiveProjection;
+ private final @IntRange(from = 0) int mPriority;
private @NonNull String mPackageName;
+ public CarModeApp(@NonNull String packageName) {
+ this(true, 0, packageName);
+ }
+
public CarModeApp(int priority, @NonNull String packageName) {
+ this(false, priority, packageName);
+ }
+
+ private CarModeApp(boolean automotiveProjection, int priority, @NonNull String packageName) {
+ mAutomotiveProjection = automotiveProjection;
mPriority = priority;
mPackageName = Objects.requireNonNull(packageName);
}
+ public boolean hasSetAutomotiveProjection() {
+ return mAutomotiveProjection;
+ }
+
/**
* The priority at which the app requested to enter car mode.
* Will be the same as the one specified when {@link UiModeManager#enableCarMode(int, int)}
- * was called, or {@link UiModeManager#DEFAULT_PRIORITY} if no priority was specifeid.
+ * was called, or {@link UiModeManager#DEFAULT_PRIORITY} if no priority was specified.
* @return The priority.
*/
public int getPriority() {
return mPriority;
}
- public void setPriority(int priority) {
- mPriority = priority;
- }
-
/**
- * @return The package name of the app which requested to enter car mode.
+ * @return The package name of the app which requested to enter car mode/set projection.
*/
public String getPackageName() {
return mPackageName;
@@ -72,26 +83,24 @@
public void setPackageName(String packageName) {
mPackageName = packageName;
}
- }
- /**
- * Comparator used to maintain the car mode priority queue ordering.
- */
- private class CarModeAppComparator implements Comparator<CarModeApp> {
- @Override
- public int compare(CarModeApp o1, CarModeApp o2) {
- // highest priority takes precedence.
- return Integer.compare(o2.getPriority(), o1.getPriority());
+ public String toString() {
+ return String.format("[%s, %s]",
+ mAutomotiveProjection ? "PROJECTION SET" : mPriority,
+ mPackageName);
}
}
/**
- * Priority list of apps which have entered or exited car mode, ordered with the highest
- * priority app at the top of the queue. Where items have the same priority, they are ordered
- * by insertion time.
+ * Priority list of apps which have entered or exited car mode, ordered first by whether the app
+ * has set automotive projection, and then by highest priority. Where items have the same
+ * priority, order is arbitrary, but we only allow one item in the queue per priority.
*/
private PriorityQueue<CarModeApp> mCarModeApps = new PriorityQueue<>(2,
- new CarModeAppComparator());
+ // Natural ordering of booleans is False, True. Natural ordering of ints is increasing.
+ Comparator.comparing(CarModeApp::hasSetAutomotiveProjection)
+ .thenComparing(CarModeApp::getPriority)
+ .reversed());
private final LocalLog mCarModeChangeLog = new LocalLog(20);
@@ -144,6 +153,47 @@
mCarModeApps.removeIf(c -> c.getPriority() == priority);
}
+ public void handleSetAutomotiveProjection(@NonNull String packageName) {
+ Optional<CarModeApp> projectingApp = mCarModeApps.stream()
+ .filter(CarModeApp::hasSetAutomotiveProjection)
+ .findAny();
+ // No app with automotive projection? Easy peasy, just add it.
+ if (!projectingApp.isPresent()) {
+ Log.i(this, "handleSetAutomotiveProjection: %s", packageName);
+ mCarModeChangeLog.log("setAutomotiveProjection: packageName=" + packageName);
+ mCarModeApps.add(new CarModeApp(packageName));
+ return;
+ }
+ // Otherwise an app already has automotive projection set. Is it the same app?
+ if (packageName.equals(projectingApp.get().getPackageName())) {
+ Log.w(this, "handleSetAutomotiveProjection: %s already the automotive projection app",
+ packageName);
+ return;
+ }
+ // We have a new app for automotive projection. As a shortcut just reuse the same object by
+ // overwriting the package name.
+ Log.i(this, "handleSetAutomotiveProjection: %s replacing %s as automotive projection app",
+ packageName, projectingApp.get().getPackageName());
+ mCarModeChangeLog.log("setAutomotiveProjection: " + packageName + " replaces "
+ + projectingApp.get().getPackageName());
+ projectingApp.get().setPackageName(packageName);
+ }
+
+ public void handleReleaseAutomotiveProjection() {
+ Optional<String> projectingPackage = mCarModeApps.stream()
+ .filter(CarModeApp::hasSetAutomotiveProjection)
+ .map(CarModeApp::getPackageName)
+ .findAny();
+ if (!projectingPackage.isPresent()) {
+ Log.w(this, "handleReleaseAutomotiveProjection: no current automotive projection app");
+ return;
+ }
+ Log.i(this, "handleReleaseAutomotiveProjection: %s", projectingPackage.get());
+ mCarModeChangeLog.log("releaseAutomotiveProjection: packageName="
+ + projectingPackage.get());
+ mCarModeApps.removeIf(CarModeApp::hasSetAutomotiveProjection);
+ }
+
/**
* Force-removes a package from the car mode tracking list, no matter at which priority.
*
@@ -151,19 +201,21 @@
* from the tracking list so they don't cause a leak.
* @param packageName Package name of the app to force-remove
*/
- public void forceExitCarMode(@NonNull String packageName) {
- Optional<CarModeApp> forcedApp = mCarModeApps.stream()
+ public void forceRemove(@NonNull String packageName) {
+ // We must account for the possibility that the app has set both car mode AND projection.
+ List<CarModeApp> forcedApp = mCarModeApps.stream()
.filter(c -> c.getPackageName().equals(packageName))
- .findAny();
- if (forcedApp.isPresent()) {
- String logString = String.format("forceExitCarMode: packageName=%s, was at priority=%s",
- packageName, forcedApp.get().getPriority());
+ .collect(Collectors.toList());
+ if (forcedApp.isEmpty()) {
+ Log.i(this, "Package %s is not tracked.", packageName);
+ return;
+ }
+ for (CarModeApp app : forcedApp) {
+ String logString = "forceRemove: " + app;
Log.i(this, logString);
mCarModeChangeLog.log(logString);
- mCarModeApps.removeIf(c -> c.getPackageName().equals(packageName));
- } else {
- Log.i(this, "Package %s is not tracked as requesting car mode", packageName);
}
+ mCarModeApps.removeIf(c -> c.getPackageName().equals(packageName));
}
/**
@@ -175,7 +227,7 @@
return mCarModeApps
.stream()
.sorted(mCarModeApps.comparator())
- .map(cma -> cma.getPackageName())
+ .map(CarModeApp::getPackageName)
.collect(Collectors.toList());
}
@@ -183,7 +235,7 @@
return mCarModeApps
.stream()
.sorted(mCarModeApps.comparator())
- .map(cma -> "[" + cma.getPriority() + ", " + cma.getPackageName() + "]")
+ .map(CarModeApp::toString)
.collect(Collectors.joining(", "));
}
@@ -216,7 +268,7 @@
pw.increaseIndent();
for (CarModeApp app : mCarModeApps) {
pw.print("[");
- pw.print(app.getPriority());
+ pw.print(app.hasSetAutomotiveProjection() ? "PROJECTION SET" : app.getPriority());
pw.print("] ");
pw.println(app.getPackageName());
}
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 954aa44..9f5923a 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -913,8 +913,18 @@
}
@Override
+ public void onAutomotiveProjectionStateSet(String automotiveProjectionPackage) {
+ InCallController.this.handleSetAutomotiveProjection(automotiveProjectionPackage);
+ }
+
+ @Override
+ public void onAutomotiveProjectionStateReleased() {
+ InCallController.this.handleReleaseAutomotiveProjection();
+ }
+
+ @Override
public void onPackageUninstalled(String packageName) {
- mCarModeTracker.forceExitCarMode(packageName);
+ mCarModeTracker.forceRemove(packageName);
updateCarModeForSwitchingConnection();
}
};
@@ -1525,7 +1535,10 @@
if (requestedType == IN_CALL_SERVICE_TYPE_NON_UI) {
mKnownNonUiInCallServices.add(foundComponentName);
}
- if (serviceInfo.enabled && (requestedType == 0 || requestedType == currentType)) {
+
+ boolean isEnabled = isServiceEnabled(foundComponentName,
+ serviceInfo, packageManager);
+ if (isEnabled && (requestedType == 0 || requestedType == currentType)) {
retval.add(new InCallServiceInfo(foundComponentName,
isExternalCallsSupported, isSelfManageCallsSupported, requestedType));
}
@@ -1535,6 +1548,21 @@
return retval;
}
+ private boolean isServiceEnabled(ComponentName componentName,
+ ServiceInfo serviceInfo, PackageManager packageManager) {
+ int componentEnabledState = packageManager.getComponentEnabledSetting(componentName);
+
+ if (componentEnabledState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
+ return true;
+ }
+
+ if (componentEnabledState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
+ return serviceInfo.isEnabled();
+ }
+
+ return false;
+ }
+
private boolean shouldUseCarModeUI() {
return mCarModeTracker.isInCarMode();
}
@@ -1944,6 +1972,25 @@
updateCarModeForSwitchingConnection();
}
+ public void handleSetAutomotiveProjection(@NonNull String packageName) {
+ Log.i(this, "handleSetAutomotiveProjection: packageName=%s", packageName);
+ if (!isCarModeInCallService(packageName)) {
+ Log.i(this, "handleSetAutomotiveProjection: not a valid InCallService: packageName=%s",
+ packageName);
+ return;
+ }
+ mCarModeTracker.handleSetAutomotiveProjection(packageName);
+
+ updateCarModeForSwitchingConnection();
+ }
+
+ public void handleReleaseAutomotiveProjection() {
+ Log.i(this, "handleReleaseAutomotiveProjection");
+ mCarModeTracker.handleReleaseAutomotiveProjection();
+
+ updateCarModeForSwitchingConnection();
+ }
+
public void updateCarModeForSwitchingConnection() {
if (mInCallServiceConnection != null) {
Log.i(this, "updateCarModeForSwitchingConnection: car mode apps: %s",
@@ -2007,7 +2054,7 @@
private boolean isTrackingManagedAliveCall() {
return mCallIdMapper.getCalls().stream().anyMatch(c -> !c.isExternalCall()
&& !c.isSelfManaged() && c.isAlive() && c.getState() != CallState.ON_HOLD
- && c.getState() != CallState.AUDIO_PROCESSING);
+ && c.getState() != CallState.AUDIO_PROCESSING && c.getState() != CallState.DIALING);
}
/**
diff --git a/src/com/android/server/telecom/Ringer.java b/src/com/android/server/telecom/Ringer.java
index a769a94..267e7da 100644
--- a/src/com/android/server/telecom/Ringer.java
+++ b/src/com/android/server/telecom/Ringer.java
@@ -20,26 +20,27 @@
import android.app.NotificationManager;
import android.app.Person;
import android.content.Context;
-import android.os.VibrationEffect;
-import android.telecom.Log;
-import android.telecom.TelecomManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.VolumeShaper;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.telecom.Log;
+import android.telecom.TelecomManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.telecom.LogUtils.EventTimer;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
-import java.util.stream.Collectors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
/**
* Controls the ringtone player.
@@ -114,6 +115,8 @@
private static final int REPEAT_SIMPLE_VIBRATION_AT = 1;
+ private static final long RINGER_ATTRIBUTES_TIMEOUT = 5000; // 5 seconds
+
private static final float EPSILON = 1e-6f;
private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
@@ -147,6 +150,7 @@
private InCallTonePlayer mCallWaitingPlayer;
private RingtoneFactory mRingtoneFactory;
+ private AudioManager mAudioManager;
/**
* Call objects that are ringing, vibrating or call-waiting. These are used only for logging
@@ -161,6 +165,8 @@
*/
private boolean mIsVibrating = false;
+ private Handler mHandler = null;
+
/** Initializes the Ringer. */
@VisibleForTesting
public Ringer(
@@ -183,6 +189,7 @@
mRingtoneFactory = ringtoneFactory;
mInCallController = inCallController;
mVibrationEffectProxy = vibrationEffectProxy;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
if (mContext.getResources().getBoolean(R.bool.use_simple_vibration_pattern)) {
mDefaultVibrationEffect = mVibrationEffectProxy.createWaveform(SIMPLE_VIBRATION_PATTERN,
@@ -216,58 +223,39 @@
return false;
}
- AudioManager audioManager =
- (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- LogUtils.EventTimer timer = new EventTimer();
- boolean isVolumeOverZero = audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0;
- timer.record("isVolumeOverZero");
- boolean shouldRingForContact = shouldRingForContact(foregroundCall.getContactUri());
- timer.record("shouldRingForContact");
- boolean isRingtonePresent = !(mRingtoneFactory.getRingtone(foregroundCall) == null);
- timer.record("getRingtone");
- boolean isSelfManaged = foregroundCall.isSelfManaged();
- timer.record("isSelfManaged");
- boolean isSilentRingingRequested = foregroundCall.isSilentRingingRequested();
- timer.record("isSilentRingRequested");
+ // Use completable future to establish a timeout, not intent to make these work outside the
+ // main thread asynchronously
+ // TODO: moving these RingerAttributes calculation out of Telecom lock to avoid blocking.
+ CompletableFuture<RingerAttributes> ringerAttributesFuture = CompletableFuture
+ .supplyAsync(() -> getRingerAttributes(foregroundCall, isHfpDeviceAttached),
+ new LoggedHandlerExecutor(getHandler(), "R.sR", null));
- boolean isRingerAudible = isVolumeOverZero && shouldRingForContact && isRingtonePresent;
- timer.record("isRingerAudible");
- boolean hasExternalRinger = hasExternalRinger(foregroundCall);
- timer.record("hasExternalRinger");
- // Don't do call waiting operations or vibration unless these are false.
- boolean isTheaterModeOn = mSystemSettingsUtil.isTheaterModeOn(mContext);
- timer.record("isTheaterModeOn");
- boolean letDialerHandleRinging = mInCallController.doesConnectedDialerSupportRinging();
- timer.record("letDialerHandleRinging");
+ RingerAttributes attributes = null;
+ try {
+ attributes = ringerAttributesFuture.get(
+ RINGER_ATTRIBUTES_TIMEOUT, TimeUnit.MILLISECONDS);
+ } catch (ExecutionException | InterruptedException | TimeoutException e) {
+ // Keep attributs as null
+ Log.i(this, "getAttributes error: " + e);
+ }
- Log.i(this, "startRinging timings: " + timer);
- boolean endEarly = isTheaterModeOn || letDialerHandleRinging || isSelfManaged ||
- hasExternalRinger || isSilentRingingRequested;
+ if (attributes == null) {
+ Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "RingerAttributes error");
+ return false;
+ }
- // Acquire audio focus under any of the following conditions:
- // 1. Should ring for contact and there's an HFP device attached
- // 2. Volume is over zero, we should ring for the contact, and there's a audible ringtone
- // present.
- // 3. The call is self-managed.
- boolean shouldAcquireAudioFocus =
- isRingerAudible || (isHfpDeviceAttached && shouldRingForContact) || isSelfManaged;
-
- if (endEarly) {
- if (letDialerHandleRinging) {
+ if (attributes.isEndEarly()) {
+ if (attributes.letDialerHandleRinging()) {
Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "Dialer handles");
}
- if (isSilentRingingRequested) {
+ if (attributes.isSilentRingingRequested()) {
Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "Silent ringing "
+ "requested");
}
- Log.i(this, "Ending early -- isTheaterModeOn=%s, letDialerHandleRinging=%s, " +
- "isSelfManaged=%s, hasExternalRinger=%s, silentRingingRequested=%s",
- isTheaterModeOn, letDialerHandleRinging, isSelfManaged, hasExternalRinger,
- isSilentRingingRequested);
if (mBlockOnRingingFuture != null) {
mBlockOnRingingFuture.complete(null);
}
- return shouldAcquireAudioFocus;
+ return attributes.shouldAcquireAudioFocus();
}
stopCallWaiting();
@@ -276,7 +264,7 @@
CompletableFuture<Boolean> hapticsFuture = null;
// Determine if the settings and DND mode indicate that the vibrator can be used right now.
boolean isVibratorEnabled = isVibratorEnabled(mContext, foregroundCall);
- if (isRingerAudible) {
+ if (attributes.isRingerAudible()) {
mRingingCall = foregroundCall;
Log.addEvent(foregroundCall, LogUtils.Events.START_RINGER);
// Because we wait until a contact info query to complete before processing a
@@ -309,15 +297,14 @@
effect = getVibrationEffectForCall(mRingtoneFactory, foregroundCall);
}
} else {
- String reason = String.format(
- "isVolumeOverZero=%s, shouldRingForContact=%s, isRingtonePresent=%s",
- isVolumeOverZero, shouldRingForContact, isRingtonePresent);
- Log.i(this, "startRinging: skipping because ringer would not be audible. " + reason);
- Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "Inaudible: " + reason);
+ Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "Inaudible: "
+ + attributes.getInaudibleReason());
effect = mDefaultVibrationEffect;
}
if (hapticsFuture != null) {
+ final boolean shouldRingForContact = attributes.shouldRingForContact();
+ final boolean isRingerAudible = attributes.isRingerAudible();
mVibrateFuture = hapticsFuture.thenAccept(isUsingAudioCoupledHaptics -> {
if (!isUsingAudioCoupledHaptics || !mIsHapticPlaybackSupportedByDevice) {
Log.i(this, "startRinging: fileHasHaptics=%b, hapticsSupported=%b",
@@ -342,11 +329,11 @@
mBlockOnRingingFuture.complete(null);
}
Log.w(this, "startRinging: No haptics future; fallback to default behavior");
- maybeStartVibration(foregroundCall, shouldRingForContact, effect, isVibratorEnabled,
- isRingerAudible);
+ maybeStartVibration(foregroundCall, attributes.shouldRingForContact(), effect,
+ isVibratorEnabled, attributes.isRingerAudible());
}
- return shouldAcquireAudioFocus;
+ return attributes.shouldAcquireAudioFocus();
}
private void maybeStartVibration(Call foregroundCall, boolean shouldRingForContact,
@@ -517,4 +504,75 @@
return mSystemSettingsUtil.canVibrateWhenRinging(context)
|| mSystemSettingsUtil.applyRampingRinger(context);
}
+
+ private RingerAttributes getRingerAttributes(Call call, boolean isHfpDeviceAttached) {
+ RingerAttributes.Builder builder = new RingerAttributes.Builder();
+
+ LogUtils.EventTimer timer = new EventTimer();
+
+ boolean isVolumeOverZero = mAudioManager.getStreamVolume(AudioManager.STREAM_RING) > 0;
+ timer.record("isVolumeOverZero");
+ boolean shouldRingForContact = shouldRingForContact(call.getContactUri());
+ timer.record("shouldRingForContact");
+ boolean isRingtonePresent = !(mRingtoneFactory.getRingtone(call) == null);
+ timer.record("getRingtone");
+ boolean isSelfManaged = call.isSelfManaged();
+ timer.record("isSelfManaged");
+ boolean isSilentRingingRequested = call.isSilentRingingRequested();
+ timer.record("isSilentRingRequested");
+
+ boolean isRingerAudible = isVolumeOverZero && shouldRingForContact && isRingtonePresent;
+ timer.record("isRingerAudible");
+ String inaudibleReason = "";
+ if (!isRingerAudible) {
+ inaudibleReason = String.format(
+ "isVolumeOverZero=%s, shouldRingForContact=%s, isRingtonePresent=%s",
+ isVolumeOverZero, shouldRingForContact, isRingtonePresent);
+ }
+
+ boolean hasExternalRinger = hasExternalRinger(call);
+ timer.record("hasExternalRinger");
+ // Don't do call waiting operations or vibration unless these are false.
+ boolean isTheaterModeOn = mSystemSettingsUtil.isTheaterModeOn(mContext);
+ timer.record("isTheaterModeOn");
+ boolean letDialerHandleRinging = mInCallController.doesConnectedDialerSupportRinging();
+ timer.record("letDialerHandleRinging");
+
+ Log.i(this, "startRinging timings: " + timer);
+ boolean endEarly = isTheaterModeOn || letDialerHandleRinging || isSelfManaged ||
+ hasExternalRinger || isSilentRingingRequested;
+
+ if (endEarly) {
+ Log.i(this, "Ending early -- isTheaterModeOn=%s, letDialerHandleRinging=%s, " +
+ "isSelfManaged=%s, hasExternalRinger=%s, silentRingingRequested=%s",
+ isTheaterModeOn, letDialerHandleRinging, isSelfManaged, hasExternalRinger,
+ isSilentRingingRequested);
+ }
+
+ // Acquire audio focus under any of the following conditions:
+ // 1. Should ring for contact and there's an HFP device attached
+ // 2. Volume is over zero, we should ring for the contact, and there's a audible ringtone
+ // present.
+ // 3. The call is self-managed.
+ boolean shouldAcquireAudioFocus =
+ isRingerAudible || (isHfpDeviceAttached && shouldRingForContact) || isSelfManaged;
+
+ return builder.setEndEarly(endEarly)
+ .setLetDialerHandleRinging(letDialerHandleRinging)
+ .setAcquireAudioFocus(shouldAcquireAudioFocus)
+ .setRingerAudible(isRingerAudible)
+ .setInaudibleReason(inaudibleReason)
+ .setShouldRingForContact(shouldRingForContact)
+ .setSilentRingingRequested(isSilentRingingRequested)
+ .build();
+ }
+
+ private Handler getHandler() {
+ if (mHandler == null) {
+ HandlerThread handlerThread = new HandlerThread("Ringer");
+ handlerThread.start();
+ mHandler = handlerThread.getThreadHandler();
+ }
+ return mHandler;
+ }
}
diff --git a/src/com/android/server/telecom/RingerAttributes.java b/src/com/android/server/telecom/RingerAttributes.java
new file mode 100644
index 0000000..840d815
--- /dev/null
+++ b/src/com/android/server/telecom/RingerAttributes.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2020 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;
+
+public class RingerAttributes {
+ public static class Builder {
+ private boolean mEndEarly;
+ private boolean mLetDialerHandleRinging;
+ private boolean mAcquireAudioFocus;
+ private boolean mRingerAudible;
+ private String mInaudibleReason;
+ private boolean mShouldRingForContact;
+ private boolean mSilentRingingRequested;
+
+ public RingerAttributes.Builder setEndEarly(boolean endEarly) {
+ mEndEarly = endEarly;
+ return this;
+ }
+
+ public RingerAttributes.Builder setLetDialerHandleRinging(boolean letDialerHandleRinging) {
+ mLetDialerHandleRinging = letDialerHandleRinging;
+ return this;
+ }
+
+ public RingerAttributes.Builder setAcquireAudioFocus(boolean acquireAudioFocus) {
+ mAcquireAudioFocus = acquireAudioFocus;
+ return this;
+ }
+
+ public RingerAttributes.Builder setRingerAudible(boolean ringerAudible) {
+ mRingerAudible = ringerAudible;
+ return this;
+ }
+
+ public RingerAttributes.Builder setInaudibleReason(String inaudibleReason) {
+ mInaudibleReason = inaudibleReason;
+ return this;
+ }
+
+ public RingerAttributes.Builder setShouldRingForContact(boolean shouldRingForContact) {
+ mShouldRingForContact = shouldRingForContact;
+ return this;
+ }
+
+ public RingerAttributes.Builder setSilentRingingRequested(boolean silentRingingRequested) {
+ mSilentRingingRequested = silentRingingRequested;
+ return this;
+ }
+
+ public RingerAttributes build() {
+ return new RingerAttributes(mEndEarly, mLetDialerHandleRinging, mAcquireAudioFocus,
+ mRingerAudible, mInaudibleReason, mShouldRingForContact,
+ mSilentRingingRequested);
+ }
+ }
+
+ private boolean mEndEarly;
+ private boolean mLetDialerHandleRinging;
+ private boolean mAcquireAudioFocus;
+ private boolean mRingerAudible;
+ private String mInaudibleReason;
+ private boolean mShouldRingForContact;
+ private boolean mSilentRingingRequested;
+
+ private RingerAttributes(boolean endEarly, boolean letDialerHandleRinging,
+ boolean acquireAudioFocus, boolean ringerAudible, String inaudibleReason,
+ boolean shouldRingForContact, boolean silentRingingRequested) {
+ mEndEarly = endEarly;
+ mLetDialerHandleRinging = letDialerHandleRinging;
+ mAcquireAudioFocus = acquireAudioFocus;
+ mRingerAudible = ringerAudible;
+ mInaudibleReason = inaudibleReason;
+ mShouldRingForContact = shouldRingForContact;
+ mSilentRingingRequested = silentRingingRequested;
+ }
+
+ public boolean isEndEarly() {
+ return mEndEarly;
+ }
+
+ public boolean letDialerHandleRinging() {
+ return mLetDialerHandleRinging;
+ }
+
+ public boolean shouldAcquireAudioFocus() {
+ return mAcquireAudioFocus;
+ }
+
+ public boolean isRingerAudible() {
+ return mRingerAudible;
+ }
+
+ public String getInaudibleReason() {
+ return mInaudibleReason;
+ }
+
+ public boolean shouldRingForContact() {
+ return mShouldRingForContact;
+ }
+
+ public boolean isSilentRingingRequested() {
+ return mSilentRingingRequested;
+ }
+}
diff --git a/src/com/android/server/telecom/SystemStateHelper.java b/src/com/android/server/telecom/SystemStateHelper.java
index 3be3d5e..8fb6bc5 100644
--- a/src/com/android/server/telecom/SystemStateHelper.java
+++ b/src/com/android/server/telecom/SystemStateHelper.java
@@ -16,6 +16,7 @@
package com.android.server.telecom;
+import android.annotation.NonNull;
import android.app.UiModeManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -38,7 +39,7 @@
/**
* Provides various system states to the rest of the telecom codebase.
*/
-public class SystemStateHelper {
+public class SystemStateHelper implements UiModeManager.OnProjectionStateChangeListener {
public interface SystemStateListener {
/**
* Listener method to inform interested parties when a package name requests to enter or
@@ -51,6 +52,19 @@
void onCarModeChanged(int priority, String packageName, boolean isCarMode);
/**
+ * Listener method to inform interested parties when a package has set automotive projection
+ * state.
+ * @param automotiveProjectionPackage the package that set automotive projection.
+ */
+ void onAutomotiveProjectionStateSet(String automotiveProjectionPackage);
+
+ /**
+ * Listener method to inform interested parties when automotive projection state has been
+ * cleared.
+ */
+ void onAutomotiveProjectionStateReleased();
+
+ /**
* Notifies when a package has been uninstalled.
* @param packageName the package name of the uninstalled package
*/
@@ -99,8 +113,18 @@
}
};
+ @Override
+ public void onProjectionStateChanged(int activeProjectionTypes,
+ @NonNull Set<String> projectingPackages) {
+ if (projectingPackages.isEmpty()) {
+ onReleaseAutomotiveProjection();
+ } else {
+ onSetAutomotiveProjection(projectingPackages.iterator().next());
+ }
+ }
+
private Set<SystemStateListener> mListeners = new CopyOnWriteArraySet<>();
- private boolean mIsCarMode;
+ private boolean mIsCarModeOrProjectionActive;
public SystemStateHelper(Context context) {
mContext = context;
@@ -116,7 +140,9 @@
Log.i(this, "Registering broadcast receiver: %s", intentFilter1);
Log.i(this, "Registering broadcast receiver: %s", intentFilter2);
- mIsCarMode = getSystemCarMode();
+ mContext.getSystemService(UiModeManager.class).addOnProjectionStateChangeListener(
+ UiModeManager.PROJECTION_TYPE_AUTOMOTIVE, mContext.getMainExecutor(), this);
+ mIsCarModeOrProjectionActive = getSystemCarModeOrProjectionState();
}
public void addListener(SystemStateListener listener) {
@@ -129,8 +155,8 @@
return mListeners.remove(listener);
}
- public boolean isCarMode() {
- return mIsCarMode;
+ public boolean isCarModeOrProjectionActive() {
+ return mIsCarModeOrProjectionActive;
}
public boolean isDeviceAtEar() {
@@ -215,7 +241,7 @@
private void onEnterCarMode(int priority, String packageName) {
Log.i(this, "Entering carmode");
- mIsCarMode = getSystemCarMode();
+ mIsCarModeOrProjectionActive = getSystemCarModeOrProjectionState();
for (SystemStateListener listener : mListeners) {
listener.onCarModeChanged(priority, packageName, true /* isCarMode */);
}
@@ -223,25 +249,44 @@
private void onExitCarMode(int priority, String packageName) {
Log.i(this, "Exiting carmode");
- mIsCarMode = getSystemCarMode();
+ mIsCarModeOrProjectionActive = getSystemCarModeOrProjectionState();
for (SystemStateListener listener : mListeners) {
listener.onCarModeChanged(priority, packageName, false /* isCarMode */);
}
}
- /**
- * Checks the system for the current car mode.
- *
- * @return True if in car mode, false otherwise.
- */
- private boolean getSystemCarMode() {
- UiModeManager uiModeManager =
- (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
-
- if (uiModeManager != null) {
- return uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR;
+ private void onSetAutomotiveProjection(String packageName) {
+ Log.i(this, "Automotive projection set.");
+ mIsCarModeOrProjectionActive = getSystemCarModeOrProjectionState();
+ for (SystemStateListener listener : mListeners) {
+ listener.onAutomotiveProjectionStateSet(packageName);
}
+ }
+
+ private void onReleaseAutomotiveProjection() {
+ Log.i(this, "Automotive projection released.");
+ mIsCarModeOrProjectionActive = getSystemCarModeOrProjectionState();
+ for (SystemStateListener listener : mListeners) {
+ listener.onAutomotiveProjectionStateReleased();
+ }
+ }
+
+ /**
+ * Checks the system for the current car projection state.
+ *
+ * @return True if projection is active, false otherwise.
+ */
+ private boolean getSystemCarModeOrProjectionState() {
+ UiModeManager uiModeManager = mContext.getSystemService(UiModeManager.class);
+
+ if (uiModeManager != null) {
+ return uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR
+ || (uiModeManager.getActiveProjectionTypes()
+ & UiModeManager.PROJECTION_TYPE_AUTOMOTIVE) != 0;
+ }
+
+ Log.w(this, "Got null UiModeManager, returning false.");
return false;
}
}
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index 1ee77a3..c7d3494 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -34,6 +34,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.PermissionChecker;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
@@ -57,7 +58,6 @@
import android.util.EventLog;
import com.android.internal.telecom.ITelecomService;
-import com.android.internal.telephony.TelephonyPermissions;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.telecom.components.UserCallIntentProcessorFactory;
import com.android.server.telecom.settings.BlockedNumbersActivity;
@@ -831,6 +831,22 @@
}
/**
+ * @see android.telecom.TelecomManager#hasCompanionInCallServiceAccess
+ */
+ @Override
+ public boolean hasCompanionInCallServiceAccess(String callingPackage) {
+ try {
+ Log.startSession("TSI.hCICSA");
+ return PermissionChecker.checkPermissionForPreflight(mContext,
+ Manifest.permission.MANAGE_ONGOING_CALLS,
+ PermissionChecker.PID_UNKNOWN, Binder.getCallingUid(),
+ callingPackage) == PermissionChecker.PERMISSION_GRANTED;
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ /**
* @see android.telecom.TelecomManager#isInManagedCall
*/
@Override
diff --git a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
index e93ef22..a1f357b 100644
--- a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
+++ b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
@@ -294,7 +294,7 @@
* The current rule to decide whether the implemented {@link CallRedirectionService} should
* allow interactive responses with users is only based on whether it is in car mode.
*/
- mAllowInteractiveResponse = !callsManager.getSystemStateHelper().isCarMode();
+ mAllowInteractiveResponse = !callsManager.getSystemStateHelper().isCarModeOrProjectionActive();
mCallRedirectionProcessorHelper = new CallRedirectionProcessorHelper(
context, callsManager, phoneAccountRegistrar);
mProcessedDestinationUri = mCallRedirectionProcessorHelper.formatNumberForRedirection(
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 22f5348..caaf4d6 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -36,6 +36,9 @@
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
+ <!-- Used to access Projection State APIs -->
+ <uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
+
<application android:label="@string/app_name"
android:debuggable="true">
<uses-library android:name="android.test.runner" />
diff --git a/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java b/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
index 953c711..5f66b49 100644
--- a/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
@@ -169,7 +169,7 @@
when(userManager.isUserUnlocked(any(UserHandle.class))).thenReturn(true);
when(userManager.hasUserRestriction(any(String.class), any(UserHandle.class)))
.thenReturn(false);
- when(userManager.getUsers(any(Boolean.class)))
+ when(userManager.getAliveUsers())
.thenReturn(Arrays.asList(userInfo, otherUserInfo, managedProfileUserInfo));
when(userManager.getUserInfo(eq(CURRENT_USER_ID))).thenReturn(userInfo);
when(userManager.getUserInfo(eq(OTHER_USER_ID))).thenReturn(otherUserInfo);
diff --git a/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java b/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java
index ff16880..0a896a8 100644
--- a/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java
@@ -65,8 +65,6 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import java.util.ArrayList;
-
@RunWith(JUnit4.class)
public class CallRedirectionProcessorTest extends TelecomTestCase {
@Mock private Context mContext;
@@ -151,7 +149,7 @@
}
private void setIsInCarMode(boolean isInCarMode) {
- when(mSystemStateHelper.isCarMode()).thenReturn(isInCarMode);
+ when(mSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(isInCarMode);
}
private void enableUserDefinedCallRedirectionService() {
diff --git a/tests/src/com/android/server/telecom/tests/CarModeTrackerTest.java b/tests/src/com/android/server/telecom/tests/CarModeTrackerTest.java
index dbfcdb1..4ad46ae 100644
--- a/tests/src/com/android/server/telecom/tests/CarModeTrackerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CarModeTrackerTest.java
@@ -21,9 +21,6 @@
import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.assertNull;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
-
import android.app.UiModeManager;
import com.android.server.telecom.CarModeTracker;
@@ -33,7 +30,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.mockito.Mock;
@RunWith(JUnit4.class)
public class CarModeTrackerTest extends TelecomTestCase {
@@ -110,7 +106,7 @@
@Test
public void testForceExitCarMode() {
testEnterCarModeBasic();
- mCarModeTracker.forceExitCarMode(CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.forceRemove(CAR_MODE_APP1_PACKAGE_NAME);
assertFalse(mCarModeTracker.isInCarMode());
assertNull(mCarModeTracker.getCurrentCarModePackage());
}
@@ -226,4 +222,109 @@
CAR_MODE_APP3_PACKAGE_NAME);
assertNull(mCarModeTracker.getCurrentCarModePackage());
}
+
+ /**
+ * Verifies that setting automotive projection by itself works.
+ */
+ @Test
+ public void testSetAutomotiveProjectionBasic() {
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP1_PACKAGE_NAME);
+ assertEquals(CAR_MODE_APP1_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+ // We should be tracking our car mode app.
+ assertEquals(1, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ }
+
+ /**
+ * Verifies that if we set automotive projection more than once with the same package, nothing
+ * changes.
+ */
+ @Test
+ public void testSetAutomotiveProjectionMultipleTimes() {
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP1_PACKAGE_NAME);
+ // Should still only have one app.
+ assertEquals(1, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ // It should be the same one.
+ assertEquals(CAR_MODE_APP1_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+ }
+
+ /**
+ * Verifies that if we set automotive projection more than once, the new package overrides.
+ */
+ @Test
+ public void testSetAutomotiveProjectionMultipleTimesDifferentPackages() {
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP2_PACKAGE_NAME);
+ // Should still only have one app.
+ assertEquals(1, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ // It should be the newer one.
+ assertEquals(CAR_MODE_APP2_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+ }
+
+ /**
+ * Verifies that releasing automotive projection works as expected.
+ */
+ @Test
+ public void testReleaseAutomotiveProjectionBasic() {
+ // Releasing before something's set shouldn't break anything.
+ mCarModeTracker.handleReleaseAutomotiveProjection();
+ assertEquals(0, mCarModeTracker.getCarModeApps().size());
+ assertFalse(mCarModeTracker.isInCarMode());
+
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.handleReleaseAutomotiveProjection();
+ // Should be gone now.
+ assertEquals(0, mCarModeTracker.getCarModeApps().size());
+ assertFalse(mCarModeTracker.isInCarMode());
+ }
+
+ /**
+ * Verifies that setting automotive projection overrides but doesn't overwrite car mode apps.
+ */
+ @Test
+ public void testAutomotiveProjectionOverridesCarMode() {
+ mCarModeTracker.handleEnterCarMode(50, CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.handleSetAutomotiveProjection(CAR_MODE_APP4_PACKAGE_NAME);
+
+ // Should have two apps now, the car mode and the automotive projection one.
+ assertEquals(2, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+
+ // Automotive projection takes priority.
+ assertEquals(CAR_MODE_APP4_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+
+ // If we add another car mode app, automotive projection still has priority.
+ mCarModeTracker.handleEnterCarMode(Integer.MAX_VALUE, CAR_MODE_APP2_PACKAGE_NAME);
+ assertEquals(3, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ assertEquals(CAR_MODE_APP4_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+
+ // If we release automotive projection, we go back to the prioritized list of plain car
+ // mode apps.
+ mCarModeTracker.handleReleaseAutomotiveProjection();
+ assertEquals(2, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ assertEquals(CAR_MODE_APP2_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+
+ // Make sure we didn't mess with the first app that was added.
+ mCarModeTracker.handleExitCarMode(Integer.MAX_VALUE, CAR_MODE_APP2_PACKAGE_NAME);
+ assertEquals(1, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ assertEquals(CAR_MODE_APP1_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+ }
+
+ /**
+ * Verifies that releasing automotive projection doesn't interfere with plain car mode apps.
+ */
+ @Test
+ public void testReleaseAutomotiveProjectionNoopForCarModeApps() {
+ mCarModeTracker.handleEnterCarMode(50, CAR_MODE_APP1_PACKAGE_NAME);
+ mCarModeTracker.handleReleaseAutomotiveProjection();
+ assertEquals(1, mCarModeTracker.getCarModeApps().size());
+ assertTrue(mCarModeTracker.isInCarMode());
+ assertEquals(CAR_MODE_APP1_PACKAGE_NAME, mCarModeTracker.getCurrentCarModePackage());
+ }
}
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index a4302b6..a44d90b 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -30,6 +30,7 @@
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.app.StatusBarManager;
+import android.app.UiModeManager;
import android.app.role.RoleManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -206,6 +207,8 @@
return mRoleManager;
case Context.TELEPHONY_REGISTRY_SERVICE:
return mTelephonyRegistryManager;
+ case Context.UI_MODE_SERVICE:
+ return mUiModeManager;
default:
return null;
}
@@ -227,6 +230,8 @@
return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
} else if (svcClass == TelephonyRegistryManager.class) {
return Context.TELEPHONY_REGISTRY_SERVICE;
+ } else if (svcClass == UiModeManager.class) {
+ return Context.UI_MODE_SERVICE;
}
throw new UnsupportedOperationException();
}
@@ -486,6 +491,7 @@
private final RoleManager mRoleManager = mock(RoleManager.class);
private final TelephonyRegistryManager mTelephonyRegistryManager =
mock(TelephonyRegistryManager.class);
+ private final UiModeManager mUiModeManager = mock(UiModeManager.class);
private final PermissionInfo mPermissionInfo = mock(PermissionInfo.class);
private TelecomManager mTelecomManager = mock(TelecomManager.class);
diff --git a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
index 6a6b9f3..3307a93 100644
--- a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
+++ b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
@@ -243,14 +243,32 @@
when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle);
when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
mSystemStateListener.onCarModeChanged(666, CAR_PKG, true);
verify(mCarModeTracker).handleEnterCarMode(666, CAR_PKG);
assertTrue(mCarModeTracker.isInCarMode());
mSystemStateListener.onPackageUninstalled(CAR_PKG);
- verify(mCarModeTracker).forceExitCarMode(CAR_PKG);
+ verify(mCarModeTracker).forceRemove(CAR_PKG);
+ assertFalse(mCarModeTracker.isInCarMode());
+ }
+
+ @SmallTest
+ @Test
+ public void testAutomotiveProjectionAppRemoval() {
+ setupMockPackageManager(true /* default */, true /* system */, true /* external calls */);
+ when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle);
+ when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
+
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
+
+ mSystemStateListener.onAutomotiveProjectionStateSet(CAR_PKG);
+ verify(mCarModeTracker).handleSetAutomotiveProjection(CAR_PKG);
+ assertTrue(mCarModeTracker.isInCarMode());
+
+ mSystemStateListener.onPackageUninstalled(CAR_PKG);
+ verify(mCarModeTracker).forceRemove(CAR_PKG);
assertFalse(mCarModeTracker.isInCarMode());
}
@@ -786,7 +804,7 @@
setupMockPackageManager(true /* default */, true /* system */, true /* external calls */);
// Enable car mode
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
mInCallController.handleCarModeChange(UiModeManager.DEFAULT_PRIORITY, CAR_PKG, true);
// Now bind; we should only bind to one app.
@@ -816,7 +834,7 @@
matches(Manifest.permission.CONTROL_INCALL_EXPERIENCE),
matches(CAR_PKG))).thenReturn(PackageManager.PERMISSION_DENIED);
// Enable car mode
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
// Register the fact that the invalid app entered car mode.
mInCallController.handleCarModeChange(UiModeManager.DEFAULT_PRIORITY, CAR_PKG, true);
@@ -928,7 +946,7 @@
mInCallController.bindToServices(mMockCall);
// Enable car mode and enter car mode at default priority.
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
mInCallController.handleCarModeChange(UiModeManager.DEFAULT_PRIORITY, CAR_PKG, true);
// And change to the second car mode app.
@@ -1075,7 +1093,7 @@
// Now switch to car mode.
// Enable car mode and enter car mode at default priority.
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
mInCallController.handleCarModeChange(UiModeManager.DEFAULT_PRIORITY, CAR_PKG, true);
ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -1115,7 +1133,7 @@
// Now switch to car mode.
// Enable car mode and enter car mode at default priority.
- when(mMockSystemStateHelper.isCarMode()).thenReturn(true);
+ when(mMockSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(true);
mInCallController.handleCarModeChange(UiModeManager.DEFAULT_PRIORITY, CAR_PKG, true);
// We currently will bind to the car-mode InCallService even if there are no calls available
@@ -1331,6 +1349,28 @@
}
}).when(mMockPackageManager).queryIntentServicesAsUser(
any(Intent.class), anyInt(), eq(CURRENT_USER_ID));
+
+ if (useDefaultDialer) {
+ when(mMockPackageManager
+ .getComponentEnabledSetting(new ComponentName(DEF_PKG, DEF_CLASS)))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+ }
+
+ when(mMockPackageManager
+ .getComponentEnabledSetting(new ComponentName(SYS_PKG, SYS_CLASS)))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+
+ when(mMockPackageManager
+ .getComponentEnabledSetting(new ComponentName(CAR_PKG, CAR_CLASS)))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+
+ when(mMockPackageManager
+ .getComponentEnabledSetting(new ComponentName(COMPANION_PKG, COMPANION_CLASS)))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+
+ when(mMockPackageManager
+ .getComponentEnabledSetting(new ComponentName(CAR2_PKG, CAR2_CLASS)))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}
private void setupMockPackageManagerLocationPermission(final String pkg,
diff --git a/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java b/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java
index a5b78b7..e6c6bac 100644
--- a/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java
+++ b/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java
@@ -110,7 +110,7 @@
when(mPhoneAccountRegistrar.getPhoneAccountUnchecked(
any(PhoneAccountHandle.class))).thenReturn(mPhoneAccount);
when(mPhoneAccount.isSelfManaged()).thenReturn(true);
- when(mSystemStateHelper.isCarMode()).thenReturn(false);
+ when(mSystemStateHelper.isCarModeOrProjectionActive()).thenReturn(false);
}
@Override
diff --git a/tests/src/com/android/server/telecom/tests/RingerTest.java b/tests/src/com/android/server/telecom/tests/RingerTest.java
index 38f63d2..0e93481 100644
--- a/tests/src/com/android/server/telecom/tests/RingerTest.java
+++ b/tests/src/com/android/server/telecom/tests/RingerTest.java
@@ -79,6 +79,16 @@
}
@Override
+ public VibrationEffect resolve(int defaultAmplitude) {
+ return this;
+ }
+
+ @Override
+ public VibrationEffect scale(float scaleFactor) {
+ return this;
+ }
+
+ @Override
public void validate() {
// not needed
}
diff --git a/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java b/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
index 893ae3d..ad52625 100644
--- a/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
+++ b/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
@@ -60,6 +60,7 @@
import org.mockito.internal.util.reflection.FieldSetter;
import java.util.List;
+import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -91,6 +92,8 @@
when(mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)).thenReturn(mGravitySensor);
when(mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)).thenReturn(mProxSensor);
+ doReturn(mUiModeManager).when(mContext).getSystemService(UiModeManager.class);
+
mComponentContextFixture.putFloatResource(
R.dimen.device_on_ear_xy_gravity_threshold, 5.5f);
mComponentContextFixture.putFloatResource(
@@ -117,17 +120,53 @@
@SmallTest
@Test
public void testQuerySystemForCarMode_True() {
- when(mContext.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(mUiModeManager);
when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_CAR);
- assertTrue(new SystemStateHelper(mContext).isCarMode());
+ assertTrue(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
}
@SmallTest
@Test
public void testQuerySystemForCarMode_False() {
- when(mContext.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(mUiModeManager);
when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_NORMAL);
- assertFalse(new SystemStateHelper(mContext).isCarMode());
+ assertFalse(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
+ }
+
+ @SmallTest
+ @Test
+ public void testQuerySystemForAutomotiveProjection_True() {
+ when(mUiModeManager.getActiveProjectionTypes())
+ .thenReturn(UiModeManager.PROJECTION_TYPE_AUTOMOTIVE);
+ assertTrue(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
+
+ when(mUiModeManager.getActiveProjectionTypes())
+ .thenReturn(UiModeManager.PROJECTION_TYPE_ALL);
+ assertTrue(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
+ }
+
+ @SmallTest
+ @Test
+ public void testQuerySystemForAutomotiveProjection_False() {
+ when(mUiModeManager.getActiveProjectionTypes())
+ .thenReturn(UiModeManager.PROJECTION_TYPE_NONE);
+ assertFalse(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
+ }
+
+ @SmallTest
+ @Test
+ public void testQuerySystemForAutomotiveProjectionAndCarMode_True() {
+ when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_CAR);
+ when(mUiModeManager.getActiveProjectionTypes())
+ .thenReturn(UiModeManager.PROJECTION_TYPE_AUTOMOTIVE);
+ assertTrue(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
+ }
+
+ @SmallTest
+ @Test
+ public void testQuerySystemForAutomotiveProjectionOrCarMode_nullService() {
+ when(mContext.getSystemService(UiModeManager.class))
+ .thenReturn(mUiModeManager) // Without this, class construction will throw NPE.
+ .thenReturn(null);
+ assertFalse(new SystemStateHelper(mContext).isCarModeOrProjectionActive());
}
@SmallTest
@@ -204,6 +243,40 @@
@SmallTest
@Test
+ public void testOnSetReleaseAutomotiveProjection() {
+ SystemStateHelper systemStateHelper = new SystemStateHelper(mContext);
+ // We don't care what listener is registered, that's an implementation detail, but we need
+ // to call methods on whatever it is.
+ ArgumentCaptor<UiModeManager.OnProjectionStateChangeListener> listenerCaptor =
+ ArgumentCaptor.forClass(UiModeManager.OnProjectionStateChangeListener.class);
+ verify(mUiModeManager).addOnProjectionStateChangeListener(
+ eq(UiModeManager.PROJECTION_TYPE_AUTOMOTIVE), any(), listenerCaptor.capture());
+ systemStateHelper.addListener(mSystemStateListener);
+
+ String packageName1 = "Sufjan Stevens";
+ String packageName2 = "The Ascension";
+
+ // Should pay attention to automotive projection, though.
+ listenerCaptor.getValue().onProjectionStateChanged(
+ UiModeManager.PROJECTION_TYPE_AUTOMOTIVE, Set.of(packageName2));
+ verify(mSystemStateListener).onAutomotiveProjectionStateSet(packageName2);
+
+ // Without any automotive projection, it should see it as released.
+ listenerCaptor.getValue().onProjectionStateChanged(
+ UiModeManager.PROJECTION_TYPE_NONE, Set.of());
+ verify(mSystemStateListener).onAutomotiveProjectionStateReleased();
+
+ // Try the whole thing again, with different values.
+ listenerCaptor.getValue().onProjectionStateChanged(
+ UiModeManager.PROJECTION_TYPE_AUTOMOTIVE, Set.of(packageName1));
+ verify(mSystemStateListener).onAutomotiveProjectionStateSet(packageName1);
+ listenerCaptor.getValue().onProjectionStateChanged(
+ UiModeManager.PROJECTION_TYPE_AUTOMOTIVE, Set.of());
+ verify(mSystemStateListener, times(2)).onAutomotiveProjectionStateReleased();
+ }
+
+ @SmallTest
+ @Test
public void testDeviceOnEarCorrectlyDetected() {
doAnswer(invocation -> {
SensorEventListener listener = invocation.getArgument(0);