[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);