Merge "IMS: Propagate RTT capability of the called party to UI."
diff --git a/Android.bp b/Android.bp
index 0d89b00..88cffb8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,3 +1,7 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
genrule {
name: "statslog-telecom-java-gen",
tools: ["stats-log-api-gen"],
@@ -21,6 +25,9 @@
":Telecom-srcs",
"proto/**/*.proto",
],
+ static_libs: [
+ "androidx.annotation_annotation",
+ ],
resource_dirs: ["res"],
proto: {
type: "nano",
@@ -33,7 +40,6 @@
optimize: {
proguard_flags_files: ["proguard.flags"],
},
- defaults: ["SettingsLibDefaults"],
}
android_test {
diff --git a/res/raw/InCallQualityNotification.ogg b/res/raw/InCallQualityNotification.ogg
new file mode 100644
index 0000000..84c029a
--- /dev/null
+++ b/res/raw/InCallQualityNotification.ogg
Binary files differ
diff --git a/res/values-af/config.xml b/res/values-af/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-af/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-am/config.xml b/res/values-am/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-am/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ar/config.xml b/res/values-ar/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ar/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-as/config.xml b/res/values-as/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-as/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-az/config.xml b/res/values-az/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-az/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index d79343f..53817b3 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"Zənglərin İdarə Olunması"</string>
+ <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"Zənglərin idarəolunması"</string>
<string name="userCallActivityLabel" product="default" msgid="3605391260292846248">"Telefon"</string>
<string name="unknown" msgid="6993977514360123431">"Naməlum"</string>
<string name="notification_missedCallTitle" msgid="5060387047205532974">"Buraxılmış zəng"</string>
@@ -96,16 +96,16 @@
<string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"Başqa bir tətbiqdəki zəng səbəbilə çağrı edilə bilməz."</string>
<string name="notification_channel_incoming_call" msgid="5245550964701715662">"Gələn zənglər"</string>
<string name="notification_channel_missed_call" msgid="7168893015283909012">"Buraxılmış zənglər"</string>
- <string name="notification_channel_call_blocking" msgid="2028807677868598710">"Zəngi Bloklama"</string>
+ <string name="notification_channel_call_blocking" msgid="2028807677868598710">"Zəng bloklanması"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Arxa fon zəngləri"</string>
- <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Əlaqəsi kəsilmiş zənglər"</string>
- <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Xəta baş verən telefon tətbiqləri"</string>
+ <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Kəsilmiş zənglər"</string>
+ <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Tətbiq xətaları"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Bu zəngin yerləşdirilməsi <xliff:g id="OTHER_APP">%1$s</xliff:g> zəngini sonlandıracaq."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Bu zəngi necə etməyi seçin"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> istifadə edərək zəngi yönləndirin"</string>
<string name="alert_place_unredirect_outgoing_call" msgid="2467608535225764006">"Telefon nömrəmdən istifadə edərək zəng edin"</string>
<string name="alert_redirect_outgoing_call_timeout" msgid="5568101425637373060">"<xliff:g id="OTHER_APP">%1$s</xliff:g> ilə zəng etmək mümkün deyil. Başqa zəng yönləndirmə tətbiqindən istifadə edin və ya yardım üçün developerlə əlaqə saxlayın."</string>
- <string name="phone_settings_call_blocking_txt" msgid="7311523114822507178">"Zəngi Bloklama"</string>
+ <string name="phone_settings_call_blocking_txt" msgid="7311523114822507178">"Zəng bloklanması"</string>
<string name="phone_settings_number_not_in_contact_txt" msgid="2602249106007265757">"Kontaktda olmayan nömrələr"</string>
<string name="phone_settings_number_not_in_contact_summary_txt" msgid="963327038085718969">"Kontaktda göstərilməyən nömrələri blok edin"</string>
<string name="phone_settings_private_num_txt" msgid="6339272760338475619">"Şəxsi"</string>
@@ -114,10 +114,10 @@
<string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"Ödənişli telefon zənglərini blok edin"</string>
<string name="phone_settings_unknown_txt" msgid="3577926178354772728">"Naməlum"</string>
<string name="phone_settings_unknown_summary_txt" msgid="5446657192535779645">"Naməlum şəxslərdən gələn zəngləri blok edin"</string>
- <string name="phone_strings_call_blocking_turned_off_notification_title_txt" msgid="2895809176537908791">"Zəngi Bloklama"</string>
- <string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"Zəngi Bloklama deaktivdir"</string>
+ <string name="phone_strings_call_blocking_turned_off_notification_title_txt" msgid="2895809176537908791">"Zəng bloklanması"</string>
+ <string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"Zəng bloklanmır"</string>
<string name="phone_strings_emergency_call_made_dialog_title_txt" msgid="6629412508584507377">"Təcili zəng edildi"</string>
- <string name="phone_strings_emergency_call_made_dialog_call_blocking_text_txt" msgid="3140411733995271126">"Təcili zənglərə cavab verənlərin Sizinlə əlaqə saxlamalarına icazə vermək üçün Zəngi Bloklama deaktiv edilib."</string>
+ <string name="phone_strings_emergency_call_made_dialog_call_blocking_text_txt" msgid="3140411733995271126">"Təcili xidmətlərin sizinlə əlaqə saxlamaları üçün zənglər bloklanmır."</string>
<string name="developer_title" msgid="9146088855661672353">"Telecom Tərtibatçı Menyusu"</string>
<string name="toast_emergency_can_not_pull_call" msgid="9074229465338410869">"Təcili zəng zamanı zəng edilə bilməz."</string>
</resources>
diff --git a/res/values-b+sr+Latn/config.xml b/res/values-b+sr+Latn/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-b+sr+Latn/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-be/config.xml b/res/values-be/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-be/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-bg/config.xml b/res/values-bg/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-bg/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-bn/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-bs/config.xml b/res/values-bs/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-bs/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ca/config.xml b/res/values-ca/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ca/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-cs/config.xml b/res/values-cs/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-cs/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-da/config.xml b/res/values-da/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-da/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-de/config.xml b/res/values-de/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-de/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index c434ecc..f60d207 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -57,9 +57,9 @@
<string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"Als Standard festlegen"</string>
<string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"Abbrechen"</string>
<string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> wird alle Anruffunktionen steuern. Nur vertrauenswürdige Apps sollten als Standard-Telefon-App festgelegt werden."</string>
- <string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"<xliff:g id="NEW_APP">%s</xliff:g> als Standard-App für Call Screening festlegen?"</string>
- <string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"Das Call Screening mit <xliff:g id="OLD_APP">%s</xliff:g> ist nicht mehr möglich."</string>
- <string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"<xliff:g id="NEW_APP">%s</xliff:g> kann Informationen zu Anrufern, die nicht in deinen Kontakten gespeichert sind, erkennen und die Anrufe blockieren. Du solltest nur Apps, denen du vertraust, als Standard-App für das Call Screening festlegen."</string>
+ <string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"<xliff:g id="NEW_APP">%s</xliff:g> als Standard-App für Anruf-Filter festlegen?"</string>
+ <string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"Der Anruf-Filter mit <xliff:g id="OLD_APP">%s</xliff:g> ist nicht mehr möglich."</string>
+ <string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"<xliff:g id="NEW_APP">%s</xliff:g> kann Informationen zu Anrufern, die nicht in deinen Kontakten gespeichert sind, erkennen und die Anrufe blockieren. Du solltest nur Apps, denen du vertraust, als Standard-App für den Anruf-Filter festlegen."</string>
<string name="change_default_call_screening_dialog_affirmative" msgid="7162433828280058647">"Als Standard festlegen"</string>
<string name="change_default_call_screening_dialog_negative" msgid="1839266125623106342">"Abbrechen"</string>
<string name="blocked_numbers" msgid="8322134197039865180">"Blockierte Nummern"</string>
diff --git a/res/values-el/config.xml b/res/values-el/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-el/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-en-rAU/config.xml b/res/values-en-rAU/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-en-rAU/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-en-rCA/config.xml b/res/values-en-rCA/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-en-rCA/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-en-rGB/config.xml b/res/values-en-rGB/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-en-rGB/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-en-rIN/config.xml b/res/values-en-rIN/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-en-rIN/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-en-rXC/config.xml b/res/values-en-rXC/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-en-rXC/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-es-rUS/config.xml b/res/values-es-rUS/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-es-rUS/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-es/config.xml b/res/values-es/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-es/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index e124de4..b7b9cff 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -99,7 +99,7 @@
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"Bloqueo de llamadas"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Llamadas en segundo plano"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Llamadas interrumpidas"</string>
- <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplicaciones para teléfonos con bloqueos"</string>
+ <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Aplicaciones para teléfonos con fallos"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Si haces esta llamada, se finalizará la de <xliff:g id="OTHER_APP">%1$s</xliff:g>."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Elige cómo quieres hacer esta llamada"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Redirigir llamada con <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
diff --git a/res/values-et/config.xml b/res/values-et/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-et/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-eu/config.xml b/res/values-eu/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-eu/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index c8956cd..1191f52 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -85,9 +85,9 @@
<string name="answering_ends_other_call" msgid="8653544281903986641">"Erantzuten baduzu, amaitu egingo da <xliff:g id="CALL_VIA">%1$s</xliff:g> deia"</string>
<string name="answering_ends_other_calls" msgid="3702302838456922535">"Erantzuten baduzu, amaitu egingo dira <xliff:g id="CALL_VIA">%1$s</xliff:g> deiak"</string>
<string name="answering_ends_other_video_call" msgid="8572022039304239958">"Erantzuten baduzu, amaitu egingo da <xliff:g id="CALL_VIA">%1$s</xliff:g> bideo-deia"</string>
- <string name="answering_ends_other_managed_call" msgid="4031778317409881805">"Erantzuten baduzu, amaitu egingo da uneko deia"</string>
- <string name="answering_ends_other_managed_calls" msgid="3974069768615307659">"Erantzuten baduzu, amaitu egingo dira uneko deiak"</string>
- <string name="answering_ends_other_managed_video_call" msgid="1988508241432031327">"Erantzuten baduzu, amaitu egingo da uneko bideo-deia"</string>
+ <string name="answering_ends_other_managed_call" msgid="4031778317409881805">"Erantzuten baduzu, amaitu egingo da oraingo deia"</string>
+ <string name="answering_ends_other_managed_calls" msgid="3974069768615307659">"Erantzuten baduzu, amaitu egingo dira oraingo deiak"</string>
+ <string name="answering_ends_other_managed_video_call" msgid="1988508241432031327">"Erantzuten baduzu, amaitu egingo da oraingo bideo-deia"</string>
<string name="answer_incoming_call" msgid="2045888814782215326">"Erantzun"</string>
<string name="decline_incoming_call" msgid="922147089348451310">"Baztertu"</string>
<string name="cant_call_due_to_no_supported_service" msgid="1635626384149947077">"Ezin da egin deia, ez dagoelako mota honetako deiak onartzen duen deiak egiteko konturik."</string>
diff --git a/res/values-fa/config.xml b/res/values-fa/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-fa/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-fi/config.xml b/res/values-fi/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-fi/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index cf57d62..74cdf7e 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -55,13 +55,13 @@
<string name="add_vm_number_str" msgid="5179510133063168998">"Lisää numero"</string>
<string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"Valitaanko <xliff:g id="NEW_APP">%s</xliff:g> oletuspuhelinsovellukseksi?"</string>
<string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"Aseta oletukseksi"</string>
- <string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"Peruuta"</string>
+ <string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"Peru"</string>
<string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> voi hallita kaikkia puhelutoimintoja. Aseta oletuspuhelinsovellukseksi vain luotettava sovellus."</string>
<string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"Määritetäänkö <xliff:g id="NEW_APP">%s</xliff:g> puheluseulonnan oletussovellukseksi?"</string>
<string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"<xliff:g id="OLD_APP">%s</xliff:g> ei voi enää seuloa puheluita."</string>
<string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"<xliff:g id="NEW_APP">%s</xliff:g> näkee tietoa soittajista, jotka eivät ole yhteystiedoissasi, ja pystyy estämään heiltä tulevat puhelut. Puheluseulonnan oletussovellukseksi kannattaa määrittää vain sellainen sovellus, johon luotat."</string>
<string name="change_default_call_screening_dialog_affirmative" msgid="7162433828280058647">"Määritä oletussovellus"</string>
- <string name="change_default_call_screening_dialog_negative" msgid="1839266125623106342">"Peruuta"</string>
+ <string name="change_default_call_screening_dialog_negative" msgid="1839266125623106342">"Peru"</string>
<string name="blocked_numbers" msgid="8322134197039865180">"Estetyt numerot"</string>
<string name="blocked_numbers_msg" msgid="2797422132329662697">"Et voi vastaanottaa puheluita tai tekstiviestejä estetyistä numeroista."</string>
<string name="block_number" msgid="3784343046852802722">"Lisää numero"</string>
diff --git a/res/values-fr-rCA/config.xml b/res/values-fr-rCA/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-fr-rCA/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 74faab9..5061eda 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -104,7 +104,7 @@
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Choisissez comment passer cet appel"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Rediriger l\'appel en utilisant <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
<string name="alert_place_unredirect_outgoing_call" msgid="2467608535225764006">"Appeler en utilisant mon numéro de téléphone"</string>
- <string name="alert_redirect_outgoing_call_timeout" msgid="5568101425637373060">"Impossible de passer l\'appel au moyen de l\'application <xliff:g id="OTHER_APP">%1$s</xliff:g>. Essayez d\'utiliser une autre application de redirection d\'appels ou de communiquer avec le concepteur de l\'application pour obtenir de l\'aide."</string>
+ <string name="alert_redirect_outgoing_call_timeout" msgid="5568101425637373060">"Impossible de passer l\'appel au moyen de l\'application <xliff:g id="OTHER_APP">%1$s</xliff:g>. Essayez d\'utiliser une autre application de redirection d\'appels ou de communiquer avec le développeur de l\'application pour obtenir de l\'aide."</string>
<string name="phone_settings_call_blocking_txt" msgid="7311523114822507178">"Blocage des appels"</string>
<string name="phone_settings_number_not_in_contact_txt" msgid="2602249106007265757">"Numéros non répertoriés dans les contacts"</string>
<string name="phone_settings_number_not_in_contact_summary_txt" msgid="963327038085718969">"Bloquer les numéros non répertoriés dans vos contacts"</string>
diff --git a/res/values-fr/config.xml b/res/values-fr/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-fr/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-gl/config.xml b/res/values-gl/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-gl/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-gu/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 7455080..731618a 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -16,13 +16,13 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"કૉલ સંચાલન"</string>
+ <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"કૉલ મેનેજમેન્ટ"</string>
<string name="userCallActivityLabel" product="default" msgid="3605391260292846248">"ફોન"</string>
<string name="unknown" msgid="6993977514360123431">"અજાણ્યું"</string>
<string name="notification_missedCallTitle" msgid="5060387047205532974">"ચૂકી ગયેલો કૉલ"</string>
<string name="notification_missedWorkCallTitle" msgid="6965463282259034953">"ચૂકી ગયેલ કાર્ય કૉલ"</string>
- <string name="notification_missedCallsTitle" msgid="3910479625507893809">"છૂટેલા કૉલ્સ"</string>
- <string name="notification_missedCallsMsg" msgid="5055782736170916682">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> છૂટેલા કૉલ્સ"</string>
+ <string name="notification_missedCallsTitle" msgid="3910479625507893809">"ચૂકી ગયેલા કૉલ"</string>
+ <string name="notification_missedCallsMsg" msgid="5055782736170916682">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ચૂકી ગયેલા કૉલ"</string>
<string name="notification_missedCallTicker" msgid="6731461957487087769">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> નો કૉલ ચૂકી ગયાં"</string>
<string name="notification_missedCall_call_back" msgid="7900333283939789732">"કૉલ બેક"</string>
<string name="notification_missedCall_message" msgid="4054698824390076431">"સંદેશ"</string>
@@ -95,7 +95,7 @@
<string name="cant_call_due_to_ongoing_calls" msgid="6379163795277824868">"તમારા <xliff:g id="OTHER_CALL">%1$s</xliff:g> કૉલને કારણે કૉલ કરી શકતાં નથી."</string>
<string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"અન્ય ઍપ્લિકેશનમાં કૉલને કારણે કૉલ કરી શકતાં નથી."</string>
<string name="notification_channel_incoming_call" msgid="5245550964701715662">"ઇનકમિંગ કૉલ"</string>
- <string name="notification_channel_missed_call" msgid="7168893015283909012">"છૂટેલા કૉલ"</string>
+ <string name="notification_channel_missed_call" msgid="7168893015283909012">"ચૂકી ગયેલા કૉલ"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"કૉલ બ્લૉક કરી રહ્યાં છીએ"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"બૅકગ્રાઉન્ડ કૉલ"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ડિસ્કનેક્ટ કરેલા કૉલ"</string>
diff --git a/res/values-hi/config.xml b/res/values-hi/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-hi/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index ed623b8..4562a5f 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"कॉल प्रबंधन"</string>
+ <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"कॉल मैनेजमेंट"</string>
<string name="userCallActivityLabel" product="default" msgid="3605391260292846248">"फ़ोन"</string>
<string name="unknown" msgid="6993977514360123431">"अज्ञात"</string>
<string name="notification_missedCallTitle" msgid="5060387047205532974">"छूटी कॉल"</string>
diff --git a/res/values-hr/config.xml b/res/values-hr/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-hr/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index ff38e54..d341565 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"Upravljanje pozivom"</string>
+ <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"Upravljanje pozivima"</string>
<string name="userCallActivityLabel" product="default" msgid="3605391260292846248">"Telefon"</string>
<string name="unknown" msgid="6993977514360123431">"Nepoznato"</string>
<string name="notification_missedCallTitle" msgid="5060387047205532974">"Propušteni poziv"</string>
diff --git a/res/values-hu/config.xml b/res/values-hu/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-hu/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-hy/config.xml b/res/values-hy/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-hy/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 6987dab..98a3bc1 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -115,7 +115,7 @@
<string name="phone_settings_unknown_txt" msgid="3577926178354772728">"Անհայտ համարներ"</string>
<string name="phone_settings_unknown_summary_txt" msgid="5446657192535779645">"Արգելափակել անհայտ համարներից եկող զանգերը"</string>
<string name="phone_strings_call_blocking_turned_off_notification_title_txt" msgid="2895809176537908791">"Զանգերի արգելափակում"</string>
- <string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"Զանգերի արգելափակումն անջատած է"</string>
+ <string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"Զանգերի արգելափակումն անջատված է"</string>
<string name="phone_strings_emergency_call_made_dialog_title_txt" msgid="6629412508584507377">"Կատարվեց շտապ կանչ"</string>
<string name="phone_strings_emergency_call_made_dialog_call_blocking_text_txt" msgid="3140411733995271126">"Զանգերի արգելափակումն անջատվել է, որպեսզի արտակարգ ծառայությունները կարողանան ձեզ զանգել:"</string>
<string name="developer_title" msgid="9146088855661672353">"Telecom-ի մշակողի ընտրացանկ"</string>
diff --git a/res/values-in/config.xml b/res/values-in/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-in/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 23ebb73..f479340 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -65,13 +65,13 @@
<string name="blocked_numbers" msgid="8322134197039865180">"Nomor yang diblokir"</string>
<string name="blocked_numbers_msg" msgid="2797422132329662697">"Anda tidak akan menerima telepon atau SMS dari nomor yang diblokir."</string>
<string name="block_number" msgid="3784343046852802722">"Tambahkan nomor"</string>
- <string name="unblock_dialog_body" msgid="2723393535797217261">"Batalkan pemblokiran <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
- <string name="unblock_button" msgid="8732021675729981781">"Batalkan pemblokiran"</string>
+ <string name="unblock_dialog_body" msgid="2723393535797217261">"Berhenti memblokir <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
+ <string name="unblock_button" msgid="8732021675729981781">"Berhenti memblokir"</string>
<string name="add_blocked_dialog_body" msgid="8599974422407139255">"Blokir panggilan telepon dan SMS dari"</string>
<string name="add_blocked_number_hint" msgid="8769422085658041097">"Nomor telepon"</string>
<string name="block_button" msgid="485080149164258770">"Blokir"</string>
<string name="non_primary_user" msgid="315564589279622098">"Hanya pemilik perangkat yang dapat melihat dan mengelola nomor yang diblokir."</string>
- <string name="delete_icon_description" msgid="5335959254954774373">"Bebaskan"</string>
+ <string name="delete_icon_description" msgid="5335959254954774373">"Berhenti memblokir"</string>
<string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"Blokir dinonaktifkan sementara"</string>
<string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"Setelah Anda menelepon atau mengirim SMS ke nomor gawat darurat, blokir akan dinonaktifkan agar layanan gawat darurat tersebut dapat menghubungi Anda."</string>
<string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"Aktifkan lagi sekarang"</string>
diff --git a/res/values-is/config.xml b/res/values-is/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-is/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-it/config.xml b/res/values-it/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-it/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-iw/config.xml b/res/values-iw/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-iw/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 30a909b..17e4a1b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -24,7 +24,7 @@
<string name="notification_missedCallsTitle" msgid="3910479625507893809">"שיחות שלא נענו"</string>
<string name="notification_missedCallsMsg" msgid="5055782736170916682">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> שיחות שלא נענו"</string>
<string name="notification_missedCallTicker" msgid="6731461957487087769">"שיחה שלא נענתה מאת <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_missedCall_call_back" msgid="7900333283939789732">"התקשר חזרה"</string>
+ <string name="notification_missedCall_call_back" msgid="7900333283939789732">"התקשרות בחזרה"</string>
<string name="notification_missedCall_message" msgid="4054698824390076431">"שליחת הודעה"</string>
<string name="notification_disconnectedCall_title" msgid="1790131923692416928">"השיחה נותקה"</string>
<string name="notification_disconnectedCall_body" msgid="600491714584417536">"השיחה עם <xliff:g id="CALLER">%s</xliff:g> נותקה בגלל שיחת חירום."</string>
@@ -37,7 +37,7 @@
<string name="accessibility_speakerphone_enabled" msgid="555386652061614267">"רמקול מופעל."</string>
<string name="respond_via_sms_canned_response_1" msgid="6332561460870382561">"לא נוח לי עכשיו. מה קורה?"</string>
<string name="respond_via_sms_canned_response_2" msgid="2052951316129952406">"תיכף אחזור אליך."</string>
- <string name="respond_via_sms_canned_response_3" msgid="6656147963478092035">"אני אתקשר אליך יותר מאוחר."</string>
+ <string name="respond_via_sms_canned_response_3" msgid="6656147963478092035">"אתקשר אליך יותר מאוחר."</string>
<string name="respond_via_sms_canned_response_4" msgid="9141132488345561047">"לא נוח לי עכשיו. נדבר אחר כך?"</string>
<string name="respond_via_sms_setting_title" msgid="4762275482898830160">"תגובות מהירות"</string>
<string name="respond_via_sms_setting_title_2" msgid="4914853536609553457">"עריכת תגובות מהירות"</string>
@@ -48,15 +48,15 @@
<string name="enable_account_preference_title" msgid="6949224486748457976">"חשבונות לביצוע שיחות"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"ניתן לבצע רק שיחות חירום."</string>
<string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"לא ניתן להוציא שיחות באמצעות האפליקציה הזו ללא ההרשאה \'טלפון\'."</string>
- <string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"כדי להתקשר, הזן מספר טלפון חוקי."</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"כדי להתקשר, יש להזין מספר טלפון חוקי."</string>
<string name="duplicate_video_call_not_allowed" msgid="5754746140185781159">"לא ניתן כעת להוסיף את השיחה."</string>
<string name="no_vm_number" msgid="2179959110602180844">"חסר מספר של דואר קולי"</string>
<string name="no_vm_number_msg" msgid="1339245731058529388">"בכרטיס ה-SIM לא מאוחסן מספר של דואר קולי."</string>
- <string name="add_vm_number_str" msgid="5179510133063168998">"הוסף מספר"</string>
+ <string name="add_vm_number_str" msgid="5179510133063168998">"הוספת מספר"</string>
<string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"האם להפוך את <xliff:g id="NEW_APP">%s</xliff:g> לברירת המחדל לאפליקציית \'טלפון\'?"</string>
- <string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"הגדר כברירת מחדל"</string>
+ <string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"הגדרה כברירת מחדל"</string>
<string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"ביטול"</string>
- <string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> תוכל להתקשר ולשלוט בכל ההיבטים של השיחות. מומלץ לבחור רק אפליקציות שאתה סומך עליהן כברירת המחדל לאפליקציית \'טלפון\'."</string>
+ <string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> תוכל להתקשר ולשלוט בכל ההיבטים של השיחות. מומלץ לבחור רק אפליקציות שסומכים עליהן כברירת המחדל לאפליקציית \'טלפון\'."</string>
<string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"רוצה להפוך את <xliff:g id="NEW_APP">%s</xliff:g> לאפליקציית ברירת המחדל שלך לסינון שיחות?"</string>
<string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"אפליקציית <xliff:g id="OLD_APP">%s</xliff:g> לא תוכל לסנן שיחות עוד."</string>
<string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"אפליקציית <xliff:g id="NEW_APP">%s</xliff:g> תוכל לראות מידע על מתקשרים שאינם באנשי הקשר שלך ולחסום שיחות מהם. מומלץ לבחור רק אפליקציות שסומכים עליהן כברירת המחדל לסינון שיחות."</string>
@@ -74,12 +74,12 @@
<string name="delete_icon_description" msgid="5335959254954774373">"ביטול חסימה"</string>
<string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"החסימה הושבתה זמנית"</string>
<string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"לאחר חיוג או שליחת הודעה למספר חירום, החסימה תושבת כדי ששירותי החירום יוכלו ליצור איתך קשר."</string>
- <string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"הפעל מחדש עכשיו"</string>
+ <string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"הפעלה מחדש עכשיו"</string>
<string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> נחסם"</string>
<string name="blocked_numbers_number_unblocked_message" msgid="2933071624674945601">"החסימה של <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> בוטלה"</string>
<string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"אי אפשר לחסום מספרי חירום."</string>
<string name="blocked_numbers_number_already_blocked_message" msgid="2301270825735665458">"המספר <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> כבר חסום."</string>
- <string name="toast_personal_call_msg" msgid="5817631570381795610">"משתמש בחייגן האישי כדי להתקשר"</string>
+ <string name="toast_personal_call_msg" msgid="5817631570381795610">"נעשה שימוש בחייגן האישי כדי להתקשר"</string>
<string name="notification_incoming_call" msgid="1233481138362230894">"<xliff:g id="CALL_FROM">%2$s</xliff:g> מתקשר/ת אליך ב-<xliff:g id="CALL_VIA">%1$s</xliff:g>"</string>
<string name="notification_incoming_video_call" msgid="5795968314037063900">"<xliff:g id="CALL_FROM">%2$s</xliff:g> מתקשר/ת אליך בשיחת וידאו ב-<xliff:g id="CALL_VIA">%1$s</xliff:g>"</string>
<string name="answering_ends_other_call" msgid="8653544281903986641">"מענה יסיים את השיחה ב-<xliff:g id="CALL_VIA">%1$s</xliff:g>"</string>
diff --git a/res/values-ja/config.xml b/res/values-ja/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ja/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index bd87d66..a11d8d2 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -99,7 +99,7 @@
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"着信のブロック"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"バックグラウンドでの通話"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"通話の切断"</string>
- <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"スマートフォン アプリがクラッシュしたとき"</string>
+ <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"通話アプリがクラッシュしたとき"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"この通話を発信すると、<xliff:g id="OTHER_APP">%1$s</xliff:g> の通話が終了します。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"通話の発信方法を選択してください"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> を使用して通話をリダイレクト"</string>
diff --git a/res/values-ka/config.xml b/res/values-ka/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ka/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-kk/config.xml b/res/values-kk/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-kk/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-km/config.xml b/res/values-km/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-km/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-kn/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6e0bb59..dff4d0a 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -98,7 +98,7 @@
<string name="notification_channel_missed_call" msgid="7168893015283909012">"ಮಿಸ್ಡ್ ಕಾಲ್ಗಳು"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ಹಿನ್ನೆಲೆ ಕರೆಗಳು"</string>
- <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ಕರೆಗಳ ಕನೆಕ್ಷನ್ ಅನ್ನು ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಕರೆಗಳು"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ಕ್ರ್ಯಾಶ್ ಆಗಿರುವ ಫೋನ್ ಆ್ಯಪ್ಗಳು"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ಈ ಕರೆಯನ್ನು ಮಾಡುವುದರಿಂದ ನಿಮ್ಮ <xliff:g id="OTHER_APP">%1$s</xliff:g> ಕರೆಯು ಅಂತ್ಯಗೊಳ್ಳುತ್ತದೆ."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ಈ ಕರೆ ಮಾಡುವುದು ಹೇಗೆ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
diff --git a/res/values-ko/config.xml b/res/values-ko/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ko/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ky/config.xml b/res/values-ky/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ky/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-lo/config.xml b/res/values-lo/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-lo/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-lt/config.xml b/res/values-lt/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-lt/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-lv/config.xml b/res/values-lv/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-lv/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-mk/config.xml b/res/values-mk/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-mk/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 99e211f..a9b3cc3 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -98,7 +98,7 @@
<string name="notification_channel_missed_call" msgid="7168893015283909012">"Пропуштени повици"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"Блокирање повици"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"Повици во заднина"</string>
- <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Исклучени повици"</string>
+ <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"Прекинати повици"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"Паднати апликации за телефон"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ако се воспостави повиков, вашиот повик на <xliff:g id="OTHER_APP">%1$s</xliff:g> ќе заврши."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Изберете како да се воспостави повиков"</string>
diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ml/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-mn/config.xml b/res/values-mn/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-mn/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-mr/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 331cf5c..c235aab 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -94,7 +94,7 @@
<string name="cant_call_due_to_ongoing_call" msgid="8004235328451385493">"आपल्या <xliff:g id="OTHER_CALL">%1$s</xliff:g> कॉलमुळे कॉल केला जाऊ शकत नाही."</string>
<string name="cant_call_due_to_ongoing_calls" msgid="6379163795277824868">"आपल्या <xliff:g id="OTHER_CALL">%1$s</xliff:g> कॉलमुळे कॉल केला जाऊ शकत नाही."</string>
<string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"दुसर्या ॲपमधील कॉलमुळे कॉल केला जाऊ शकत नाही."</string>
- <string name="notification_channel_incoming_call" msgid="5245550964701715662">"येणारे कॉल"</string>
+ <string name="notification_channel_incoming_call" msgid="5245550964701715662">"इनकमिंग कॉल"</string>
<string name="notification_channel_missed_call" msgid="7168893015283909012">"मिस्ड कॉल"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"कॉल ब्लॉक करणे"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"बॅकग्राउंड कॉल"</string>
@@ -111,9 +111,9 @@
<string name="phone_settings_private_num_txt" msgid="6339272760338475619">"खाजगी"</string>
<string name="phone_settings_private_num_summary_txt" msgid="6755758240544021037">"अशा कॉलरना ब्लॉक करा, जे त्यांचे क्रमांक उघड करत नाहीत"</string>
<string name="phone_settings_payphone_txt" msgid="5003987966052543965">"पे फोन"</string>
- <string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"पे फोनवरून येणारे कॉल ब्लॉक करा"</string>
+ <string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"पे फोनवरून इनकमिंग कॉल ब्लॉक करा"</string>
<string name="phone_settings_unknown_txt" msgid="3577926178354772728">"अज्ञात"</string>
- <string name="phone_settings_unknown_summary_txt" msgid="5446657192535779645">"अनोळखी कॉलरकडून येणारे कॉल ब्लॉक करा"</string>
+ <string name="phone_settings_unknown_summary_txt" msgid="5446657192535779645">"अनोळखी कॉलरकडून इनकमिंग कॉल ब्लॉक करा"</string>
<string name="phone_strings_call_blocking_turned_off_notification_title_txt" msgid="2895809176537908791">"कॉल ब्लॉक करणे"</string>
<string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"कॉल ब्लॉक करणे बंद केले"</string>
<string name="phone_strings_emergency_call_made_dialog_title_txt" msgid="6629412508584507377">"आणीबाणी कॉल केला"</string>
diff --git a/res/values-ms/config.xml b/res/values-ms/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ms/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-my/config.xml b/res/values-my/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-my/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index c1b3124..4d94c1a 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -98,7 +98,7 @@
<string name="notification_channel_missed_call" msgid="7168893015283909012">"လွတ်သွားသော ဖုန်းခေါ်ဆိုမှုများ"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"ခေါ်ဆိုမှု ပိတ်ထားခြင်း"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"နောက်ခံမှ ခေါ်ဆိုမှုများ"</string>
- <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ခေါ်ဆိုမှုများကို ဖြတ်တောက်လိုက်သည်"</string>
+ <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"ပြတ်တောက်သွားသည့် ခေါ်ဆိုမှုများ"</string>
<string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"ရပ်တန့်သွားသော ဖုန်းအက်ပ်များ"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"ဤခေါ်ဆိုမှု ပြုလုပ်ပါက <xliff:g id="OTHER_APP">%1$s</xliff:g> သုံးပြီးပြောနေခြင်းကို ဖြတ်ပစ်ပါမည်။"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"ဤခေါ်ဆိုမှု ပြုလုပ်ပုံကို ရွေးချယ်ပါ"</string>
diff --git a/res/values-nb/config.xml b/res/values-nb/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-nb/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ne/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 1e2b32f..5ef8bc0 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -22,7 +22,7 @@
<string name="notification_missedCallTitle" msgid="5060387047205532974">"छुटेका कल"</string>
<string name="notification_missedWorkCallTitle" msgid="6965463282259034953">"छुटेको कार्यको कल"</string>
<string name="notification_missedCallsTitle" msgid="3910479625507893809">"छुटेका कल"</string>
- <string name="notification_missedCallsMsg" msgid="5055782736170916682">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> छुटेका कलहरू"</string>
+ <string name="notification_missedCallsMsg" msgid="5055782736170916682">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> मिस कलहरू"</string>
<string name="notification_missedCallTicker" msgid="6731461957487087769">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>बाट छुटेका कल"</string>
<string name="notification_missedCall_call_back" msgid="7900333283939789732">"फेरि कल गर्नुहोस्"</string>
<string name="notification_missedCall_message" msgid="4054698824390076431">"सन्देश"</string>
@@ -30,9 +30,9 @@
<string name="notification_disconnectedCall_body" msgid="600491714584417536">"आपत्कालीन कल गरिएको हुनाले <xliff:g id="CALLER">%s</xliff:g> लाई गरिएको कल विच्छेद गरियो।"</string>
<string name="notification_disconnectedCall_generic_body" msgid="5282765206349184853">"आपत्कालीन कल जारी रहेको हुनाले तपाईंको कल विच्छेद गरिएको छ।"</string>
<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_audioProcessing_body" msgid="6397005913770420388">"<xliff:g id="AUDIO_PROCESSING_APP_NAME">%s</xliff:g> ले एउटा कल पृष्ठभूमिमा राखेको छ। कल गरेको बेला यो एपले अडियोमाथि पहुँच राखेर प्ले गरिरहेको हुन सक्छ।"</string>
<string name="notification_incallservice_not_responding_title" msgid="5347557574288598548">"<xliff:g id="IN_CALL_SERVICE_APP_NAME">%s</xliff:g> ले काम गर्न छाड्यो"</string>
- <string name="notification_incallservice_not_responding_body" msgid="9209308270131968623">"कल गर्नका लागि तपाईंको यन्त्रमा पहिल्यैदेखि रहेको फोन एप प्रयोग गरियो"</string>
+ <string name="notification_incallservice_not_responding_body" msgid="9209308270131968623">"कल गर्नका लागि तपाईंको डिभाइसमा पहिल्यैदेखि रहेको फोन एप प्रयोग गरियो"</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>
@@ -47,20 +47,20 @@
<string name="respond_via_sms_failure_format" msgid="5198680980054596391">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> मा सन्देश पठाउन सकिएन।"</string>
<string name="enable_account_preference_title" msgid="6949224486748457976">"कलिङ खाताहरू"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"आपत्कालीन कलहरूलाई मात्र अनुमति दिइएको छ।"</string>
- <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"यो अनुप्रयोगले फोनको अनुमति बिना बहिर्गमन कलहरू गर्न सक्दैन।"</string>
+ <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"यो एपले फोनको अनुमति बिना बहिर्गमन कलहरू गर्न सक्दैन।"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"एक कल गर्नको लागि, एक वैध नम्बर प्रविष्टि गर्नुहोस्।"</string>
<string name="duplicate_video_call_not_allowed" msgid="5754746140185781159">"यस समयमा कल थप गर्न सकिँदैन।"</string>
<string name="no_vm_number" msgid="2179959110602180844">"भ्वाइसमेल नम्बर हराइरहेको छ"</string>
<string name="no_vm_number_msg" msgid="1339245731058529388">"SIM कार्डमा कुनै पनि भ्वाइसमेल नम्बर भण्डारण भएको छैन।"</string>
<string name="add_vm_number_str" msgid="5179510133063168998">"नम्बर थप्नुहोस्"</string>
- <string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"तपाईंको पूर्वनिर्धारित फोन एप <xliff:g id="NEW_APP">%s</xliff:g> बनाउने हो?"</string>
- <string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"पूर्वनिर्धारित रूपमा सेट गर्नुहोस्"</string>
+ <string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"तपाईंको डिफल्ट फोन एप <xliff:g id="NEW_APP">%s</xliff:g> बनाउने हो?"</string>
+ <string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"डिफल्ट रूपमा सेट गर्नुहोस्"</string>
<string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"रद्द गर्नुहोस्"</string>
- <string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> कलका सबै पक्षहरूलाई स्थापित गर्न र नियन्त्रण गर्न सक्षम हुने छ। तपाईंलाई विश्वास लाग्ने एपहरूलाई मात्र फोनमा पूर्वनिर्धारित एपका रूपमा सेट गर्नुपर्छ।"</string>
- <string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"तपाईंको पूर्वनिर्धारित कल स्क्रिन एप <xliff:g id="NEW_APP">%s</xliff:g> बनाउने हो?"</string>
+ <string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> कलका सबै पक्षहरूलाई स्थापित गर्न र नियन्त्रण गर्न सक्षम हुने छ। तपाईंलाई विश्वास लाग्ने एपहरूलाई मात्र फोनमा डिफल्ट एपका रूपमा सेट गर्नुपर्छ।"</string>
+ <string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"तपाईंको डिफल्ट कल स्क्रिन एप <xliff:g id="NEW_APP">%s</xliff:g> बनाउने हो?"</string>
<string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"<xliff:g id="OLD_APP">%s</xliff:g> ले अब उप्रान्त कलहरू स्क्रिन गर्न सक्ने छैनन्।"</string>
- <string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"<xliff:g id="NEW_APP">%s</xliff:g> ले तपाईंको सम्पर्कमा नभएका कल गर्ने व्यक्तिका जानकारी हेर्न सक्छ र तिनीहरूमाथि रोक लगाउन सक्छ। तपाईंलाई विश्वास लाग्ने एपहरूलाई मात्र कल स्क्रिन पूर्वनिर्धारित एपका रूपमा सेट गर्नुपर्छ।"</string>
- <string name="change_default_call_screening_dialog_affirmative" msgid="7162433828280058647">"पूर्वनिर्धारित रूपमा सेट गर्नुहोस्"</string>
+ <string name="change_default_call_screening_warning_message" msgid="9020537562292754269">"<xliff:g id="NEW_APP">%s</xliff:g> ले तपाईंको सम्पर्कमा नभएका कल गर्ने व्यक्तिका जानकारी हेर्न सक्छ र तिनीहरूमाथि रोक लगाउन सक्छ। तपाईंलाई विश्वास लाग्ने एपहरूलाई मात्र कल स्क्रिन डिफल्ट एपका रूपमा सेट गर्नुपर्छ।"</string>
+ <string name="change_default_call_screening_dialog_affirmative" msgid="7162433828280058647">"डिफल्ट रूपमा सेट गर्नुहोस्"</string>
<string name="change_default_call_screening_dialog_negative" msgid="1839266125623106342">"रद्द गर्नुहोस्"</string>
<string name="blocked_numbers" msgid="8322134197039865180">"रोकिएका नम्बरहरू"</string>
<string name="blocked_numbers_msg" msgid="2797422132329662697">"तपाईँले रोक लगाइएका नम्बरहरूबाट फोन वा टेक्स्ट म्यासेजहरू प्राप्त गर्नुहुने छैन।"</string>
@@ -73,7 +73,7 @@
<string name="non_primary_user" msgid="315564589279622098">"यन्त्रको मालिकले रोकिएका नम्बरहरूलाई हेर्न र व्यवस्थापन गर्न सक्छ।"</string>
<string name="delete_icon_description" msgid="5335959254954774373">"अनब्लक गर्नुहोस्"</string>
<string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"रोक लगाउने काम अस्थायी रूपमा निष्क्रिय छ"</string>
- <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"तपाईँले आपत्कालीन नम्बरमा डायल गरेपछि वा पाठ सन्देश पठाएपछि आपत्कालीन सेवाहरूले तपाईँलाई सम्पर्क गर्न सकून् भन्ने कुरा सुनिश्चित गर्न कलमाथिको अवरोध निष्क्रिय गरिन्छ।"</string>
+ <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"तपाईँले आपत्कालीन नम्बरमा डायल गरेपछि वा टेक्स्ट म्यासेज पठाएपछि आपत्कालीन सेवाहरूले तपाईँलाई सम्पर्क गर्न सकून् भन्ने कुरा सुनिश्चित गर्न कलमाथिको अवरोध निष्क्रिय गरिन्छ।"</string>
<string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"अब पुन:-सक्रिय गर्नुहोस्"</string>
<string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> माथि रोक लगाइयो"</string>
<string name="blocked_numbers_number_unblocked_message" msgid="2933071624674945601">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> माथिको रोक हटाइयो"</string>
@@ -93,13 +93,13 @@
<string name="cant_call_due_to_no_supported_service" msgid="1635626384149947077">"यस प्रकारका कलहरूलाई समर्थन गर्ने कुनै पनि कल गर्ने खाता नभएकाले कल गर्न सकिँदैन।"</string>
<string name="cant_call_due_to_ongoing_call" msgid="8004235328451385493">"तपाईंको <xliff:g id="OTHER_CALL">%1$s</xliff:g> कलका कारण कल गर्न सकिँदैन।"</string>
<string name="cant_call_due_to_ongoing_calls" msgid="6379163795277824868">"तपाईंका <xliff:g id="OTHER_CALL">%1$s</xliff:g> कलहरूका कारण कल गर्न सकिँदैन।"</string>
- <string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"अर्को अनुप्रयोगमा जारी कलका कारण कल गर्न सकिँदैन।"</string>
+ <string name="cant_call_due_to_ongoing_unknown_call" msgid="8243532328969433172">"अर्को एपमा जारी कलका कारण कल गर्न सकिँदैन।"</string>
<string name="notification_channel_incoming_call" msgid="5245550964701715662">"आगमन कलहरू"</string>
- <string name="notification_channel_missed_call" msgid="7168893015283909012">"छुटेका कलहरू"</string>
+ <string name="notification_channel_missed_call" msgid="7168893015283909012">"मिस कलहरू"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"कलमाथि रोक लगाउने सुविधा"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"ब्याकग्राउन्डका कलहरू"</string>
<string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"विच्छेद गरिएका कल"</string>
- <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"क्र्यास भएका फोन एपहरू"</string>
+ <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"फोनमा रहेका क्र्यास भएका एपहरू"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"यो कल गर्नुले तपाईंको <xliff:g id="OTHER_APP">%1$s</xliff:g> कल अन्त्य गर्दछ।"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"यो कल गर्ने तरिका छनौट गर्नुहोस्"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"<xliff:g id="OTHER_APP">%1$s</xliff:g> प्रयोग गरी कल रिडाइरेक्ट गर्नुहोस्"</string>
diff --git a/res/values-nl/config.xml b/res/values-nl/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-nl/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-or/config.xml b/res/values-or/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-or/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index e0061a7..e3ca712 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -55,7 +55,7 @@
<string name="add_vm_number_str" msgid="5179510133063168998">"ନମ୍ବର୍ ଯୋଡ଼ନ୍ତୁ"</string>
<string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"<xliff:g id="NEW_APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ଫୋନ୍ର ଡିଫଲ୍ଟ ଆପ୍ କରିବେ?"</string>
<string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"ଡିଫଲ୍ଟ ସେଟ୍ କରନ୍ତୁ"</string>
- <string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
+ <string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"ବାତିଲ୍ କରନ୍ତୁ"</string>
<string name="change_default_dialer_warning_message" msgid="8461963987376916114">"<xliff:g id="NEW_APP">%s</xliff:g> କଲ୍ କରିବା ଏବଂ କଲ୍ର ସମସ୍ତ ଦିଗକୁ ନିୟନ୍ତ୍ରଣ କରିବାରେ ସକ୍ଷମ ହେବ। କେବଳ ନିଜର ଭରସାଯୋଗ୍ୟ ଆପ୍କୁ ଡିଫଲ୍ଟ ଫୋନ୍ ଆପ୍ ଭାବେ ସେଟ୍ କରିବା ଉଚିତ୍।"</string>
<string name="change_default_call_screening_dialog_title" msgid="5365787219927262408">"<xliff:g id="NEW_APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ କଲ୍ ସ୍କ୍ରିନିଂ ଆପ୍ କରିବେ?"</string>
<string name="change_default_call_screening_warning_message_for_disable_old_app" msgid="2039830033533243164">"<xliff:g id="OLD_APP">%s</xliff:g> କଲ୍ ସ୍କ୍ରିନ୍ କରିପାରିରିବେ ନାହିଁ।"</string>
diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-pa/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-pl/config.xml b/res/values-pl/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-pl/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-pt-rPT/config.xml b/res/values-pt-rPT/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-pt-rPT/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-pt/config.xml b/res/values-pt/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-pt/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ro/config.xml b/res/values-ro/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ro/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ru/config.xml b/res/values-ru/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ru/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-si/config.xml b/res/values-si/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-si/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sk/config.xml b/res/values-sk/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sk/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sl/config.xml b/res/values-sl/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sl/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sq/config.xml b/res/values-sq/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sq/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sr/config.xml b/res/values-sr/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sr/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sv/config.xml b/res/values-sv/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sv/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 70c4566..b646cbb 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -75,7 +75,7 @@
<string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"Blockeringen har inaktiverats tillfälligt"</string>
<string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"När du ringer eller sms:ar ett nödnummer inaktiveras blockering för att säkerställa att räddningstjänsten kan kontakta dig."</string>
<string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"Återaktivera nu"</string>
- <string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blockerade"</string>
+ <string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> har blockerats"</string>
<string name="blocked_numbers_number_unblocked_message" msgid="2933071624674945601">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> avblockerat"</string>
<string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"Det går inte att blockera nödnummer."</string>
<string name="blocked_numbers_number_already_blocked_message" msgid="2301270825735665458">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> är redan blockerat."</string>
diff --git a/res/values-sw/config.xml b/res/values-sw/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-sw/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 8b8a40c..d1142f7 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -43,7 +43,7 @@
<string name="respond_via_sms_setting_title_2" msgid="4914853536609553457">"Hariri majibu ya haraka"</string>
<string name="respond_via_sms_setting_summary" msgid="8054571501085436868"></string>
<string name="respond_via_sms_edittext_dialog_title" msgid="6579353156073272157">"Majibu ya haraka"</string>
- <string name="respond_via_sms_confirmation_format" msgid="2932395476561267842">"Ujumbe uliotumwa kwa <xliff:g id="PHONE_NUMBER">%s</xliff:g> ."</string>
+ <string name="respond_via_sms_confirmation_format" msgid="2932395476561267842">"Ujumbe umetumwa kwa <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
<string name="respond_via_sms_failure_format" msgid="5198680980054596391">"Imeshindwa kutuma SMS kwa <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
<string name="enable_account_preference_title" msgid="6949224486748457976">"Akaunti za simu"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"Piga simu za dharura pekee."</string>
diff --git a/res/values-ta/config.xml b/res/values-ta/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ta/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-te/config.xml b/res/values-te/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-te/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 58eb225..0dece34 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"కాల్ నిర్వహణ"</string>
+ <string name="telecommAppLabel" product="default" msgid="3077225713817780583">"కాల్ మేనేజ్మెంట్"</string>
<string name="userCallActivityLabel" product="default" msgid="3605391260292846248">"ఫోన్"</string>
<string name="unknown" msgid="6993977514360123431">"తెలియదు"</string>
<string name="notification_missedCallTitle" msgid="5060387047205532974">"సమాధానం ఇవ్వని కాల్"</string>
@@ -47,7 +47,7 @@
<string name="respond_via_sms_failure_format" msgid="5198680980054596391">"<xliff:g id="PHONE_NUMBER">%s</xliff:g>కు సందేశాన్ని పంపడం విఫలమైంది."</string>
<string name="enable_account_preference_title" msgid="6949224486748457976">"కాలింగ్ ఖాతాలు"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"కేవలం అత్యవసర కాల్లు మాత్రమే అనుమతించబడతాయి."</string>
- <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"ఈ అనువర్తనం ఫోన్ అనుమతి లేకుండా అవుట్గోయింగ్ కాల్లను చేయలేదు."</string>
+ <string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"ఈ యాప్ ఫోన్ అనుమతి లేకుండా అవుట్గోయింగ్ కాల్లను చేయలేదు."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"కాల్ చేయడానికి, చెల్లుబాటు అయ్యే నంబర్ను నమోదు చేయండి."</string>
<string name="duplicate_video_call_not_allowed" msgid="5754746140185781159">"ఈ సమయంలో కాల్ను జోడించడం సాధ్యపడదు."</string>
<string name="no_vm_number" msgid="2179959110602180844">"వాయిస్ మెయిల్ నంబర్ లేదు"</string>
diff --git a/res/values-th/config.xml b/res/values-th/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-th/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-tl/config.xml b/res/values-tl/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-tl/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-tr/config.xml b/res/values-tr/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-tr/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-uk/config.xml b/res/values-uk/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-uk/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-ur/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-uz/config.xml b/res/values-uz/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-uz/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-vi/config.xml b/res/values-vi/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-vi/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-zh-rCN/config.xml b/res/values-zh-rCN/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-zh-rCN/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index bbda818..6080b06 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -26,7 +26,7 @@
<string name="notification_missedCallTicker" msgid="6731461957487087769">"来自<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>的未接电话"</string>
<string name="notification_missedCall_call_back" msgid="7900333283939789732">"回拨"</string>
<string name="notification_missedCall_message" msgid="4054698824390076431">"发短信"</string>
- <string name="notification_disconnectedCall_title" msgid="1790131923692416928">"已中断的通话"</string>
+ <string name="notification_disconnectedCall_title" msgid="1790131923692416928">"通话中断"</string>
<string name="notification_disconnectedCall_body" msgid="600491714584417536">"由于要进行紧急呼叫,与 <xliff:g id="CALLER">%s</xliff:g> 的通话已中断。"</string>
<string name="notification_disconnectedCall_generic_body" msgid="5282765206349184853">"由于要进行紧急呼叫,您的通话已中断。"</string>
<string name="notification_audioProcessing_title" msgid="1619035039880584575">"后台通话"</string>
@@ -98,8 +98,8 @@
<string name="notification_channel_missed_call" msgid="7168893015283909012">"未接电话"</string>
<string name="notification_channel_call_blocking" msgid="2028807677868598710">"来电屏蔽"</string>
<string name="notification_channel_background_calls" msgid="7785659903711350506">"后台通话"</string>
- <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"已中断的通话"</string>
- <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"崩溃的手机应用"</string>
+ <string name="notification_channel_disconnected_calls" msgid="8228636543997645757">"通话中断"</string>
+ <string name="notification_channel_in_call_service_crash" msgid="7313237519166984267">"手机应用崩溃"</string>
<string name="alert_outgoing_call" msgid="5319895109298927431">"拨打此电话将导致<xliff:g id="OTHER_APP">%1$s</xliff:g>通话结束。"</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"选择拨打此电话的方式"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"使用<xliff:g id="OTHER_APP">%1$s</xliff:g>转移呼叫"</string>
diff --git a/res/values-zh-rHK/config.xml b/res/values-zh-rHK/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-zh-rHK/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-zh-rTW/config.xml b/res/values-zh-rTW/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-zh-rTW/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values-zu/config.xml b/res/values-zu/config.xml
new file mode 100644
index 0000000..5b355df
--- /dev/null
+++ b/res/values-zu/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 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.
+ -->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_diagnostic_service_package_name" msgid="2953253648590374717"></string>
+</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 9cbbf46..b0e50b0 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -69,4 +69,8 @@
<!-- When true, the options in the call blocking settings to block restricted and unknown
callers are combined into a single toggle. -->
<bool name="combine_options_to_block_restricted_and_unknown_callers">true</bool>
+
+ <!-- When set, Telecom will attempt to bind to the {@link CallDiagnosticService} implementation
+ defined by the app with this package name. -->
+ <string name="call_diagnostic_service_package_name"></string>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index df08d7c..9b49515 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -373,4 +373,6 @@
blocking functionality (for test purposes).
DO NOT TRANSLATE -->
<string name="developer_enhanced_call_blocking" translatable="false">Enhanced Call Blocking</string>
+ <!-- Button label for generic cancel action [CHAR LIMIT=20] -->
+ <string name="cancel">Cancel</string>
</resources>
diff --git a/scripts/aosp_tag_preupload.py b/scripts/aosp_tag_preupload.py
index 77a9714..bfcdbd6 100755
--- a/scripts/aosp_tag_preupload.py
+++ b/scripts/aosp_tag_preupload.py
@@ -41,15 +41,18 @@
commit_msg = subprocess.check_output(["git", "show",
sys.argv[1], "--no-notes"])
for commit_line in commit_msg.splitlines():
- if re.search(AOSP_COMMIT_TAG_REGEX, commit_line, re.IGNORECASE):
- _check_aosp_message(commit_line)
+ # Some lines in the commit message will be given to us as bytes
+ commit_line_str = str(commit_line)
+ if re.search(AOSP_COMMIT_TAG_REGEX, str(commit_line_str), re.IGNORECASE):
+ _check_aosp_message(commit_line_str)
print(ERROR_MESSAGE)
- sys.exit(0)
+ # Print the warning, but do not fail the presubmit check.
+ sys.exit(77)
def _is_in_aosp():
branch_info = subprocess.check_output(["git", "branch", "-vv"])
- return re.search(AOSP_BRANCH_REGEX, branch_info) is not None
+ return re.search(AOSP_BRANCH_REGEX, str(branch_info)) is not None
def _check_aosp_message(aosp_line):
if re.search(AOSP_COMMIT_LINK_REGEX, aosp_line):
@@ -59,7 +62,8 @@
sys.exit(0)
print(ERROR_MESSAGE)
- sys.exit(0)
+ # Print the warning, but do not fail the presubmit check.
+ sys.exit(77)
if __name__ == '__main__':
main()
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index dc862ab..ae0719b 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -37,13 +37,16 @@
import android.os.UserHandle;
import android.provider.CallLog;
import android.provider.ContactsContract.Contacts;
+import android.telecom.BluetoothCallQualityReport;
import android.telecom.CallAudioState;
import android.telecom.CallerInfo;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.ConnectionService;
+import android.telecom.DiagnosticCall;
import android.telecom.DisconnectCause;
import android.telecom.GatewayInfo;
+import android.telecom.InCallService;
import android.telecom.Log;
import android.telecom.Logging.EventManager;
import android.telecom.ParcelableConference;
@@ -58,6 +61,7 @@
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.widget.Toast;
import com.android.internal.annotations.VisibleForTesting;
@@ -154,6 +158,8 @@
Bundle extras, boolean isLegacy);
void onHandoverFailed(Call call, int error);
void onHandoverComplete(Call call);
+ void onBluetoothCallQualityReport(Call call, BluetoothCallQualityReport report);
+ void onReceivedDeviceToDeviceMessage(Call call, int messageType, int messageValue);
}
public abstract static class ListenerBase implements Listener {
@@ -242,6 +248,10 @@
public void onHandoverFailed(Call call, int error) {}
@Override
public void onHandoverComplete(Call call) {}
+ @Override
+ public void onBluetoothCallQualityReport(Call call, BluetoothCallQualityReport report) {}
+ @Override
+ public void onReceivedDeviceToDeviceMessage(Call call, int messageType, int messageValue) {}
}
private final CallerInfoLookupHelper.OnQueryCompleteListener mCallerInfoQueryListener =
@@ -510,6 +520,15 @@
private boolean mIsSelfManaged = false;
/**
+ * Indicates whether the {@link PhoneAccount} associated with an self-managed call want to
+ * expose the call to an {@link android.telecom.InCallService} which declares the metadata
+ * {@link TelecomManager#METADATA_INCLUDE_SELF_MANAGED_CALLS},
+ * For calls that {@link #mIsSelfManaged} is {@code false}, this value should be {@code false}
+ * as well.
+ */
+ private boolean mVisibleToInCallService = false;
+
+ /**
* Indicates whether the {@link PhoneAccount} associated with this call supports video calling.
* {@code True} if the phone account supports video calling, {@code false} otherwise.
*/
@@ -636,6 +655,13 @@
private String mCallScreeningComponentName;
/**
+ * When {@code true} indicates this call originated from a SIM-based {@link PhoneAccount}.
+ * A sim-based {@link PhoneAccount} is one with {@link PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION}
+ * set.
+ */
+ private boolean mIsSimCall;
+
+ /**
* Persists the specified parameters and initializes the new instance.
* @param context The context.
* @param repository The connection service repository.
@@ -778,10 +804,10 @@
}
public void initAnalytics() {
- initAnalytics(null);
+ initAnalytics(null, null);
}
- public void initAnalytics(String callingPackage) {
+ public void initAnalytics(String callingPackage, String extraCreationLogs) {
int analyticsDirection;
switch (mCallDirection) {
case CALL_DIRECTION_OUTGOING:
@@ -797,7 +823,7 @@
}
mAnalytics = Analytics.initiateCallAnalytics(mId, analyticsDirection);
mAnalytics.setCallIsEmergency(mIsEmergencyCall);
- Log.addEvent(this, LogUtils.Events.CREATED, callingPackage);
+ Log.addEvent(this, LogUtils.Events.CREATED, callingPackage + ";" + extraCreationLogs);
}
public Analytics.CallInfo getAnalytics() {
@@ -1066,6 +1092,10 @@
}
}
+ public void handleOverrideDisconnectMessage(@Nullable CharSequence message) {
+
+ }
+
/**
* Sets the call state. Although there exists the notion of appropriate state transitions
* (see {@link CallState}), in practice those expectations break down when cellular systems
@@ -1628,6 +1658,14 @@
setConnectionProperties(getConnectionProperties());
}
+ public boolean visibleToInCallService() {
+ return mVisibleToInCallService;
+ }
+
+ public void setVisibleToInCallService(boolean visibleToInCallService) {
+ mVisibleToInCallService = visibleToInCallService;
+ }
+
public void markFinishedHandoverStateAndCleanup(int handoverState) {
if (mHandoverSourceCall != null) {
mHandoverSourceCall.setHandoverState(handoverState);
@@ -1684,6 +1722,7 @@
PhoneAccountRegistrar phoneAccountRegistrar = mCallsManager.getPhoneAccountRegistrar();
boolean isWorkCall = false;
boolean isCallRecordingToneSupported = false;
+ boolean isSimCall = false;
PhoneAccount phoneAccount =
phoneAccountRegistrar.getPhoneAccountUnchecked(mTargetPhoneAccountHandle);
if (phoneAccount != null) {
@@ -1701,9 +1740,11 @@
PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) && phoneAccount.getExtras() != null
&& phoneAccount.getExtras().getBoolean(
PhoneAccount.EXTRA_PLAY_CALL_RECORDING_TONE, false));
+ isSimCall = phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION);
}
mIsWorkCall = isWorkCall;
mUseCallRecordingTone = isCallRecordingToneSupported;
+ mIsSimCall = isSimCall;
}
/**
@@ -1884,6 +1925,13 @@
if (didRttChange) {
if ((mConnectionProperties & Connection.PROPERTY_IS_RTT) ==
Connection.PROPERTY_IS_RTT) {
+ // If we already had RTT streams up, that means that either the call started
+ // with RTT or the user previously requested to start RTT. Either way, don't
+ // play the alert tone.
+ if (!areRttStreamsInitialized()) {
+ mCallsManager.playRttUpgradeToneForCall(this);
+ }
+
createRttStreams();
// Call startRtt to pass the RTT pipes down to the connection service.
// They already turned on the RTT property so no request should be sent.
@@ -1925,6 +1973,16 @@
}
}
+ boolean wasDowngradedConference =
+ (previousProperties & Connection.PROPERTY_IS_DOWNGRADED_CONFERENCE) != 0;
+ boolean isDowngradedConference =
+ (connectionProperties & Connection.PROPERTY_IS_DOWNGRADED_CONFERENCE) != 0;
+ if (wasDowngradedConference && !isDowngradedConference) {
+ Log.i(this, "DOWNGRADED_CONFERENCE property removed; setting"
+ + " conference state to false");
+ setConferenceState(false);
+ }
+
mAnalytics.addCallProperties(mConnectionProperties);
int xorProps = previousProperties ^ mConnectionProperties;
@@ -2933,6 +2991,14 @@
}
requestHandover(phoneAccountHandle, videoState, handoverExtrasBundle, true);
} else {
+ // Relay bluetooth call quality reports to the call diagnostic service.
+ if (BluetoothCallQualityReport.EVENT_BLUETOOTH_CALL_QUALITY_REPORT.equals(event)
+ && extras.containsKey(
+ BluetoothCallQualityReport.EXTRA_BLUETOOTH_CALL_QUALITY_REPORT)) {
+ notifyBluetoothCallQualityReport(extras.getParcelable(
+ BluetoothCallQualityReport.EXTRA_BLUETOOTH_CALL_QUALITY_REPORT
+ ));
+ }
Log.addEvent(this, LogUtils.Events.CALL_EVENT, event);
mConnectionService.sendCallEvent(this, event, extras);
}
@@ -2943,6 +3009,17 @@
}
/**
+ * Notifies listeners when a bluetooth quality report is received.
+ * @param report The bluetooth quality report.
+ */
+ void notifyBluetoothCallQualityReport(@NonNull BluetoothCallQualityReport report) {
+ Log.addEvent(this, LogUtils.Events.BT_QUALITY_REPORT, "choppy=" + report.isChoppyVoice());
+ for (Listener l : mListeners) {
+ l.onBluetoothCallQualityReport(this, report);
+ }
+ }
+
+ /**
* Initiates a handover of this Call to the {@link ConnectionService} identified
* by destAcct.
* @param destAcct ConnectionService to which the call should be handed over.
@@ -3672,6 +3749,17 @@
for (Listener l : mListeners) {
l.onCallSwitchFailed(this);
}
+ } else if (Connection.EVENT_DEVICE_TO_DEVICE_MESSAGE.equals(event)
+ && extras != null && extras.containsKey(
+ Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE)
+ && extras.containsKey(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE)) {
+ // Relay an incoming D2D message to interested listeners; most notably the
+ // CallDiagnosticService.
+ int messageType = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE);
+ int messageValue = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE);
+ for (Listener l : mListeners) {
+ l.onReceivedDeviceToDeviceMessage(this, messageType, messageValue);
+ }
} else {
for (Listener l : mListeners) {
l.onConnectionEvent(this, event, extras);
@@ -3873,6 +3961,44 @@
}
/**
+ * Sends a device to device message to the other part of the call.
+ * @param message the message type to send.
+ * @param value the value for the message.
+ */
+ public void sendDeviceToDeviceMessage(@DiagnosticCall.MessageType int message, int value) {
+ Log.i(this, "sendDeviceToDeviceMessage; callId=%s, msg=%d/%d", getId(), message, value);
+ Bundle extras = new Bundle();
+ extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE, message);
+ extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE, value);
+ // Send to the connection service.
+ sendCallEvent(Connection.EVENT_DEVICE_TO_DEVICE_MESSAGE, extras);
+ }
+
+ /**
+ * Signals to the Dialer app to start displaying a diagnostic message.
+ * @param messageId a unique ID for the message to display.
+ * @param message the message to display.
+ */
+ public void displayDiagnosticMessage(int messageId, @NonNull CharSequence message) {
+ Bundle extras = new Bundle();
+ extras.putInt(android.telecom.Call.EXTRA_DIAGNOSTIC_MESSAGE_ID, messageId);
+ extras.putCharSequence(android.telecom.Call.EXTRA_DIAGNOSTIC_MESSAGE, message);
+ // Send to the dialer.
+ onConnectionEvent(android.telecom.Call.EVENT_DISPLAY_DIAGNOSTIC_MESSAGE, extras);
+ }
+
+ /**
+ * Signals to the Dialer app to stop displaying a diagnostic message.
+ * @param messageId a unique ID for the message to clear.
+ */
+ public void clearDiagnosticMessage(int messageId) {
+ Bundle extras = new Bundle();
+ extras.putInt(android.telecom.Call.EXTRA_DIAGNOSTIC_MESSAGE_ID, messageId);
+ // Send to the dialer.
+ onConnectionEvent(android.telecom.Call.EVENT_CLEAR_DIAGNOSTIC_MESSAGE, extras);
+ }
+
+ /**
* Remaps the call direction as indicated by an {@link android.telecom.Call.Details} direction
* constant to the constants (e.g. {@link #CALL_DIRECTION_INCOMING}) used in this call class.
* @param direction The android.telecom.Call direction.
@@ -3945,4 +4071,26 @@
public void setCallScreeningComponentName(String callScreeningComponentName) {
mCallScreeningComponentName = callScreeningComponentName;
}
+
+ public void maybeOnInCallServiceTrackingChanged(boolean isTracking, boolean hasUi) {
+ if (mConnectionService == null) {
+ Log.w(this, "maybeOnInCallServiceTrackingChanged() request on a call"
+ + " without a connection service.");
+ } else {
+ if (hasUi) {
+ mConnectionService.onUsingAlternativeUi(this, isTracking);
+ } else if (isTracking) {
+ mConnectionService.onTrackedByNonUiService(this, isTracking);
+ }
+ }
+ }
+
+ /**
+ * @return {@code true} when this call originated from a SIM-based {@link PhoneAccount}.
+ * A sim-based {@link PhoneAccount} is one with {@link PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION}
+ * set.
+ */
+ public boolean isSimCall() {
+ return mIsSimCall;
+ }
}
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index a6509b4..6a7261e 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -264,6 +264,14 @@
}
}
+ public void playRttUpgradeTone(Call call) {
+ if (call != mForegroundCall) {
+ // We only play tones for foreground calls.
+ return;
+ }
+ mPlayerFactory.createPlayer(InCallTonePlayer.TONE_RTT_REQUEST).startTone();
+ }
+
/**
* Play or stop a call hold tone for a call. Triggered via
* {@link Connection#sendConnectionEvent(String)} when the
diff --git a/src/com/android/server/telecom/CallAudioRouteStateMachine.java b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
index 69a870f..7bf94ed 100644
--- a/src/com/android/server/telecom/CallAudioRouteStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
@@ -493,6 +493,8 @@
case SWITCH_FOCUS:
if (msg.arg1 == ACTIVE_FOCUS || msg.arg1 == RINGING_FOCUS) {
transitionTo(mActiveEarpieceRoute);
+ } else {
+ mCallAudioManager.notifyAudioOperationsComplete();
}
return HANDLED;
default:
@@ -695,6 +697,8 @@
case SWITCH_FOCUS:
if (msg.arg1 == ACTIVE_FOCUS || msg.arg1 == RINGING_FOCUS) {
transitionTo(mActiveHeadsetRoute);
+ } else {
+ mCallAudioManager.notifyAudioOperationsComplete();
}
return HANDLED;
default:
@@ -1051,6 +1055,8 @@
} else {
transitionTo(mRingingBluetoothRoute);
}
+ } else {
+ mCallAudioManager.notifyAudioOperationsComplete();
}
return HANDLED;
case BT_AUDIO_DISCONNECTED:
@@ -1272,7 +1278,10 @@
return HANDLED;
case SWITCH_FOCUS:
if (msg.arg1 == ACTIVE_FOCUS || msg.arg1 == RINGING_FOCUS) {
+ setSpeakerphoneOn(true);
transitionTo(mActiveSpeakerRoute);
+ } else {
+ mCallAudioManager.notifyAudioOperationsComplete();
}
return HANDLED;
default:
diff --git a/src/com/android/server/telecom/CallDiagnosticServiceAdapter.java b/src/com/android/server/telecom/CallDiagnosticServiceAdapter.java
new file mode 100644
index 0000000..79a94d3
--- /dev/null
+++ b/src/com/android/server/telecom/CallDiagnosticServiceAdapter.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.telecom;
+
+import android.annotation.NonNull;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.telecom.CallDiagnosticService;
+import android.telecom.DiagnosticCall;
+import android.telecom.Log;
+
+import com.android.internal.telecom.ICallDiagnosticServiceAdapter;
+import com.android.internal.telecom.IInCallAdapter;
+
+/**
+ * Adapter class used to provide a path for messages FROM a {@link CallDiagnosticService} back to
+ * the telecom stack.
+ */
+public class CallDiagnosticServiceAdapter extends ICallDiagnosticServiceAdapter.Stub {
+ public interface TelecomAdapter {
+ void displayDiagnosticMessage(String callId, int messageId, CharSequence message);
+ void clearDiagnosticMessage(String callId, int messageId);
+ void sendDeviceToDeviceMessage(String callId, @DiagnosticCall.MessageType int message,
+ int value);
+ void overrideDisconnectMessage(String callId, CharSequence message);
+ }
+
+ private final TelecomAdapter mTelecomAdapter;
+ private final String mOwnerPackageName;
+ private final String mOwnerPackageAbbreviation;
+ private final TelecomSystem.SyncRoot mLock;
+
+ CallDiagnosticServiceAdapter(@NonNull TelecomAdapter telecomAdapter,
+ @NonNull String ownerPackageName, @NonNull TelecomSystem.SyncRoot lock) {
+ mTelecomAdapter = telecomAdapter;
+ mOwnerPackageName = ownerPackageName;
+ mOwnerPackageAbbreviation = Log.getPackageAbbreviation(ownerPackageName);
+ mLock = lock;
+ }
+
+ @Override
+ public void displayDiagnosticMessage(String callId, int messageId, CharSequence message)
+ throws RemoteException {
+ try {
+ Log.startSession("CDSA.dDM", mOwnerPackageAbbreviation);
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ Log.i(this, "displayDiagnosticMessage; callId=%s, msg=%d/%s", callId, messageId,
+ message);
+ mTelecomAdapter.displayDiagnosticMessage(callId, messageId, message);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void clearDiagnosticMessage(String callId, int messageId) throws RemoteException {
+ try {
+ Log.startSession("CDSA.cDM", mOwnerPackageAbbreviation);
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ Log.i(this, "clearDiagnosticMessage; callId=%s, msg=%d", callId, messageId);
+ mTelecomAdapter.clearDiagnosticMessage(callId, messageId);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void sendDeviceToDeviceMessage(String callId, @DiagnosticCall.MessageType int message,
+ int value)
+ throws RemoteException {
+ try {
+ Log.startSession("CDSA.sDTDM", mOwnerPackageAbbreviation);
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ Log.i(this, "sendDeviceToDeviceMessage; callId=%s, msg=%d/%d", callId, message,
+ value);
+ mTelecomAdapter.sendDeviceToDeviceMessage(callId, message, value);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void overrideDisconnectMessage(String callId, CharSequence message)
+ throws RemoteException {
+ try {
+ Log.startSession("CDSA.oDM", mOwnerPackageAbbreviation);
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ Log.i(this, "overrideDisconnectMessage; callId=%s, msg=%s", callId, message);
+ mTelecomAdapter.overrideDisconnectMessage(callId, message);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
+}
diff --git a/src/com/android/server/telecom/CallDiagnosticServiceController.java b/src/com/android/server/telecom/CallDiagnosticServiceController.java
new file mode 100644
index 0000000..943a176
--- /dev/null
+++ b/src/com/android/server/telecom/CallDiagnosticServiceController.java
@@ -0,0 +1,654 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.telecom;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.UserIdInt;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.telecom.BluetoothCallQualityReport;
+import android.telecom.CallAudioState;
+import android.telecom.CallDiagnosticService;
+import android.telecom.ConnectionService;
+import android.telecom.DiagnosticCall;
+import android.telecom.InCallService;
+import android.telecom.Log;
+import android.telecom.ParcelableCall;
+import android.telephony.ims.ImsReasonInfo;
+import android.text.TextUtils;
+
+import com.android.internal.telecom.ICallDiagnosticService;
+import com.android.internal.util.IndentingPrintWriter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Responsible for maintaining binding to the {@link CallDiagnosticService} defined by the
+ * {@code call_diagnostic_service_package_name} key in the
+ * {@code packages/services/Telecomm/res/values/config.xml} file.
+ */
+public class CallDiagnosticServiceController extends CallsManagerListenerBase {
+ /**
+ * Context dependencies for the {@link CallDiagnosticServiceController}.
+ */
+ public interface ContextProxy {
+ List<ResolveInfo> queryIntentServicesAsUser(@NonNull Intent intent,
+ @PackageManager.ResolveInfoFlags int flags, @UserIdInt int userId);
+ boolean bindServiceAsUser(@NonNull @RequiresPermission Intent service,
+ @NonNull ServiceConnection conn, int flags, @NonNull UserHandle user);
+ void unbindService(@NonNull ServiceConnection conn);
+ UserHandle getCurrentUserHandle();
+ }
+
+ /**
+ * Listener for {@link Call} events; used to propagate these changes to the
+ * {@link CallDiagnosticService}.
+ */
+ private final Call.Listener mCallListener = new Call.ListenerBase() {
+ @Override
+ public void onConnectionCapabilitiesChanged(Call call) {
+ updateCall(call);
+ }
+
+ @Override
+ public void onConnectionPropertiesChanged(Call call, boolean didRttChange) {
+ updateCall(call);
+ }
+
+ /**
+ * Listens for changes to extras reported by a Telecom {@link Call}.
+ *
+ * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService}
+ * so we will only trigger an update of the call information if the source of the extras
+ * change was a {@link ConnectionService}.
+ *
+ * @param call The call.
+ * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or
+ * {@link Call#SOURCE_INCALL_SERVICE}).
+ * @param extras The extras.
+ */
+ @Override
+ public void onExtrasChanged(Call call, int source, Bundle extras) {
+ // Do not inform InCallServices of changes which originated there.
+ if (source == Call.SOURCE_INCALL_SERVICE) {
+ return;
+ }
+ updateCall(call);
+ }
+
+ /**
+ * Listens for changes to extras reported by a Telecom {@link Call}.
+ *
+ * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService}
+ * so we will only trigger an update of the call information if the source of the extras
+ * change was a {@link ConnectionService}.
+ * @param call The call.
+ * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or
+ * {@link Call#SOURCE_INCALL_SERVICE}).
+ * @param keys The extra key removed
+ */
+ @Override
+ public void onExtrasRemoved(Call call, int source, List<String> keys) {
+ // Do not inform InCallServices of changes which originated there.
+ if (source == Call.SOURCE_INCALL_SERVICE) {
+ return;
+ }
+ updateCall(call);
+ }
+
+ /**
+ * Handles changes to the video state of a call.
+ * @param call
+ * @param previousVideoState
+ * @param newVideoState
+ */
+ @Override
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {
+ updateCall(call);
+ }
+
+ /**
+ * Relays a bluetooth call quality report received from the Bluetooth stack to the
+ * CallDiagnosticService.
+ * @param call The call.
+ * @param report The received report.
+ */
+ @Override
+ public void onBluetoothCallQualityReport(Call call, BluetoothCallQualityReport report) {
+ handleBluetoothCallQualityReport(call, report);
+ }
+
+ /**
+ * Relays a device to device message received from Telephony to the CallDiagnosticService.
+ * @param call
+ * @param messageType
+ * @param messageValue
+ */
+ @Override
+ public void onReceivedDeviceToDeviceMessage(Call call, int messageType, int messageValue) {
+ handleReceivedDeviceToDeviceMessage(call, messageType, messageValue);
+ }
+ };
+
+ /**
+ * {@link ServiceConnection} handling changes to binding of the {@link CallDiagnosticService}.
+ */
+ private class CallDiagnosticServiceConnection implements ServiceConnection {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.startSession("CDSC.oSC", Log.getPackageAbbreviation(name));
+ try {
+ synchronized (mLock) {
+ mCallDiagnosticService = ICallDiagnosticService.Stub.asInterface(service);
+
+ handleConnectionComplete(mCallDiagnosticService);
+ }
+ Log.i(CallDiagnosticServiceController.this, "onServiceConnected: cmp=%s", name);
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.startSession("CDSC.oSD", Log.getPackageAbbreviation(name));
+ try {
+ synchronized (mLock) {
+ mCallDiagnosticService = null;
+ mConnection = null;
+ }
+ Log.i(CallDiagnosticServiceController.this, "onServiceDisconnected: cmp=%s", name);
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void onBindingDied(ComponentName name) {
+ Log.startSession("CDSC.oBD", Log.getPackageAbbreviation(name));
+ try {
+ synchronized (mLock) {
+ mCallDiagnosticService = null;
+ mConnection = null;
+ }
+ Log.w(CallDiagnosticServiceController.this, "onBindingDied: cmp=%s", name);
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
+ public void onNullBinding(ComponentName name) {
+ Log.startSession("CDSC.oNB", Log.getPackageAbbreviation(name));
+ try {
+ synchronized (mLock) {
+ maybeUnbindCallScreeningService();
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
+ }
+
+ private final String mPackageName;
+ private final ContextProxy mContextProxy;
+ private String mTestPackageName;
+ private CallDiagnosticServiceConnection mConnection;
+ private CallDiagnosticServiceAdapter mAdapter;
+ private final TelecomSystem.SyncRoot mLock;
+ private ICallDiagnosticService mCallDiagnosticService;
+ private final CallIdMapper mCallIdMapper = new CallIdMapper(Call::getId);
+
+ public CallDiagnosticServiceController(@NonNull ContextProxy contextProxy,
+ @Nullable String packageName, @NonNull TelecomSystem.SyncRoot lock) {
+ mContextProxy = contextProxy;
+ mPackageName = packageName;
+ mLock = lock;
+ }
+
+ /**
+ * Handles Telecom adding new calls. Will bind to the call diagnostic service if needed and
+ * send the calls, or send to an already bound service.
+ * @param call The call to add.
+ */
+ @Override
+ public void onCallAdded(@NonNull Call call) {
+ if (!call.isSimCall() || call.isExternalCall()) {
+ Log.i(this, "onCallAdded: skipping call %s as non-sim or external.", call.getId());
+ return;
+ }
+ if (mCallIdMapper.getCallId(call) == null) {
+ mCallIdMapper.addCall(call);
+ call.addListener(mCallListener);
+ }
+ if (isConnected()) {
+ sendCallToBoundService(call, mCallDiagnosticService);
+ } else {
+ maybeBindCallDiagnosticService();
+ }
+ }
+
+ /**
+ * Handles Telecom removal of calls; will remove the call from the bound service and if the
+ * number of tracked calls falls to zero, unbind from the service.
+ * @param call The call to remove from the bound CDS.
+ */
+ @Override
+ public void onCallRemoved(@NonNull Call call) {
+ if (!call.isSimCall() || call.isExternalCall()) {
+ Log.i(this, "onCallRemoved: skipping call %s as non-sim or external.", call.getId());
+ return;
+ }
+ mCallIdMapper.removeCall(call);
+ call.removeListener(mCallListener);
+ removeCallFromBoundService(call, mCallDiagnosticService);
+
+ if (mCallIdMapper.getCalls().size() == 0) {
+ maybeUnbindCallScreeningService();
+ }
+ }
+
+ @Override
+ public void onCallStateChanged(Call call, int oldState, int newState) {
+ updateCall(call);
+ }
+
+ @Override
+ public void onCallAudioStateChanged(CallAudioState oldCallAudioState,
+ CallAudioState newCallAudioState) {
+ if (mCallDiagnosticService != null) {
+ try {
+ mCallDiagnosticService.updateCallAudioState(newCallAudioState);
+ } catch (RemoteException e) {
+ Log.w(this, "onCallAudioStateChanged: failed %s", e);
+ }
+ }
+ }
+
+ /**
+ * Sets the test call diagnostic service; used by the telecom command line command to override
+ * the {@link CallDiagnosticService} to bind to for CTS test purposes.
+ * @param packageName The package name to set to.
+ */
+ public void setTestCallDiagnosticService(@Nullable String packageName) {
+ if (TextUtils.isEmpty(packageName)) {
+ mTestPackageName = null;
+ } else {
+ mTestPackageName = packageName;
+ }
+
+ Log.i(this, "setTestCallDiagnosticService: packageName=%s", packageName);
+ }
+
+ /**
+ * Determines the active call diagnostic service, taking into account the test override.
+ * @return The package name of the active call diagnostic service.
+ */
+ private @Nullable String getActiveCallDiagnosticService() {
+ if (mTestPackageName != null) {
+ return mTestPackageName;
+ }
+
+ return mPackageName;
+ }
+
+ /**
+ * If we are not already bound to the {@link CallDiagnosticService}, attempts to initiate a
+ * binding tho that service.
+ * @return {@code true} if we bound, {@code false} otherwise.
+ */
+ private boolean maybeBindCallDiagnosticService() {
+ if (mConnection != null) {
+ return false;
+ }
+
+ mConnection = new CallDiagnosticServiceConnection();
+ boolean bound = bindCallDiagnosticService(mContextProxy.getCurrentUserHandle(),
+ getActiveCallDiagnosticService(), mConnection);
+ if (!bound) {
+ mConnection = null;
+ }
+ return bound;
+ }
+
+ /**
+ * Performs binding to the {@link CallDiagnosticService}.
+ * @param userHandle user name to bind via.
+ * @param packageName package name of the CDS.
+ * @param serviceConnection The service connection to be notified of bind events.
+ * @return
+ */
+ private boolean bindCallDiagnosticService(UserHandle userHandle,
+ String packageName, CallDiagnosticServiceConnection serviceConnection) {
+
+ if (TextUtils.isEmpty(packageName)) {
+ Log.i(this, "bindCallDiagnosticService: no package; skip binding.");
+ return false;
+ }
+
+ Intent intent = new Intent(CallDiagnosticService.SERVICE_INTERFACE)
+ .setPackage(packageName);
+ Log.i(this, "bindCallDiagnosticService: user %d.", userHandle.getIdentifier());
+ List<ResolveInfo> entries = mContextProxy.queryIntentServicesAsUser(intent, 0,
+ userHandle.getIdentifier());
+ if (entries.isEmpty()) {
+ Log.i(this, "bindCallDiagnosticService: %s has no service.", packageName);
+ return false;
+ }
+
+ ResolveInfo entry = entries.get(0);
+ if (entry.serviceInfo == null) {
+ Log.i(this, "bindCallDiagnosticService: %s has no service info.", packageName);
+ return false;
+ }
+
+ if (entry.serviceInfo.permission == null || !entry.serviceInfo.permission.equals(
+ Manifest.permission.BIND_CALL_DIAGNOSTIC_SERVICE)) {
+ Log.i(this, "bindCallDiagnosticService: %s doesn't require "
+ + "BIND_CALL_DIAGNOSTIC_SERVICE.", packageName);
+ return false;
+ }
+
+ ComponentName componentName =
+ new ComponentName(entry.serviceInfo.packageName, entry.serviceInfo.name);
+ intent.setComponent(componentName);
+ if (mContextProxy.bindServiceAsUser(
+ intent,
+ serviceConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ UserHandle.CURRENT)) {
+ Log.d(this, "bindCallDiagnosticService, found service, waiting for it to connect");
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * If we are bound to a {@link CallDiagnosticService}, unbind from it.
+ */
+ public void maybeUnbindCallScreeningService() {
+ if (mConnection != null) {
+ Log.i(this, "maybeUnbindCallScreeningService - unbinding from %s",
+ getActiveCallDiagnosticService());
+ try {
+ mContextProxy.unbindService(mConnection);
+ mCallDiagnosticService = null;
+ mConnection = null;
+ } catch (IllegalArgumentException e) {
+ Log.i(this, "maybeUnbindCallScreeningService: Exception when unbind %s : %s",
+ getActiveCallDiagnosticService(), e.getMessage());
+ }
+ } else {
+ Log.w(this, "maybeUnbindCallScreeningService - already unbound");
+ }
+ }
+
+ /**
+ * Implements the abstracted Telecom functionality the {@link CallDiagnosticServiceAdapter}
+ * depends on.
+ */
+ private CallDiagnosticServiceAdapter.TelecomAdapter mTelecomAdapter =
+ new CallDiagnosticServiceAdapter.TelecomAdapter() {
+
+ @Override
+ public void displayDiagnosticMessage(String callId, int messageId, CharSequence message) {
+ handleDisplayDiagnosticMessage(callId, messageId, message);
+ }
+
+ @Override
+ public void clearDiagnosticMessage(String callId, int messageId) {
+ handleClearDiagnosticMessage(callId, messageId);
+ }
+
+ @Override
+ public void sendDeviceToDeviceMessage(String callId,
+ @DiagnosticCall.MessageType int message, int value) {
+ handleSendD2DMessage(callId, message, value);
+ }
+
+ @Override
+ public void overrideDisconnectMessage(String callId, CharSequence message) {
+ handleOverrideDisconnectMessage(callId, message);
+ }
+ };
+
+ /**
+ * Sends all calls to the specified {@link CallDiagnosticService}.
+ * @param callDiagnosticService the CDS to send calls to.
+ */
+ private void handleConnectionComplete(@NonNull ICallDiagnosticService callDiagnosticService) {
+ mAdapter = new CallDiagnosticServiceAdapter(mTelecomAdapter,
+ getActiveCallDiagnosticService(), mLock);
+ try {
+ // Add adapter for communication back from the call diagnostic service to Telecom.
+ callDiagnosticService.setAdapter(mAdapter);
+
+ // Loop through all the calls we've got ready to send since binding.
+ for (Call call : mCallIdMapper.getCalls()) {
+ sendCallToBoundService(call, callDiagnosticService);
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "handleConnectionComplete: error=%s", e);
+ }
+ }
+
+ /**
+ * Handles a request from a {@link CallDiagnosticService} to display a diagnostic message.
+ * @param callId the ID of the call to display the message for.
+ * @param message the message.
+ */
+ private void handleDisplayDiagnosticMessage(@NonNull String callId, int messageId,
+ @Nullable CharSequence message) {
+ Call call = mCallIdMapper.getCall(callId);
+ if (call == null) {
+ Log.w(this, "handleDisplayDiagnosticMessage: callId=%s; msg=%d/%s; invalid call",
+ callId, messageId, message);
+ return;
+ }
+ Log.i(this, "handleDisplayDiagnosticMessage: callId=%s; msg=%d/%s; invalid call",
+ callId, messageId, message);
+ call.displayDiagnosticMessage(messageId, message);
+ }
+
+ /**
+ * Handles a request from a {@link CallDiagnosticService} to clear a previously displayed
+ * diagnostic message.
+ * @param callId the ID of the call to display the message for.
+ * @param messageId the message ID which was previous posted.
+ */
+ private void handleClearDiagnosticMessage(@NonNull String callId, int messageId) {
+ Call call = mCallIdMapper.getCall(callId);
+ if (call == null) {
+ Log.w(this, "handleClearDiagnosticMessage: callId=%s; msg=%d; invalid call",
+ callId, messageId);
+ return;
+ }
+ Log.i(this, "handleClearDiagnosticMessage: callId=%s; msg=%d; invalid call",
+ callId, messageId);
+ call.clearDiagnosticMessage(messageId);
+ }
+
+ /**
+ * Handles a request from a {@link CallDiagnosticService} to send a device to device message.
+ * @param callId The ID of the call to send the D2D message for.
+ * @param message The message type.
+ * @param value The message value.
+ */
+ private void handleSendD2DMessage(@NonNull String callId,
+ @DiagnosticCall.MessageType int message, int value) {
+ Call call = mCallIdMapper.getCall(callId);
+ if (call == null) {
+ Log.w(this, "handleSendD2DMessage: callId=%s; msg=%d/%d; invalid call", callId,
+ message, value);
+ return;
+ }
+ Log.i(this, "handleSendD2DMessage: callId=%s; msg=%d/%d", callId, message, value);
+ call.sendDeviceToDeviceMessage(message, value);
+ }
+
+ /**
+ * Handles a request from a {@link CallDiagnosticService} to override the disconnect message
+ * for a call. This is the response path from a previous call into the
+ * {@link CallDiagnosticService} via {@link DiagnosticCall#onCallDisconnected(ImsReasonInfo)}.
+ * @param callId The telecom call ID the disconnect override is pending for.
+ * @param message The new disconnect message, or {@code null} if no override.
+ */
+ private void handleOverrideDisconnectMessage(@NonNull String callId,
+ @Nullable CharSequence message) {
+ Call call = mCallIdMapper.getCall(callId);
+ if (call == null) {
+ Log.w(this, "handleOverrideDisconnectMessage: callId=%s; msg=%s; invalid call", callId,
+ message);
+ return;
+ }
+ Log.i(this, "handleOverrideDisconnectMessage: callId=%s; msg=%s", callId, message);
+ call.handleOverrideDisconnectMessage(message);
+ }
+
+ /**
+ * Sends a single call to the bound {@link CallDiagnosticService}.
+ * @param call The call to send.
+ * @param callDiagnosticService The CDS to send it to.
+ */
+ private void sendCallToBoundService(@NonNull Call call,
+ @NonNull ICallDiagnosticService callDiagnosticService) {
+ try {
+ if (isConnected()) {
+ Log.w(this, "sendCallToBoundService: initializing %s", call.getId());
+ callDiagnosticService.initializeDiagnosticCall(getParceledCall(call));
+ } else {
+ Log.w(this, "sendCallToBoundService: not bound, skipping %s", call.getId());
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "sendCallToBoundService: callId=%s, exception=%s", call.getId(), e);
+ }
+ }
+
+ /**
+ * Removes a call from a bound {@link CallDiagnosticService}.
+ * @param call The call to remove.
+ * @param callDiagnosticService The CDS to remove it from.
+ */
+ private void removeCallFromBoundService(@NonNull Call call,
+ @NonNull ICallDiagnosticService callDiagnosticService) {
+ try {
+ if (isConnected()) {
+ callDiagnosticService.removeDiagnosticCall(call.getId());
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "removeCallFromBoundService: callId=%s, exception=%s", call.getId(), e);
+ }
+ }
+
+ /**
+ * @return {@code true} if the call diagnostic service is bound/connected.
+ */
+ private boolean isConnected() {
+ return mCallDiagnosticService != null;
+ }
+
+ /**
+ * Updates the Call diagnostic service with changes to a call.
+ * @param call The updated call.
+ */
+ private void updateCall(@NonNull Call call) {
+ try {
+ if (isConnected()) {
+ mCallDiagnosticService.updateCall(getParceledCall(call));
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "updateCall: callId=%s, exception=%s", call.getId(), e);
+ }
+ }
+
+ /**
+ * Updates the call diagnostic service with a received bluetooth quality report.
+ * @param call The call.
+ * @param report The bluetooth call quality report.
+ */
+ private void handleBluetoothCallQualityReport(@NonNull Call call,
+ @NonNull BluetoothCallQualityReport report) {
+ try {
+ if (isConnected()) {
+ mCallDiagnosticService.receiveBluetoothCallQualityReport(report);
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "handleBluetoothCallQualityReport: callId=%s, exception=%s", call.getId(),
+ e);
+ }
+ }
+
+ /**
+ * Informs a CallDiagnosticService of an incoming device to device message which was received
+ * via the carrier network.
+ * @param call the call the message was received via.
+ * @param messageType The message type.
+ * @param messageValue The message value.
+ */
+ private void handleReceivedDeviceToDeviceMessage(@NonNull Call call, int messageType,
+ int messageValue) {
+ try {
+ if (isConnected()) {
+ mCallDiagnosticService.receiveDeviceToDeviceMessage(call.getId(), messageType,
+ messageValue);
+ }
+ } catch (RemoteException e) {
+ Log.w(this, "handleReceivedDeviceToDeviceMessage: callId=%s, exception=%s",
+ call.getId(), e);
+ }
+ }
+
+ /**
+ * Get a parcelled representation of a call for transport to the service.
+ * @param call The call.
+ * @return The parcelled call.
+ */
+ private @NonNull ParcelableCall getParceledCall(@NonNull Call call) {
+ return ParcelableCallUtils.toParcelableCall(
+ call,
+ false /* includeVideoProvider */,
+ null /* phoneAcctRegistrar */,
+ false /* supportsExternalCalls */,
+ false /* includeRttCall */,
+ false /* isForSystemDialer */
+ );
+ }
+
+ /**
+ * Dumps the state of the {@link CallDiagnosticServiceController}.
+ *
+ * @param pw The {@code IndentingPrintWriter} to write the state to.
+ */
+ public void dump(IndentingPrintWriter pw) {
+ pw.print("activeCallDiagnosticService: ");
+ pw.println(getActiveCallDiagnosticService());
+ pw.print("isConnected: ");
+ pw.println(isConnected());
+ }
+}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 1e963c4..898b6a8 100755
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -332,6 +332,7 @@
private final ConnectionServiceRepository mConnectionServiceRepository;
private final DtmfLocalTonePlayer mDtmfLocalTonePlayer;
private final InCallController mInCallController;
+ private final CallDiagnosticServiceController mCallDiagnosticServiceController;
private final CallAudioManager mCallAudioManager;
private final CallRecordingTonePlayer mCallRecordingTonePlayer;
private RespondViaSmsManager mRespondViaSmsManager;
@@ -487,6 +488,7 @@
CallAudioRouteStateMachine.Factory callAudioRouteStateMachineFactory,
CallAudioModeStateMachine.Factory callAudioModeStateMachineFactory,
InCallControllerFactory inCallControllerFactory,
+ CallDiagnosticServiceController callDiagnosticServiceController,
RoleManagerAdapter roleManagerAdapter,
ToastFactory toastFactory) {
mContext = context;
@@ -543,6 +545,7 @@
mInCallController = inCallControllerFactory.create(context, mLock, this,
systemStateHelper, defaultDialerCache, mTimeoutsAdapter,
emergencyCallHelper);
+ mCallDiagnosticServiceController = callDiagnosticServiceController;
mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
ringtoneFactory, systemVibrator,
new Ringer.VibrationEffectProxy(), mInCallController);
@@ -572,6 +575,7 @@
mListeners.add(mCallLogManager);
mListeners.add(mPhoneStateBroadcaster);
mListeners.add(mInCallController);
+ mListeners.add(mCallDiagnosticServiceController);
mListeners.add(mCallAudioManager);
mListeners.add(mCallRecordingTonePlayer);
mListeners.add(missedCallNotifier);
@@ -622,6 +626,10 @@
return mRoleManagerAdapter;
}
+ public CallDiagnosticServiceController getCallDiagnosticServiceController() {
+ return mCallDiagnosticServiceController;
+ }
+
@Override
public void onSuccessfulOutgoingCall(Call call, int callState) {
Log.v(this, "onSuccessfulOutgoingCall, %s", call);
@@ -1237,10 +1245,14 @@
PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccountUnchecked(
phoneAccountHandle);
if (phoneAccount != null) {
+ Bundle phoneAccountExtras = phoneAccount.getExtras();
call.setIsSelfManaged(phoneAccount.isSelfManaged());
if (call.isSelfManaged()) {
// Self managed calls will always be voip audio mode.
call.setIsVoipAudioMode(true);
+ call.setVisibleToInCallService(phoneAccountExtras != null
+ && phoneAccountExtras.getBoolean(
+ PhoneAccount.EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE, true));
} else {
// Incoming call is managed, the active call is self-managed and can't be held.
// We need to set extras on it to indicate whether answering will cause a
@@ -1259,7 +1271,6 @@
}
}
- Bundle phoneAccountExtras = phoneAccount.getExtras();
if (phoneAccountExtras != null
&& phoneAccountExtras.getBoolean(
PhoneAccount.EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE)) {
@@ -1474,8 +1485,19 @@
PhoneAccount account =
mPhoneAccountRegistrar.getPhoneAccount(requestedAccountHandle, initiatingUser);
+ Bundle phoneAccountExtra = account != null ? account.getExtras() : null;
boolean isSelfManaged = account != null && account.isSelfManaged();
+ StringBuffer creationLogs = new StringBuffer();
+ creationLogs.append("requestedAcct:");
+ if (requestedAccountHandle == null) {
+ creationLogs.append("none");
+ } else {
+ creationLogs.append(requestedAccountHandle);
+ }
+ creationLogs.append(", selfMgd:");
+ creationLogs.append(isSelfManaged);
+
// Create a call with original handle. The handle may be changed when the call is attached
// to a connection service, but in most cases will remain the same.
if (call == null) {
@@ -1494,7 +1516,7 @@
isConference, /* isConference */
mClockProxy,
mToastFactory);
- call.initAnalytics(callingPackage);
+ call.initAnalytics(callingPackage, creationLogs.toString());
// Ensure new calls related to self-managed calls/connections are set as such. This
// will be overridden when the actual connection is returned in startCreateConnection,
@@ -1504,6 +1526,9 @@
if (isSelfManaged) {
// Self-managed calls will ALWAYS use voip audio mode.
call.setIsVoipAudioMode(true);
+ call.setVisibleToInCallService(phoneAccountExtra != null
+ && phoneAccountExtra.getBoolean(
+ PhoneAccount.EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE, true));
}
call.setInitiatingUser(initiatingUser);
isReusedCall = false;
@@ -1563,7 +1588,8 @@
// retrieved.
CompletableFuture<List<PhoneAccountHandle>> setAccountHandle =
accountsForCall.whenCompleteAsync((potentialPhoneAccounts, exception) -> {
- Log.i(CallsManager.this, "set outgoing call phone acct stage");
+ Log.i(CallsManager.this, "set outgoing call phone acct; potentialAccts=%s",
+ potentialPhoneAccounts);
PhoneAccountHandle phoneAccountHandle;
if (potentialPhoneAccounts.size() == 1) {
phoneAccountHandle = potentialPhoneAccounts.get(0);
@@ -1964,6 +1990,8 @@
return userPreferredAccountForContact.thenApply(phoneAccountHandle -> {
if (phoneAccountHandle != null) {
+ Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; contactPrefAcct=%s",
+ phoneAccountHandle);
return Collections.singletonList(phoneAccountHandle);
}
// No preset account, check if default exists that supports the URI scheme for the
@@ -1973,6 +2001,8 @@
handle.getScheme(), initiatingUser);
if (defaultPhoneAccountHandle != null &&
possibleAccounts.contains(defaultPhoneAccountHandle)) {
+ Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; defaultAcctForScheme=%s",
+ defaultPhoneAccountHandle);
return Collections.singletonList(defaultPhoneAccountHandle);
}
return possibleAccounts;
@@ -2729,6 +2759,16 @@
updateCanAddCall();
}
+ @Override
+ public void onRemoteRttRequest(Call call, int requestId) {
+ Log.i(this, "onRemoteRttRequest: call %s", call.getId());
+ playRttUpgradeToneForCall(call);
+ }
+
+ public void playRttUpgradeToneForCall(Call call) {
+ mCallAudioManager.playRttUpgradeTone(call);
+ }
+
// Construct the list of possible PhoneAccounts that the outgoing call can use based on the
// active calls in CallsManager. If any of the active calls are on a SIM based PhoneAccount,
// then include only that SIM based PhoneAccount and any non-SIM PhoneAccounts, such as SIP.
@@ -3077,7 +3117,11 @@
Log.i(this, "Auto-unholding held foreground call (call doesn't support hold)");
foregroundCall.unhold();
}
- }, new LoggedHandlerExecutor(mHandler, "CM.mCAR", mLock));
+ }, new LoggedHandlerExecutor(mHandler, "CM.mCAR", mLock))
+ .exceptionally((throwable) -> {
+ Log.e(TAG, throwable, "Error while executing call removal");
+ return null;
+ });
}
/**
@@ -3624,22 +3668,8 @@
Trace.beginSection("onCallStateChanged");
maybeHandleHandover(call, newState);
+ notifyCallStateChanged(call, oldState, newState);
- // Only broadcast state change for calls that are being tracked.
- if (mCalls.contains(call)) {
- updateCanAddCall();
- updateHasActiveRttCall();
- for (CallsManagerListener listener : mListeners) {
- if (LogUtils.SYSTRACE_DEBUG) {
- Trace.beginSection(listener.getClass().toString() +
- " onCallStateChanged");
- }
- listener.onCallStateChanged(call, oldState, newState);
- if (LogUtils.SYSTRACE_DEBUG) {
- Trace.endSection();
- }
- }
- }
Trace.endSection();
} else {
Log.i(this, "failed in setting the state to new state");
@@ -3647,6 +3677,24 @@
}
}
+ private void notifyCallStateChanged(Call call, int oldState, int newState) {
+ // Only broadcast state change for calls that are being tracked.
+ if (mCalls.contains(call)) {
+ updateCanAddCall();
+ updateHasActiveRttCall();
+ for (CallsManagerListener listener : mListeners) {
+ if (LogUtils.SYSTRACE_DEBUG) {
+ Trace.beginSection(listener.getClass().toString() +
+ " onCallStateChanged");
+ }
+ listener.onCallStateChanged(call, oldState, newState);
+ if (LogUtils.SYSTRACE_DEBUG) {
+ Trace.endSection();
+ }
+ }
+ }
+ }
+
/**
* Identifies call state transitions for a call which trigger handover events.
* - If this call has a handover to it which just started and this call goes active, treat
@@ -4684,6 +4732,13 @@
pw.decreaseIndent();
}
+ if (mCallDiagnosticServiceController != null) {
+ pw.println("mCallDiagnosticServiceController:");
+ pw.increaseIndent();
+ mCallDiagnosticServiceController.dump(pw);
+ pw.decreaseIndent();
+ }
+
if (mDefaultDialerCache != null) {
pw.println("mDefaultDialerCache:");
pw.increaseIndent();
@@ -4740,6 +4795,9 @@
extras.putLong(TelecomManager.EXTRA_CALL_TELECOM_ROUTING_START_TIME_MILLIS,
SystemClock.elapsedRealtime());
+ if (call.visibleToInCallService()) {
+ extras.putBoolean(PhoneAccount.EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE, true);
+ }
call.setIntentExtras(extras);
}
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index 72c3f24..1fc9a3b 100755
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -1269,6 +1269,14 @@
@Override
public void onSuccess() {
String callId = mCallIdMapper.getCallId(call);
+ if (callId == null) {
+ Log.w(ConnectionServiceWrapper.this, "Call not present"
+ + " in call id mapper, maybe it was aborted before the bind"
+ + " completed successfully?");
+ response.handleCreateConnectionFailure(
+ new DisconnectCause(DisconnectCause.CANCELED));
+ return;
+ }
mPendingResponses.put(callId, response);
GatewayInfo gatewayInfo = call.getGatewayInfo();
@@ -1573,6 +1581,34 @@
}
}
+ /** @see IConnectionService#onUsingAlternativeUi(String, boolean, Session.Info) */
+ @VisibleForTesting
+ public void onUsingAlternativeUi(Call activeCall, boolean isUsingAlternativeUi) {
+ final String callId = mCallIdMapper.getCallId(activeCall);
+ if (callId != null && isServiceValid("onUsingAlternativeUi")) {
+ try {
+ logOutgoing("onUsingAlternativeUi %s", isUsingAlternativeUi);
+ mServiceInterface.onUsingAlternativeUi(callId, isUsingAlternativeUi,
+ Log.getExternalSession(TELECOM_ABBREVIATION));
+ } catch (RemoteException e) {
+ }
+ }
+ }
+
+ /** @see IConnectionService#onTrackedByNonUiService(String, boolean, Session.Info) */
+ @VisibleForTesting
+ public void onTrackedByNonUiService(Call activeCall, boolean isTracked) {
+ final String callId = mCallIdMapper.getCallId(activeCall);
+ if (callId != null && isServiceValid("onTrackedByNonUiService")) {
+ try {
+ logOutgoing("onTrackedByNonUiService %s", isTracked);
+ mServiceInterface.onTrackedByNonUiService(callId, isTracked,
+ Log.getExternalSession(TELECOM_ABBREVIATION));
+ } catch (RemoteException e) {
+ }
+ }
+ }
+
/** @see IConnectionService#disconnect(String, Session.Info) */
void disconnect(Call call) {
final String callId = mCallIdMapper.getCallId(call);
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 53ad45b..b138eae 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -113,7 +113,7 @@
public Call mCall;
}
- private class InCallServiceInfo {
+ public static class InCallServiceInfo {
private final ComponentName mComponentName;
private boolean mIsExternalCallsSupported;
private boolean mIsSelfManagedCallsSupported;
@@ -279,7 +279,8 @@
}
if (call != null && call.isSelfManaged() &&
- !mInCallServiceInfo.isSelfManagedCallsSupported()) {
+ (!mInCallServiceInfo.isSelfManagedCallsSupported()
+ || !call.visibleToInCallService())) {
Log.i(this, "Skipping binding to %s - doesn't support self-mgd calls",
mInCallServiceInfo);
mIsConnected = false;
@@ -342,6 +343,7 @@
mInCallServiceInfo.getType(),
mInCallServiceInfo.getDisconnectTime()
- mInCallServiceInfo.getBindingStartTime(), mIsNullBinding);
+ updateCallTracking(mCall, mInCallServiceInfo, false /* isAdd */);
}
InCallController.this.onDisconnected(mInCallServiceInfo);
@@ -748,6 +750,10 @@
newConnection.connect(callToConnectWith);
}
}
+
+ public List<InCallServiceBindingConnection> getSubConnections() {
+ return mSubConnections;
+ }
}
private final Call.Listener mCallListener = new Call.ListenerBase() {
@@ -915,12 +921,12 @@
@Override
public void onPackageUninstalled(String packageName) {
mCarModeTracker.forceExitCarMode(packageName);
- updateCarModeForSwitchingConnection();
+ updateCarModeForConnections();
}
};
private static final int IN_CALL_SERVICE_TYPE_INVALID = 0;
- private static final int IN_CALL_SERVICE_TYPE_DIALER_UI = 1;
+ private static final int IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI = 1;
private static final int IN_CALL_SERVICE_TYPE_SYSTEM_UI = 2;
private static final int IN_CALL_SERVICE_TYPE_CAR_MODE_UI = 3;
private static final int IN_CALL_SERVICE_TYPE_NON_UI = 4;
@@ -967,10 +973,9 @@
private boolean mIsCallUsingMicrophone = false;
public InCallController(Context context, TelecomSystem.SyncRoot lock, CallsManager callsManager,
- SystemStateHelper systemStateHelper,
- DefaultDialerCache defaultDialerCache, Timeouts.Adapter timeoutsAdapter,
- EmergencyCallHelper emergencyCallHelper, CarModeTracker carModeTracker,
- ClockProxy clockProxy) {
+ SystemStateHelper systemStateHelper, DefaultDialerCache defaultDialerCache,
+ Timeouts.Adapter timeoutsAdapter, EmergencyCallHelper emergencyCallHelper,
+ CarModeTracker carModeTracker, ClockProxy clockProxy) {
mContext = context;
mAppOpsManager = context.getSystemService(AppOpsManager.class);
mLock = lock;
@@ -1013,12 +1018,16 @@
continue;
}
- if (call.isSelfManaged() && !info.isSelfManagedCallsSupported()) {
+ if (call.isSelfManaged() && (!call.visibleToInCallService()
+ || !info.isSelfManagedCallsSupported())) {
continue;
}
// Only send the RTT call if it's a UI in-call service
- boolean includeRttCall = info.equals(mInCallServiceConnection.getInfo());
+ boolean includeRttCall = false;
+ if (mInCallServiceConnection != null) {
+ includeRttCall = info.equals(mInCallServiceConnection.getInfo());
+ }
componentsUpdated.add(info.getComponentName());
IInCallService inCallService = entry.getValue();
@@ -1030,6 +1039,7 @@
info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
try {
inCallService.addCall(sanitizeParcelableCallForService(info, parcelableCall));
+ updateCallTracking(call, info, true /* isAdd */);
} catch (RemoteException ignored) {
}
}
@@ -1079,7 +1089,8 @@
continue;
}
- if (call.isSelfManaged() && !info.isSelfManagedCallsSupported()) {
+ if (call.isSelfManaged() && !call.visibleToInCallService()
+ && !info.isSelfManagedCallsSupported()) {
continue;
}
@@ -1096,6 +1107,7 @@
info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
try {
inCallService.addCall(sanitizeParcelableCallForService(info, parcelableCall));
+ updateCallTracking(call, info, true /* isAdd */);
} catch (RemoteException ignored) {
}
}
@@ -1336,7 +1348,7 @@
/**
* Unbinds an existing bound connection to the in-call app.
*/
- private void unbindFromServices() {
+ public void unbindFromServices() {
try {
mContext.unregisterReceiver(mPackageChangedReceiver);
} catch (IllegalArgumentException e) {
@@ -1356,7 +1368,8 @@
/**
* Binds to all the UI-providing InCallService as well as system-implemented non-UI
- * InCallServices. Method-invoker must check {@link #isBoundAndConnectedToServices()} before invoking.
+ * InCallServices. Method-invoker must check {@link #isBoundAndConnectedToServices()}
+ * before invoking.
*
* @param call The newly added call that triggered the binding to the in-call services.
*/
@@ -1409,7 +1422,7 @@
}
}
- private void connectToNonUiInCallServices(Call call) {
+ private void updateNonUiInCallServices() {
List<InCallServiceInfo> nonUIInCallComponents =
getInCallServiceComponents(IN_CALL_SERVICE_TYPE_NON_UI);
List<InCallServiceBindingConnection> nonUIInCalls = new LinkedList<>();
@@ -1419,7 +1432,7 @@
List<String> callCompanionApps = mCallsManager
.getRoleManagerAdapter().getCallCompanionApps();
if (callCompanionApps != null && !callCompanionApps.isEmpty()) {
- for(String pkg : callCompanionApps) {
+ for (String pkg : callCompanionApps) {
InCallServiceInfo info = getInCallServiceComponent(pkg,
IN_CALL_SERVICE_TYPE_COMPANION);
if (info != null) {
@@ -1427,7 +1440,14 @@
}
}
}
- mNonUIInCallServiceConnections = new NonUIInCallServiceConnectionCollection(nonUIInCalls);
+ mNonUIInCallServiceConnections = new NonUIInCallServiceConnectionCollection(
+ nonUIInCalls);
+ }
+
+ private void connectToNonUiInCallServices(Call call) {
+ if (mNonUIInCallServiceConnections == null) {
+ updateNonUiInCallServices();
+ }
mNonUIInCallServiceConnections.connect(call);
IntentFilter packageChangedFilter = new IntentFilter(Intent.ACTION_PACKAGE_CHANGED);
@@ -1444,7 +1464,7 @@
InCallServiceInfo defaultDialerComponent =
(systemPackageName != null && systemPackageName.equals(packageName))
? getInCallServiceComponent(packageName, IN_CALL_SERVICE_TYPE_SYSTEM_UI)
- : getInCallServiceComponent(packageName, IN_CALL_SERVICE_TYPE_DIALER_UI);
+ : getInCallServiceComponent(packageName, IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI);
/* TODO: in Android 12 re-enable this an InCallService is required by the dialer role.
if (packageName != null && defaultDialerComponent == null) {
// The in call service of default phone app is disabled, send notification.
@@ -1494,7 +1514,6 @@
private List<InCallServiceInfo> getInCallServiceComponents(String packageName,
ComponentName componentName, int requestedType) {
-
List<InCallServiceInfo> retval = new LinkedList<>();
Intent serviceIntent = new Intent(InCallService.SERVICE_INTERFACE);
@@ -1526,13 +1545,19 @@
if (requestedType == IN_CALL_SERVICE_TYPE_NON_UI) {
mKnownNonUiInCallServices.add(foundComponentName);
}
- if (serviceInfo.enabled && (requestedType == 0 || requestedType == currentType)) {
- retval.add(new InCallServiceInfo(foundComponentName,
- isExternalCallsSupported, isSelfManageCallsSupported, requestedType));
+
+ boolean isRequestedType;
+ if (requestedType == IN_CALL_SERVICE_TYPE_INVALID) {
+ isRequestedType = true;
+ } else {
+ isRequestedType = requestedType == currentType;
+ }
+ if (serviceInfo.enabled && isRequestedType) {
+ retval.add(new InCallServiceInfo(foundComponentName, isExternalCallsSupported,
+ isSelfManageCallsSupported, requestedType));
}
}
}
-
return retval;
}
@@ -1598,7 +1623,7 @@
mDefaultDialerCache.getDefaultDialerApplication(
mCallsManager.getCurrentUserHandle().getIdentifier()));
if (isDefaultDialerPackage && isUIService) {
- return IN_CALL_SERVICE_TYPE_DIALER_UI;
+ return IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI;
}
// Also allow any in-call service that has the control-experience permission (to ensure
@@ -1637,7 +1662,7 @@
if (info.getType() == IN_CALL_SERVICE_TYPE_CAR_MODE_UI
|| info.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI
- || info.getType() == IN_CALL_SERVICE_TYPE_DIALER_UI) {
+ || info.getType() == IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI) {
trackCallingUserInterfaceStarted(info);
}
IInCallService inCallService = IInCallService.Stub.asInterface(service);
@@ -1663,13 +1688,17 @@
int numCallsSent = 0;
for (Call call : calls) {
try {
- if ((call.isSelfManaged() && !info.isSelfManagedCallsSupported()) ||
+ if ((call.isSelfManaged() && (!info.isSelfManagedCallsSupported()
+ || !call.visibleToInCallService())) ||
(call.isExternalCall() && !info.isExternalCallsSupported())) {
continue;
}
// Only send the RTT call if it's a UI in-call service
- boolean includeRttCall = info.equals(mInCallServiceConnection.getInfo());
+ boolean includeRttCall = false;
+ if (mInCallServiceConnection != null) {
+ includeRttCall = info.equals(mInCallServiceConnection.getInfo());
+ }
// Track the call if we don't already know about it.
addCall(call);
@@ -1683,6 +1712,7 @@
info.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI ||
info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
inCallService.addCall(sanitizeParcelableCallForService(info, parcelableCall));
+ updateCallTracking(call, info, true /* isAdd */);
} catch (RemoteException ignored) {
}
}
@@ -1709,7 +1739,7 @@
Log.i(this, "onDisconnected from %s", disconnectedInfo.getComponentName());
if (disconnectedInfo.getType() == IN_CALL_SERVICE_TYPE_CAR_MODE_UI
|| disconnectedInfo.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI
- || disconnectedInfo.getType() == IN_CALL_SERVICE_TYPE_DIALER_UI) {
+ || disconnectedInfo.getType() == IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI) {
trackCallingUserInterfaceStopped(disconnectedInfo);
}
mInCallServices.remove(disconnectedInfo);
@@ -1743,7 +1773,8 @@
continue;
}
- if (call.isSelfManaged() && !info.isSelfManagedCallsSupported()) {
+ if (call.isSelfManaged() && (!call.visibleToInCallService()
+ || !info.isSelfManagedCallsSupported())) {
continue;
}
@@ -1824,7 +1855,7 @@
*/
private ComponentName getConnectedUi() {
InCallServiceInfo connectedUi = mInCallServices.keySet().stream().filter(
- i -> i.getType() == IN_CALL_SERVICE_TYPE_DIALER_UI
+ i -> i.getType() == IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI
|| i.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI)
.findAny()
.orElse(null);
@@ -1942,13 +1973,13 @@
mCarModeTracker.handleExitCarMode(priority, packageName);
}
- updateCarModeForSwitchingConnection();
+ updateCarModeForConnections();
}
- public void updateCarModeForSwitchingConnection() {
+ public void updateCarModeForConnections() {
+ Log.i(this, "updateCarModeForConnections: car mode apps: %s",
+ mCarModeTracker.getCarModeApps().stream().collect(Collectors.joining(", ")));
if (mInCallServiceConnection != null) {
- Log.i(this, "updateCarModeForSwitchingConnection: car mode apps: %s",
- mCarModeTracker.getCarModeApps().stream().collect(Collectors.joining(", ")));
if (shouldUseCarModeUI()) {
mInCallServiceConnection.changeCarModeApp(
mCarModeTracker.getCurrentCarModePackage());
@@ -2058,4 +2089,11 @@
notificationManager.notify(NOTIFICATION_TAG, IN_CALL_SERVICE_NOTIFICATION_ID,
builder.build());
}
+
+ private void updateCallTracking(Call call, InCallServiceInfo info, boolean isAdd) {
+ int type = info.getType();
+ boolean hasUi = type == IN_CALL_SERVICE_TYPE_CAR_MODE_UI
+ || type == IN_CALL_SERVICE_TYPE_DEFAULT_DIALER_UI;
+ call.maybeOnInCallServiceTrackingChanged(isAdd, hasUi);
+ }
}
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 4f0cf8d..524d119 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -162,6 +162,8 @@
public static final int TONE_UNOBTAINABLE_NUMBER = 12;
public static final int TONE_VOICE_PRIVACY = 13;
public static final int TONE_VIDEO_UPGRADE = 14;
+ public static final int TONE_RTT_REQUEST = 15;
+ public static final int TONE_IN_CALL_QUALITY_NOTIFICATION = 16;
private static final int TONE_RESOURCE_ID_UNDEFINED = -1;
@@ -329,12 +331,22 @@
// TODO: fill in.
throw new IllegalStateException("Voice privacy tone NYI.");
case TONE_VIDEO_UPGRADE:
+ case TONE_RTT_REQUEST:
// Similar to the call waiting tone, but does not repeat.
toneType = ToneGenerator.TONE_SUP_CALL_WAITING;
toneVolume = RELATIVE_VOLUME_HIPRI;
toneLengthMillis = 4000;
mediaResourceId = TONE_RESOURCE_ID_UNDEFINED;
break;
+ case TONE_IN_CALL_QUALITY_NOTIFICATION:
+ // Don't use tone generator
+ toneType = ToneGenerator.TONE_UNKNOWN;
+ toneVolume = RELATIVE_VOLUME_UNDEFINED;
+ toneLengthMillis = 0;
+
+ // Use a tone resource file for a more rich, full-bodied tone experience.
+ mediaResourceId = R.raw.InCallQualityNotification;
+ break;
default:
throw new IllegalStateException("Bad toneId: " + mToneId);
}
@@ -427,7 +439,7 @@
@Override
public void onCompletion(MediaPlayer mp) {
Log.i(this, "playMediaTone: toneResourceId=%d completed.", toneResourceId);
- synchronized (this) {
+ synchronized (InCallTonePlayer.this) {
mState = STATE_OFF;
}
mToneMediaPlayer.release();
diff --git a/src/com/android/server/telecom/LogUtils.java b/src/com/android/server/telecom/LogUtils.java
index e4a414b..a9bf18c 100644
--- a/src/com/android/server/telecom/LogUtils.java
+++ b/src/com/android/server/telecom/LogUtils.java
@@ -196,6 +196,7 @@
public static final String REDIRECTION_USER_CONFIRMATION = "REDIRECTION_USER_CONFIRMATION";
public static final String REDIRECTION_USER_CONFIRMED = "REDIRECTION_USER_CONFIRMED";
public static final String REDIRECTION_USER_CANCELLED = "REDIRECTION_USER_CANCELLED";
+ public static final String BT_QUALITY_REPORT = "BT_QUALITY_REPORT";
public static class Timings {
public static final String ACCEPT_TIMING = "accept";
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index 9a4f7df..02f0dab 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -1226,6 +1226,14 @@
= mState.defaultOutgoingAccountHandles.get(Process.myUserHandle());
pw.println("defaultOutgoing: " + (defaultPhoneAccountHandle == null ? "none" :
defaultPhoneAccountHandle.phoneAccountHandle));
+ PhoneAccountHandle defaultOutgoing =
+ getOutgoingPhoneAccountForScheme(PhoneAccount.SCHEME_TEL, mCurrentUserHandle);
+ pw.print("outgoingPhoneAccountForTelScheme: ");
+ if (defaultOutgoing == null) {
+ pw.println("none");
+ } else {
+ pw.println(defaultOutgoing);
+ }
pw.println("simCallManager: " + getSimCallManager(mCurrentUserHandle));
pw.println("phoneAccounts:");
pw.increaseIndent();
diff --git a/src/com/android/server/telecom/RespondViaSmsManager.java b/src/com/android/server/telecom/RespondViaSmsManager.java
index 00d94f0..23ccc1c 100644
--- a/src/com/android/server/telecom/RespondViaSmsManager.java
+++ b/src/com/android/server/telecom/RespondViaSmsManager.java
@@ -204,7 +204,7 @@
for (int i = 0; i < messageParts.size(); i++) {
Intent intent = new Intent(ACTION_MESSAGE_SENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent,
- PendingIntent.FLAG_ONE_SHOT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
sentIntents.add(pendingIntent);
}
MessageSentReceiver receiver = new MessageSentReceiver(
diff --git a/src/com/android/server/telecom/RingtoneFactory.java b/src/com/android/server/telecom/RingtoneFactory.java
index d3d2d0e..d416376 100644
--- a/src/com/android/server/telecom/RingtoneFactory.java
+++ b/src/com/android/server/telecom/RingtoneFactory.java
@@ -85,8 +85,14 @@
if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE);
+ if (defaultRingtoneUri == null) {
+ Log.i(this, "getRingtone: defaultRingtoneUri for user is null.");
+ }
} else {
defaultRingtoneUri = Settings.System.DEFAULT_RINGTONE_URI;
+ if (defaultRingtoneUri == null) {
+ Log.i(this, "getRingtone: Settings.System.DEFAULT_RINGTONE_URI is null.");
+ }
}
if (defaultRingtoneUri == null) {
return null;
diff --git a/src/com/android/server/telecom/SystemStateHelper.java b/src/com/android/server/telecom/SystemStateHelper.java
index 3be3d5e..f44eb39 100644
--- a/src/com/android/server/telecom/SystemStateHelper.java
+++ b/src/com/android/server/telecom/SystemStateHelper.java
@@ -63,35 +63,39 @@
public void onReceive(Context context, Intent intent) {
Log.startSession("SSP.oR");
try {
- String action = intent.getAction();
- if (UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED.equals(action)) {
- int priority = intent.getIntExtra(UiModeManager.EXTRA_PRIORITY,
- UiModeManager.DEFAULT_PRIORITY);
- String callingPackage = intent.getStringExtra(
- UiModeManager.EXTRA_CALLING_PACKAGE);
- Log.i(SystemStateHelper.this, "ENTER_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
- priority, callingPackage);
- onEnterCarMode(priority, callingPackage);
- } else if (UiModeManager.ACTION_EXIT_CAR_MODE_PRIORITIZED.equals(action)) {
- int priority = intent.getIntExtra(UiModeManager.EXTRA_PRIORITY,
- UiModeManager.DEFAULT_PRIORITY);
- String callingPackage = intent.getStringExtra(
- UiModeManager.EXTRA_CALLING_PACKAGE);
- Log.i(SystemStateHelper.this, "EXIT_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
- priority, callingPackage);
- onExitCarMode(priority, callingPackage);
- } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
- Uri data = intent.getData();
- if (data == null) {
+ synchronized (mLock) {
+ String action = intent.getAction();
+ if (UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED.equals(action)) {
+ int priority = intent.getIntExtra(UiModeManager.EXTRA_PRIORITY,
+ UiModeManager.DEFAULT_PRIORITY);
+ String callingPackage = intent.getStringExtra(
+ UiModeManager.EXTRA_CALLING_PACKAGE);
+ Log.i(SystemStateHelper.this,
+ "ENTER_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
+ priority, callingPackage);
+ onEnterCarMode(priority, callingPackage);
+ } else if (UiModeManager.ACTION_EXIT_CAR_MODE_PRIORITIZED.equals(action)) {
+ int priority = intent.getIntExtra(UiModeManager.EXTRA_PRIORITY,
+ UiModeManager.DEFAULT_PRIORITY);
+ String callingPackage = intent.getStringExtra(
+ UiModeManager.EXTRA_CALLING_PACKAGE);
+ Log.i(SystemStateHelper.this,
+ "EXIT_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
+ priority, callingPackage);
+ onExitCarMode(priority, callingPackage);
+ } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
+ Uri data = intent.getData();
+ if (data == null) {
+ Log.w(SystemStateHelper.this,
+ "Got null data for package removed, ignoring");
+ return;
+ }
+ mListeners.forEach(
+ l -> l.onPackageUninstalled(data.getEncodedSchemeSpecificPart()));
+ } else {
Log.w(SystemStateHelper.this,
- "Got null data for package removed, ignoring");
- return;
+ "Unexpected intent received: %s", intent.getAction());
}
- mListeners.forEach(
- l -> l.onPackageUninstalled(data.getEncodedSchemeSpecificPart()));
- } else {
- Log.w(SystemStateHelper.this,
- "Unexpected intent received: %s", intent.getAction());
}
} finally {
Log.endSession();
@@ -101,9 +105,11 @@
private Set<SystemStateListener> mListeners = new CopyOnWriteArraySet<>();
private boolean mIsCarMode;
+ private final TelecomSystem.SyncRoot mLock;
- public SystemStateHelper(Context context) {
+ public SystemStateHelper(Context context, TelecomSystem.SyncRoot lock) {
mContext = context;
+ mLock = lock;
IntentFilter intentFilter1 = new IntentFilter(
UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED);
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index 3481558..0a28484 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -115,7 +115,7 @@
public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme,
String callingPackage, String callingFeatureId) {
try {
- Log.startSession("TSI.gDOPA");
+ Log.startSession("TSI.gDOPA", Log.getPackageAbbreviation(callingPackage));
synchronized (mLock) {
PhoneAccountHandle phoneAccountHandle = null;
final UserHandle callingUserHandle = Binder.getCallingUserHandle();
@@ -147,7 +147,7 @@
public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount(String callingPackage) {
synchronized (mLock) {
try {
- Log.startSession("TSI.gUSOPA");
+ Log.startSession("TSI.gUSOPA", Log.getPackageAbbreviation(callingPackage));
if (!isDialerOrPrivileged(callingPackage, "getDefaultOutgoingPhoneAccount")) {
throw new SecurityException("Only the default dialer, or caller with "
+ "READ_PRIVILEGED_PHONE_STATE can call this method.");
@@ -191,7 +191,7 @@
public List<PhoneAccountHandle> getCallCapablePhoneAccounts(
boolean includeDisabledAccounts, String callingPackage, String callingFeatureId) {
try {
- Log.startSession("TSI.gCCPA");
+ Log.startSession("TSI.gCCPA", Log.getPackageAbbreviation(callingPackage));
if (includeDisabledAccounts &&
!canReadPrivilegedPhoneState(
callingPackage, "getCallCapablePhoneAccounts")) {
@@ -223,7 +223,7 @@
public List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage,
String callingFeatureId) {
try {
- Log.startSession("TSI.gSMPA");
+ Log.startSession("TSI.gSMPA", Log.getPackageAbbreviation(callingPackage));
if (!canReadPhoneState(callingPackage, callingFeatureId,
"Requires READ_PHONE_STATE permission.")) {
throw new SecurityException("Requires READ_PHONE_STATE permission.");
@@ -250,7 +250,7 @@
public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme,
String callingPackage) {
try {
- Log.startSession("TSI.gPASS");
+ Log.startSession("TSI.gPASS", Log.getPackageAbbreviation(callingPackage));
try {
enforceModifyPermission(
"getPhoneAccountsSupportingScheme requires MODIFY_PHONE_STATE");
@@ -832,12 +832,12 @@
}
/**
- * @see android.telecom.TelecomManager#hasCompanionInCallServiceAccess
+ * @see android.telecom.TelecomManager#hasManageOngoingCallsPermission
*/
@Override
- public boolean hasCompanionInCallServiceAccess(String callingPackage) {
+ public boolean hasManageOngoingCallsPermission(String callingPackage) {
try {
- Log.startSession("TSI.hCICSA");
+ Log.startSession("TSI.hMOCP");
return PermissionChecker.checkPermissionForPreflight(mContext,
Manifest.permission.MANAGE_ONGOING_CALLS,
PermissionChecker.PID_UNKNOWN, Binder.getCallingUid(),
@@ -918,7 +918,7 @@
@Override
public boolean endCall(String callingPackage) {
try {
- Log.startSession("TSI.eC");
+ Log.startSession("TSI.eC", Log.getPackageAbbreviation(callingPackage));
synchronized (mLock) {
if (!enforceAnswerCallPermission(callingPackage, Binder.getCallingUid())) {
throw new SecurityException("requires ANSWER_PHONE_CALLS permission");
@@ -942,7 +942,7 @@
@Override
public void acceptRingingCall(String packageName) {
try {
- Log.startSession("TSI.aRC");
+ Log.startSession("TSI.aRC", Log.getPackageAbbreviation(packageName));
synchronized (mLock) {
if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return;
@@ -965,7 +965,7 @@
@Override
public void acceptRingingCallWithVideoState(String packageName, int videoState) {
try {
- Log.startSession("TSI.aRCWVS");
+ Log.startSession("TSI.aRCWVS", Log.getPackageAbbreviation(packageName));
synchronized (mLock) {
if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return;
@@ -988,7 +988,7 @@
public void showInCallScreen(boolean showDialpad, String callingPackage,
String callingFeatureId) {
try {
- Log.startSession("TSI.sICS");
+ Log.startSession("TSI.sICS", Log.getPackageAbbreviation(callingPackage));
if (!canReadPhoneState(callingPackage, callingFeatureId, "showInCallScreen")) {
return;
}
@@ -1013,7 +1013,7 @@
@Override
public void cancelMissedCallsNotification(String callingPackage) {
try {
- Log.startSession("TSI.cMCN");
+ Log.startSession("TSI.cMCN", Log.getPackageAbbreviation(callingPackage));
synchronized (mLock) {
enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
UserHandle userHandle = Binder.getCallingUserHandle();
@@ -1034,7 +1034,7 @@
@Override
public boolean handlePinMmi(String dialString, String callingPackage) {
try {
- Log.startSession("TSI.hPM");
+ Log.startSession("TSI.hPM", Log.getPackageAbbreviation(callingPackage));
enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
// Switch identity so that TelephonyManager checks Telecom's permissions
@@ -1062,7 +1062,7 @@
public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle,
String dialString, String callingPackage) {
try {
- Log.startSession("TSI.hPMFPA");
+ Log.startSession("TSI.hPMFPA", Log.getPackageAbbreviation(callingPackage));
enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
UserHandle callingUserHandle = Binder.getCallingUserHandle();
@@ -1103,7 +1103,7 @@
public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle,
String callingPackage) {
try {
- Log.startSession("TSI.aAUFPA");
+ Log.startSession("TSI.aAUFPA", Log.getPackageAbbreviation(callingPackage));
enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
synchronized (mLock) {
if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
@@ -1137,7 +1137,7 @@
@Override
public boolean isTtySupported(String callingPackage, String callingFeatureId) {
try {
- Log.startSession("TSI.iTS");
+ Log.startSession("TSI.iTS", Log.getPackageAbbreviation(callingPackage));
if (!canReadPhoneState(callingPackage, callingFeatureId, "isTtySupported")) {
throw new SecurityException("Only default dialer or an app with" +
"READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE can call this api");
@@ -1157,7 +1157,7 @@
@Override
public int getCurrentTtyMode(String callingPackage, String callingFeatureId) {
try {
- Log.startSession("TSI.gCTM");
+ Log.startSession("TSI.gCTM", Log.getPackageAbbreviation(callingPackage));
if (!canReadPhoneState(callingPackage, callingFeatureId, "getCurrentTtyMode")) {
return TelecomManager.TTY_MODE_OFF;
}
@@ -1389,7 +1389,7 @@
public void startConference(List<Uri> participants, Bundle extras,
String callingPackage) {
try {
- Log.startSession("TSI.sC");
+ Log.startSession("TSI.sC", Log.getPackageAbbreviation(callingPackage));
if (!canCallPhone(callingPackage, "startConference")) {
throw new SecurityException("Package " + callingPackage + " is not allowed"
+ " to start conference call");
@@ -1408,7 +1408,7 @@
public void placeCall(Uri handle, Bundle extras, String callingPackage,
String callingFeatureId) {
try {
- Log.startSession("TSI.pC");
+ Log.startSession("TSI.pC", Log.getPackageAbbreviation(callingPackage));
enforceCallingPackage(callingPackage);
PhoneAccountHandle phoneAccountHandle = null;
@@ -1790,6 +1790,7 @@
mCallsManager.markCallAsRemoved(call);
}
}
+ mCallsManager.getInCallController().unbindFromServices();
});
}
} finally {
@@ -1899,6 +1900,30 @@
Log.endSession();
}
}
+
+ @Override
+ public void setTestCallDiagnosticService(String packageName) {
+ try {
+ Log.startSession("TSI.sTCDS");
+ enforceModifyPermission();
+ enforceShellOnly(Binder.getCallingUid(), "setTestCallDiagnosticService is for "
+ + "shell use only.");
+ synchronized (mLock) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ CallDiagnosticServiceController controller =
+ mCallsManager.getCallDiagnosticServiceController();
+ if (controller != null) {
+ controller.setTestCallDiagnosticService(packageName);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+ } finally {
+ Log.endSession();
+ }
+ }
};
/**
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index 8928e76..a9f18d6 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -36,8 +36,10 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.UserHandle;
import android.os.UserManager;
@@ -45,8 +47,11 @@
import android.telecom.PhoneAccountHandle;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+
import java.io.FileNotFoundException;
import java.io.InputStream;
+import java.util.List;
/**
* Top-level Application class for Telecom.
@@ -212,165 +217,205 @@
defaultDialerAdapter, roleManagerAdapter, mLock);
Log.startSession("TS.init");
- mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, defaultDialerCache,
- packageName -> AppLabelProxy.Util.getAppLabel(
- mContext.getPackageManager(), packageName));
+ try {
+ mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, defaultDialerCache,
+ packageName -> AppLabelProxy.Util.getAppLabel(
+ mContext.getPackageManager(), packageName));
- mContactsAsyncHelper = contactsAsyncHelperFactory.create(
- new ContactsAsyncHelper.ContentResolverAdapter() {
- @Override
- public InputStream openInputStream(Context context, Uri uri)
- throws FileNotFoundException {
- return context.getContentResolver().openInputStream(uri);
- }
- });
- BluetoothDeviceManager bluetoothDeviceManager = new BluetoothDeviceManager(mContext,
- new BluetoothAdapterProxy());
- BluetoothRouteManager bluetoothRouteManager = new BluetoothRouteManager(mContext, mLock,
- bluetoothDeviceManager, new Timeouts.Adapter());
- BluetoothStateReceiver bluetoothStateReceiver = new BluetoothStateReceiver(
- bluetoothDeviceManager, bluetoothRouteManager);
- mContext.registerReceiver(bluetoothStateReceiver, BluetoothStateReceiver.INTENT_FILTER);
+ mContactsAsyncHelper = contactsAsyncHelperFactory.create(
+ new ContactsAsyncHelper.ContentResolverAdapter() {
+ @Override
+ public InputStream openInputStream(Context context, Uri uri)
+ throws FileNotFoundException {
+ return context.getContentResolver().openInputStream(uri);
+ }
+ });
+ BluetoothDeviceManager bluetoothDeviceManager = new BluetoothDeviceManager(mContext,
+ new BluetoothAdapterProxy());
+ BluetoothRouteManager bluetoothRouteManager = new BluetoothRouteManager(mContext, mLock,
+ bluetoothDeviceManager, new Timeouts.Adapter());
+ BluetoothStateReceiver bluetoothStateReceiver = new BluetoothStateReceiver(
+ bluetoothDeviceManager, bluetoothRouteManager);
+ mContext.registerReceiver(bluetoothStateReceiver, BluetoothStateReceiver.INTENT_FILTER);
- WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext);
- SystemStateHelper systemStateHelper = new SystemStateHelper(mContext);
+ WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext);
+ SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock);
- mMissedCallNotifier = missedCallNotifierImplFactory
- .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar, defaultDialerCache,
- deviceIdleControllerAdapter);
- DisconnectedCallNotifier.Factory disconnectedCallNotifierFactory =
- new DisconnectedCallNotifier.Default();
+ mMissedCallNotifier = missedCallNotifierImplFactory
+ .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar,
+ defaultDialerCache, deviceIdleControllerAdapter);
+ DisconnectedCallNotifier.Factory disconnectedCallNotifierFactory =
+ new DisconnectedCallNotifier.Default();
- CallerInfoLookupHelper callerInfoLookupHelper =
- new CallerInfoLookupHelper(context, callerInfoAsyncQueryFactory,
- mContactsAsyncHelper, mLock);
+ CallerInfoLookupHelper callerInfoLookupHelper =
+ new CallerInfoLookupHelper(context, callerInfoAsyncQueryFactory,
+ mContactsAsyncHelper, mLock);
- EmergencyCallHelper emergencyCallHelper = new EmergencyCallHelper(mContext,
- defaultDialerCache, timeoutsAdapter);
+ EmergencyCallHelper emergencyCallHelper = new EmergencyCallHelper(mContext,
+ defaultDialerCache, timeoutsAdapter);
- InCallControllerFactory inCallControllerFactory = new InCallControllerFactory() {
- @Override
- public InCallController create(Context context, SyncRoot lock,
- CallsManager callsManager, SystemStateHelper systemStateProvider,
- DefaultDialerCache defaultDialerCache, Timeouts.Adapter timeoutsAdapter,
- EmergencyCallHelper emergencyCallHelper) {
- return new InCallController(context, lock, callsManager, systemStateProvider,
- defaultDialerCache, timeoutsAdapter, emergencyCallHelper,
- new CarModeTracker(), clockProxy);
- }
- };
+ InCallControllerFactory inCallControllerFactory = new InCallControllerFactory() {
+ @Override
+ public InCallController create(Context context, SyncRoot lock,
+ CallsManager callsManager, SystemStateHelper systemStateProvider,
+ DefaultDialerCache defaultDialerCache, Timeouts.Adapter timeoutsAdapter,
+ EmergencyCallHelper emergencyCallHelper) {
+ return new InCallController(context, lock, callsManager, systemStateProvider,
+ defaultDialerCache, timeoutsAdapter, emergencyCallHelper,
+ new CarModeTracker(), clockProxy);
+ }
+ };
- AudioProcessingNotification audioProcessingNotification =
- new AudioProcessingNotification(mContext);
+ CallDiagnosticServiceController callDiagnosticServiceController =
+ new CallDiagnosticServiceController(
+ new CallDiagnosticServiceController.ContextProxy() {
+ @Override
+ public List<ResolveInfo> queryIntentServicesAsUser(
+ @NonNull Intent intent, int flags, int userId) {
+ return mContext.getPackageManager().queryIntentServicesAsUser(
+ intent, flags, userId);
+ }
- ToastFactory toastFactory = new ToastFactory() {
- @Override
- public Toast makeText(Context context, int resId, int duration) {
- return Toast.makeText(context, context.getMainLooper(), context.getString(resId),
- duration);
+ @Override
+ public boolean bindServiceAsUser(@NonNull Intent service,
+ @NonNull ServiceConnection conn, int flags,
+ @NonNull UserHandle user) {
+ return mContext.bindServiceAsUser(service, conn, flags, user);
+ }
+
+ @Override
+ public void unbindService(@NonNull ServiceConnection conn) {
+ mContext.unbindService(conn);
+ }
+
+ @Override
+ public UserHandle getCurrentUserHandle() {
+ return mCallsManager.getCurrentUserHandle();
+ }
+ },
+ mContext.getResources().getString(
+ com.android.server.telecom.R.string
+ .call_diagnostic_service_package_name),
+ mLock
+ );
+
+ AudioProcessingNotification audioProcessingNotification =
+ new AudioProcessingNotification(mContext);
+
+ ToastFactory toastFactory = new ToastFactory() {
+ @Override
+ public Toast makeText(Context context, int resId, int duration) {
+ return Toast.makeText(context, context.getMainLooper(),
+ context.getString(resId), duration);
+ }
+
+ @Override
+ public Toast makeText(Context context, CharSequence text, int duration) {
+ return Toast.makeText(context, context.getMainLooper(), text, duration);
+ }
+ };
+
+ mCallsManager = new CallsManager(
+ mContext,
+ mLock,
+ callerInfoLookupHelper,
+ mMissedCallNotifier,
+ disconnectedCallNotifierFactory,
+ mPhoneAccountRegistrar,
+ headsetMediaButtonFactory,
+ proximitySensorManagerFactory,
+ inCallWakeLockControllerFactory,
+ connectionServiceFocusManagerFactory,
+ audioServiceFactory,
+ bluetoothRouteManager,
+ wiredHeadsetManager,
+ systemStateHelper,
+ defaultDialerCache,
+ timeoutsAdapter,
+ asyncRingtonePlayer,
+ phoneNumberUtilsAdapter,
+ emergencyCallHelper,
+ toneGeneratorFactory,
+ clockProxy,
+ audioProcessingNotification,
+ bluetoothStateReceiver,
+ callAudioRouteStateMachineFactory,
+ callAudioModeStateMachineFactory,
+ inCallControllerFactory,
+ callDiagnosticServiceController,
+ roleManagerAdapter,
+ toastFactory);
+
+ mIncomingCallNotifier = incomingCallNotifier;
+ incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
+ @Override
+ public boolean hasUnholdableCallsForOtherConnectionService(
+ PhoneAccountHandle phoneAccountHandle) {
+ return mCallsManager.hasUnholdableCallsForOtherConnectionService(
+ phoneAccountHandle);
+ }
+
+ @Override
+ public int getNumUnholdableCallsForOtherConnectionService(
+ PhoneAccountHandle phoneAccountHandle) {
+ return mCallsManager.getNumUnholdableCallsForOtherConnectionService(
+ phoneAccountHandle);
+ }
+
+ @Override
+ public Call getActiveCall() {
+ return mCallsManager.getActiveCall();
+ }
+ });
+ mCallsManager.setIncomingCallNotifier(mIncomingCallNotifier);
+
+ mRespondViaSmsManager = new RespondViaSmsManager(mCallsManager, mLock);
+ mCallsManager.setRespondViaSmsManager(mRespondViaSmsManager);
+
+ mContext.registerReceiverAsUser(mUserSwitchedReceiver, UserHandle.ALL,
+ USER_SWITCHED_FILTER, null, null);
+ mContext.registerReceiverAsUser(mUserStartingReceiver, UserHandle.ALL,
+ USER_STARTING_FILTER, null, null);
+ mContext.registerReceiverAsUser(mBootCompletedReceiver, UserHandle.ALL,
+ BOOT_COMPLETE_FILTER, null, null);
+
+ // Set current user explicitly since USER_SWITCHED_FILTER intent can be missed at
+ // startup
+ synchronized (mLock) {
+ UserHandle currentUserHandle = UserHandle.of(ActivityManager.getCurrentUser());
+ mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle);
+ mCallsManager.onUserSwitch(currentUserHandle);
}
- @Override
- public Toast makeText(Context context, CharSequence text, int duration) {
- return Toast.makeText(context, context.getMainLooper(), text, duration);
- }
- };
+ mCallIntentProcessor = new CallIntentProcessor(mContext, mCallsManager,
+ defaultDialerCache);
+ mTelecomBroadcastIntentProcessor = new TelecomBroadcastIntentProcessor(
+ mContext, mCallsManager);
- mCallsManager = new CallsManager(
- mContext,
- mLock,
- callerInfoLookupHelper,
- mMissedCallNotifier,
- disconnectedCallNotifierFactory,
- mPhoneAccountRegistrar,
- headsetMediaButtonFactory,
- proximitySensorManagerFactory,
- inCallWakeLockControllerFactory,
- connectionServiceFocusManagerFactory,
- audioServiceFactory,
- bluetoothRouteManager,
- wiredHeadsetManager,
- systemStateHelper,
- defaultDialerCache,
- timeoutsAdapter,
- asyncRingtonePlayer,
- phoneNumberUtilsAdapter,
- emergencyCallHelper,
- toneGeneratorFactory,
- clockProxy,
- audioProcessingNotification,
- bluetoothStateReceiver,
- callAudioRouteStateMachineFactory,
- callAudioModeStateMachineFactory,
- inCallControllerFactory,
- roleManagerAdapter,
- toastFactory);
+ // Register the receiver for the dialer secret codes, used to enable extended logging.
+ mDialerCodeReceiver = new DialerCodeReceiver(mCallsManager);
+ mContext.registerReceiver(mDialerCodeReceiver, DIALER_SECRET_CODE_FILTER,
+ Manifest.permission.CONTROL_INCALL_EXPERIENCE, null);
- mIncomingCallNotifier = incomingCallNotifier;
- incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
- @Override
- public boolean hasUnholdableCallsForOtherConnectionService(
- PhoneAccountHandle phoneAccountHandle) {
- return mCallsManager.hasUnholdableCallsForOtherConnectionService(
- phoneAccountHandle);
- }
-
- @Override
- public int getNumUnholdableCallsForOtherConnectionService(
- PhoneAccountHandle phoneAccountHandle) {
- return mCallsManager.getNumUnholdableCallsForOtherConnectionService(
- phoneAccountHandle);
- }
-
- @Override
- public Call getActiveCall() {
- return mCallsManager.getActiveCall();
- }
- });
- mCallsManager.setIncomingCallNotifier(mIncomingCallNotifier);
-
- mRespondViaSmsManager = new RespondViaSmsManager(mCallsManager, mLock);
- mCallsManager.setRespondViaSmsManager(mRespondViaSmsManager);
-
- mContext.registerReceiverAsUser(mUserSwitchedReceiver, UserHandle.ALL,
- USER_SWITCHED_FILTER, null, null);
- mContext.registerReceiverAsUser(mUserStartingReceiver, UserHandle.ALL,
- USER_STARTING_FILTER, null, null);
- mContext.registerReceiverAsUser(mBootCompletedReceiver, UserHandle.ALL,
- BOOT_COMPLETE_FILTER, null, null);
-
- // Set current user explicitly since USER_SWITCHED_FILTER intent can be missed at startup
- synchronized(mLock) {
- UserHandle currentUserHandle = UserHandle.of(ActivityManager.getCurrentUser());
- mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle);
- mCallsManager.onUserSwitch(currentUserHandle);
+ // There is no USER_SWITCHED broadcast for user 0, handle it here explicitly.
+ final UserManager userManager = UserManager.get(mContext);
+ mTelecomServiceImpl = new TelecomServiceImpl(
+ mContext, mCallsManager, mPhoneAccountRegistrar,
+ new CallIntentProcessor.AdapterImpl(defaultDialerCache),
+ new UserCallIntentProcessorFactory() {
+ @Override
+ public UserCallIntentProcessor create(Context context,
+ UserHandle userHandle) {
+ return new UserCallIntentProcessor(context, userHandle);
+ }
+ },
+ defaultDialerCache,
+ new TelecomServiceImpl.SubscriptionManagerAdapterImpl(),
+ new TelecomServiceImpl.SettingsSecureAdapterImpl(),
+ mLock);
+ } finally {
+ Log.endSession();
}
-
- mCallIntentProcessor = new CallIntentProcessor(mContext, mCallsManager, defaultDialerCache);
- mTelecomBroadcastIntentProcessor = new TelecomBroadcastIntentProcessor(
- mContext, mCallsManager);
-
- // Register the receiver for the dialer secret codes, used to enable extended logging.
- mDialerCodeReceiver = new DialerCodeReceiver(mCallsManager);
- mContext.registerReceiver(mDialerCodeReceiver, DIALER_SECRET_CODE_FILTER,
- Manifest.permission.CONTROL_INCALL_EXPERIENCE, null);
-
- // There is no USER_SWITCHED broadcast for user 0, handle it here explicitly.
- final UserManager userManager = UserManager.get(mContext);
- mTelecomServiceImpl = new TelecomServiceImpl(
- mContext, mCallsManager, mPhoneAccountRegistrar,
- new CallIntentProcessor.AdapterImpl(defaultDialerCache),
- new UserCallIntentProcessorFactory() {
- @Override
- public UserCallIntentProcessor create(Context context, UserHandle userHandle) {
- return new UserCallIntentProcessor(context, userHandle);
- }
- },
- defaultDialerCache,
- new TelecomServiceImpl.SubscriptionManagerAdapterImpl(),
- new TelecomServiceImpl.SettingsSecureAdapterImpl(),
- mLock);
- Log.endSession();
}
@VisibleForTesting
diff --git a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
index e93ef22..34975aa 100644
--- a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
+++ b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java
@@ -124,6 +124,17 @@
}
}
+ public void notifyTimeout() {
+ if (mService != null) {
+ try {
+ mService.notifyTimeout();
+ } catch (RemoteException e) {
+ Log.e(this, e, "Failed to notify call redirection timed out to "
+ + mServiceType + " call redirection service");
+ }
+ }
+ }
+
private class CallRedirectionServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
@@ -394,6 +405,7 @@
Log.addEvent(mCall, serviceType.equals(SERVICE_TYPE_USER_DEFINED)
? LogUtils.Events.REDIRECTION_TIMED_OUT_USER
: LogUtils.Events.REDIRECTION_TIMED_OUT_CARRIER);
+ mAttempt.notifyTimeout();
if (serviceType.equals(SERVICE_TYPE_USER_DEFINED)) {
mUiAction = UI_TYPE_USER_DEFINED_TIMEOUT;
mShouldCancelCall = true;
diff --git a/src/com/android/server/telecom/ui/DisconnectedCallNotifier.java b/src/com/android/server/telecom/ui/DisconnectedCallNotifier.java
index 3f54689..66f9fe4 100644
--- a/src/com/android/server/telecom/ui/DisconnectedCallNotifier.java
+++ b/src/com/android/server/telecom/ui/DisconnectedCallNotifier.java
@@ -333,7 +333,8 @@
UserHandle userHandle) {
Intent intent = new Intent(action, data, mContext, TelecomBroadcastReceiver.class);
intent.putExtra(TelecomBroadcastIntentProcessor.EXTRA_USERHANDLE, userHandle);
- return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ return PendingIntent.getBroadcast(mContext, 0, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
private boolean canRespondViaSms(@NonNull CallInfo call) {
@@ -354,7 +355,7 @@
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(mContext);
taskStackBuilder.addNextIntent(intent);
- return taskStackBuilder.getPendingIntent(0, 0, null, userHandle);
+ return taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_IMMUTABLE, null, userHandle);
}
/**
diff --git a/testapps/Android.bp b/testapps/Android.bp
index 26347fe..11ea474 100644
--- a/testapps/Android.bp
+++ b/testapps/Android.bp
@@ -14,6 +14,10 @@
// limitations under the License.
//
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
android_test {
name: "TelecomTestApps",
static_libs: [
diff --git a/testapps/AndroidManifest.xml b/testapps/AndroidManifest.xml
index 9c461ca..dd8258a 100644
--- a/testapps/AndroidManifest.xml
+++ b/testapps/AndroidManifest.xml
@@ -39,6 +39,13 @@
<uses-library android:name="android.test.runner"/>
<!-- Miscellaneous telecom app-related test activities. -->
+ <service android:name="com.android.server.telecom.testapps.TestCallDiagnosticService"
+ android:permission="android.permission.BIND_CALL_DIAGNOSTIC_SERVICE"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.telecom.CallDiagnosticService"/>
+ </intent-filter>
+ </service>
<service android:name="com.android.server.telecom.testapps.TestConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
@@ -70,6 +77,8 @@
android:exported="true">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI"
android:value="true"/>
+ <meta-data android:name="android.telecom.INCLUDE_SELF_MANAGED_CALLS"
+ android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
diff --git a/testapps/carmodedialer/Android.bp b/testapps/carmodedialer/Android.bp
index 7179b1f..9f65b8c 100644
--- a/testapps/carmodedialer/Android.bp
+++ b/testapps/carmodedialer/Android.bp
@@ -14,6 +14,10 @@
// limitations under the License.
//
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
android_test {
name: "TelecomCarModeApp",
static_libs: [
diff --git a/testapps/carmodedialer/AndroidManifest.xml b/testapps/carmodedialer/AndroidManifest.xml
index f237211..239726c 100644
--- a/testapps/carmodedialer/AndroidManifest.xml
+++ b/testapps/carmodedialer/AndroidManifest.xml
@@ -37,8 +37,10 @@
<service android:name="com.android.server.telecom.carmodedialer.CarModeInCallServiceImpl"
android:permission="android.permission.BIND_INCALL_SERVICE"
android:exported="true">
- <meta-data android:name="android.telecom.IN_CALL_SERVICE_CAR_MODE_UI"
- android:value="true"/>
+ <meta-data android:name="android.telecom.IN_CALL_SERVICE_CAR_MODE_UI"
+ android:value="true"/>
+ <meta-data android:name="android.telecom.INCLUDE_SELF_MANAGED_CALLS"
+ android:value="true"/>
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
diff --git a/testapps/res/layout/self_managed_sample_main.xml b/testapps/res/layout/self_managed_sample_main.xml
index 28f4473..d26d629 100644
--- a/testapps/res/layout/self_managed_sample_main.xml
+++ b/testapps/res/layout/self_managed_sample_main.xml
@@ -90,7 +90,6 @@
<LinearLayout android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
-
<Button
android:id="@+id/placeOutgoingCallButton"
android:layout_width="wrap_content"
@@ -113,6 +112,35 @@
android:text="Req CallScreen Role"/>
</LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/placeSelfManagedOutgoingCallButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="SelfManagedOutgoing"/>
+ <Button
+ android:id="@+id/placeSelfManagedIncomingCallButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="SelfManagedIncoming"/>
+ </LinearLayout>
+
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/enableCarMode"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Enable car mode"/>
+ <Button
+ android:id="@+id/disableCarMode"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Disable car mode"/>
+ </LinearLayout>
<ListView
android:id="@+id/callList"
android:layout_width="match_parent"
diff --git a/testapps/src/com/android/server/telecom/testapps/SelfManagedCallList.java b/testapps/src/com/android/server/telecom/testapps/SelfManagedCallList.java
index 4b5fa57..d4661ff 100644
--- a/testapps/src/com/android/server/telecom/testapps/SelfManagedCallList.java
+++ b/testapps/src/com/android/server/telecom/testapps/SelfManagedCallList.java
@@ -46,8 +46,10 @@
public static String SELF_MANAGED_ACCOUNT_1 = "1";
public static String SELF_MANAGED_ACCOUNT_2 = "2";
+ public static String SELF_MANAGED_ACCOUNT_3 = "3";
public static String SELF_MANAGED_NAME_1 = "SuperCall";
public static String SELF_MANAGED_NAME_2 = "Mega Call";
+ public static String SELF_MANAGED_NAME_3 = "SM Call";
public static String CUSTOM_URI_SCHEME = "custom";
private static SelfManagedCallList sInstance;
@@ -99,6 +101,8 @@
SELF_MANAGED_NAME_1, true /* areCallsLogged */);
registerPhoneAccount(context, SELF_MANAGED_ACCOUNT_2, SELF_MANAGED_ADDRESS_2,
SELF_MANAGED_NAME_2, false /* areCallsLogged */);
+ registerPhoneAccount(context, SELF_MANAGED_ACCOUNT_3, SELF_MANAGED_ADDRESS_1,
+ SELF_MANAGED_NAME_3, true /* areCallsLogged */);
}
public void registerPhoneAccount(Context context, String id, Uri address, String name,
@@ -110,6 +114,9 @@
if (areCallsLogged) {
extras.putBoolean(PhoneAccount.EXTRA_LOG_SELF_MANAGED_CALLS, true);
}
+ if (id.equals(SELF_MANAGED_ACCOUNT_3)) {
+ extras.putBoolean(PhoneAccount.EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE, true);
+ }
PhoneAccount.Builder builder = PhoneAccount.builder(handle, name)
.addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
.addSupportedUriScheme(PhoneAccount.SCHEME_SIP)
diff --git a/testapps/src/com/android/server/telecom/testapps/SelfManagedCallingActivity.java b/testapps/src/com/android/server/telecom/testapps/SelfManagedCallingActivity.java
index fd12a2e..44410d2 100644
--- a/testapps/src/com/android/server/telecom/testapps/SelfManagedCallingActivity.java
+++ b/testapps/src/com/android/server/telecom/testapps/SelfManagedCallingActivity.java
@@ -16,9 +16,12 @@
package com.android.server.telecom.testapps;
+import static android.app.UiModeManager.DEFAULT_PRIORITY;
+
import android.app.Activity;
import android.app.NotificationChannel;
import android.app.NotificationManager;
+import android.app.UiModeManager;
import android.app.role.RoleManager;
import android.content.Intent;
import android.media.AudioAttributes;
@@ -54,9 +57,13 @@
private SelfManagedCallList mCallList = SelfManagedCallList.getInstance();
private CheckBox mCheckIfPermittedBeforeCalling;
private Button mPlaceOutgoingCallButton;
+ private Button mPlaceSelfManagedOutgoingCallButton;
+ private Button mPlaceSelfManagedIncomingCallButton;
private Button mPlaceIncomingCallButton;
private Button mHandoverFrom;
private Button mRequestCallScreeningRole;
+ private Button mEnableCarMode;
+ private Button mDisableCarMode;
private RadioButton mUseAcct1Button;
private RadioButton mUseAcct2Button;
private CheckBox mHoldableCheckbox;
@@ -119,6 +126,20 @@
placeOutgoingCall();
}
});
+ mPlaceSelfManagedOutgoingCallButton = (Button) findViewById(
+ R.id.placeSelfManagedOutgoingCallButton);
+ mPlaceSelfManagedOutgoingCallButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ placeSelfManagedOutgoingCall();
+ }
+ });
+ mPlaceSelfManagedIncomingCallButton = (Button) findViewById(
+ R.id.placeSelfManagedIncomingCallButton);
+ mPlaceSelfManagedIncomingCallButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) { placeSelfManagedIncomingCall(); }
+ });
mPlaceIncomingCallButton = (Button) findViewById(R.id.placeIncomingCallButton);
mPlaceIncomingCallButton.setOnClickListener(new View.OnClickListener() {
@Override
@@ -134,7 +155,14 @@
mRequestCallScreeningRole.setOnClickListener((v -> {
requestCallScreeningRole();
}));
-
+ mEnableCarMode = (Button) findViewById(R.id.enableCarMode);
+ mEnableCarMode.setOnClickListener((v -> {
+ enableCarMode();
+ }));
+ mDisableCarMode = (Button) findViewById(R.id.disableCarMode);
+ mDisableCarMode.setOnClickListener((v -> {
+ disableCarMode();
+ }));
mUseAcct1Button = findViewById(R.id.useAcct1Button);
mUseAcct2Button = findViewById(R.id.useAcct2Button);
mHasFocus = findViewById(R.id.hasFocus);
@@ -184,6 +212,25 @@
tm.placeCall(Uri.parse(mNumber.getText().toString()), extras);
}
+ private void placeSelfManagedOutgoingCall() {
+ TelecomManager tm = TelecomManager.from(this);
+ PhoneAccountHandle phoneAccountHandle = mCallList.getPhoneAccountHandle(
+ SelfManagedCallList.SELF_MANAGED_ACCOUNT_3);
+
+ if (mCheckIfPermittedBeforeCalling.isChecked()) {
+ Toast.makeText(this, R.string.outgoingCallNotPermitted, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ Bundle extras = new Bundle();
+ extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+ if (mVideoCallCheckbox.isChecked()) {
+ extras.putInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
+ VideoProfile.STATE_BIDIRECTIONAL);
+ }
+ tm.placeCall(Uri.parse(mNumber.getText().toString()), extras);
+ }
+
private void initiateHandover() {
TelecomManager tm = TelecomManager.from(this);
PhoneAccountHandle phoneAccountHandle = getSelectedPhoneAccountHandle();
@@ -214,6 +261,37 @@
tm.addNewIncomingCall(getSelectedPhoneAccountHandle(), extras);
}
+ private void placeSelfManagedIncomingCall() {
+ TelecomManager tm = TelecomManager.from(this);
+ PhoneAccountHandle phoneAccountHandle = mCallList.getPhoneAccountHandle(
+ SelfManagedCallList.SELF_MANAGED_ACCOUNT_3);
+
+ if (mCheckIfPermittedBeforeCalling.isChecked()) {
+ if (!tm.isIncomingCallPermitted(phoneAccountHandle)) {
+ Toast.makeText(this, R.string.incomingCallNotPermitted , Toast.LENGTH_SHORT).show();
+ return;
+ }
+ }
+
+ Bundle extras = new Bundle();
+ extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS,
+ Uri.parse(mNumber.getText().toString()));
+ tm.addNewIncomingCall(phoneAccountHandle, extras);
+ }
+
+ private void enableCarMode() {
+ UiModeManager uiModeManager = getSystemService(UiModeManager.class);
+ uiModeManager.enableCarMode(0);
+ Toast.makeText(this, "Enabling car mode with priority " + DEFAULT_PRIORITY,
+ Toast.LENGTH_LONG).show();
+ }
+
+ private void disableCarMode() {
+ UiModeManager uiModeManager = getSystemService(UiModeManager.class);
+ uiModeManager.disableCarMode(0);
+ Toast.makeText(this, "Disabling car mode", Toast.LENGTH_LONG).show();
+ }
+
private void configureNotificationChannel() {
NotificationChannel channel = new NotificationChannel(
SelfManagedConnection.INCOMING_CALL_CHANNEL_ID, "Incoming Calls",
diff --git a/testapps/src/com/android/server/telecom/testapps/TestCallDiagnosticService.java b/testapps/src/com/android/server/telecom/testapps/TestCallDiagnosticService.java
new file mode 100644
index 0000000..73bf438
--- /dev/null
+++ b/testapps/src/com/android/server/telecom/testapps/TestCallDiagnosticService.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2021 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.testapps;
+
+import android.telecom.BluetoothCallQualityReport;
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.CallDiagnosticService;
+import android.telecom.DiagnosticCall;
+import android.telecom.Log;
+import android.telephony.CallQuality;
+import android.telephony.ims.ImsReasonInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class TestCallDiagnosticService extends CallDiagnosticService {
+
+ public static final class TestDiagnosticCall extends DiagnosticCall {
+ public Call.Details details;
+
+ TestDiagnosticCall(Call.Details details) {
+ this.details = details;
+ }
+
+ @Override
+ public void onCallDetailsChanged(@NonNull Call.Details details) {
+ Log.i(this, "onCallDetailsChanged; %s", details);
+ }
+
+ @Override
+ public void onReceiveDeviceToDeviceMessage(int message, int value) {
+ Log.i(this, "onReceiveDeviceToDeviceMessage; %d/%d", message, value);
+ }
+
+ @Nullable
+ @Override
+ public CharSequence onCallDisconnected(int disconnectCause, int preciseDisconnectCause) {
+ Log.i(this, "onCallDisconnected");
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public CharSequence onCallDisconnected(@NonNull ImsReasonInfo disconnectReason) {
+ Log.i(this, "onCallDisconnected");
+ return null;
+ }
+
+ @Override
+ public void onCallQualityReceived(@NonNull CallQuality callQuality) {
+ Log.i(this, "onCallQualityReceived %s", callQuality);
+ }
+ }
+
+ @NonNull
+ @Override
+ public DiagnosticCall onInitializeDiagnosticCall(@NonNull Call.Details call) {
+ Log.i(this, "onInitiatlizeDiagnosticCall %s", call);
+ return new TestDiagnosticCall(call);
+ }
+
+ @Override
+ public void onRemoveDiagnosticCall(@NonNull DiagnosticCall call) {
+ Log.i(this, "onRemoveDiagnosticCall %s", call);
+ }
+
+ @Override
+ public void onCallAudioStateChanged(@NonNull CallAudioState audioState) {
+ Log.i(this, "onCallAudioStateChanged %s", audioState);
+ }
+
+ @Override
+ public void onBluetoothCallQualityReportReceived(
+ @NonNull BluetoothCallQualityReport qualityReport) {
+ Log.i(this, "onBluetoothCallQualityReportReceived %s", qualityReport);
+ }
+}
diff --git a/tests/src/com/android/server/telecom/tests/AnalyticsTests.java b/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
index a64f39d..a4cc521 100644
--- a/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
+++ b/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
@@ -17,6 +17,7 @@
package com.android.server.telecom.tests;
import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED;
+import static android.provider.CallLog.Calls.USER_MISSED_CALL_FILTERS_TIMEOUT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -203,7 +204,9 @@
assertTrue(callAnalytics2.startTime > 0);
assertEquals(0, callAnalytics1.endTime);
assertEquals(0, callAnalytics2.endTime);
- assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics1.missedReason);
+ long missedReason1 = callAnalytics1.missedReason;
+ assertTrue(missedReason1 == MISSED_REASON_NOT_MISSED
+ || missedReason1 == USER_MISSED_CALL_FILTERS_TIMEOUT);
assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics2.missedReason);
assertEquals(Analytics.INCOMING_DIRECTION, callAnalytics1.callDirection);
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
index 24476f0..976a4da 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
@@ -276,6 +276,10 @@
waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
verifyNewSystemCallAudioState(initState, expectedMidState);
+ // clear out the handler state before resetting mocks in order to avoid introducing a
+ // CallAudioState that has a null list of supported BT devices
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
resetMocks();
// Now, switch back to BT explicitly
@@ -455,6 +459,37 @@
@SmallTest
@Test
+ public void testFocusChangeFromQuiescentSpeaker() {
+ CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
+ mContext,
+ mockCallsManager,
+ mockBluetoothRouteManager,
+ mockWiredHeadsetManager,
+ mockStatusBarNotifier,
+ mAudioServiceFactory,
+ CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED,
+ mThreadHandler.getLooper());
+ stateMachine.setCallAudioManager(mockCallAudioManager);
+
+ when(mockAudioManager.isSpeakerphoneOn()).thenReturn(false);
+
+ CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_SPEAKER,
+ CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER);
+ stateMachine.initialize(initState);
+
+ // Switch to active, pretending that a call came in.
+ stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
+ CallAudioRouteStateMachine.ACTIVE_FOCUS);
+ waitForHandlerAction(stateMachine.getHandler(), TEST_TIMEOUT);
+
+ // Make sure that we've successfully switched to the active speaker route and that we've
+ // called setSpeakerOn
+ assertTrue(stateMachine.isInActiveState());
+ verify(mockAudioManager).setSpeakerphoneOn(true);
+ }
+
+ @SmallTest
+ @Test
public void testFocusChangeWithAlreadyActiveBtDevice() {
CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
mContext,
diff --git a/tests/src/com/android/server/telecom/tests/CallDiagnosticServiceControllerTest.java b/tests/src/com/android/server/telecom/tests/CallDiagnosticServiceControllerTest.java
new file mode 100644
index 0000000..d420f1d
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/CallDiagnosticServiceControllerTest.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.telecom.tests;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.telecom.ParcelableCall;
+
+import com.android.internal.telecom.ICallDiagnosticService;
+import com.android.server.telecom.Call;
+import com.android.server.telecom.CallDiagnosticServiceController;
+import com.android.server.telecom.TelecomSystem;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class CallDiagnosticServiceControllerTest {
+ private static final String TEST_CDS_PACKAGE = "com.test.stuff";
+ private static final String TEST_PACKAGE = "com.android.telecom.calldiagnosticservice";
+ private static final String TEST_CLASS =
+ "com.android.telecom.calldiagnosticservice.TestService";
+ private static final ComponentName TEST_COMPONENT = new ComponentName(TEST_PACKAGE, TEST_CLASS);
+ private static final List<ResolveInfo> RESOLVE_INFOS = new ArrayList<>();
+ private static final ResolveInfo TEST_RESOLVE_INFO = new ResolveInfo();
+ static {
+ TEST_RESOLVE_INFO.serviceInfo = new ServiceInfo();
+ TEST_RESOLVE_INFO.serviceInfo.packageName = TEST_PACKAGE;
+ TEST_RESOLVE_INFO.serviceInfo.name = TEST_CLASS;
+ TEST_RESOLVE_INFO.serviceInfo.permission = Manifest.permission.BIND_CALL_DIAGNOSTIC_SERVICE;
+ RESOLVE_INFOS.add(TEST_RESOLVE_INFO);
+ }
+ private static final String ID_1 = "1";
+ private static final String ID_2 = "2";
+
+ @Mock
+ private CallDiagnosticServiceController.ContextProxy mContextProxy;
+ @Mock
+ private Call mCall;
+ @Mock
+ private Call mCallTwo;
+ @Mock
+ private ICallDiagnosticService mICallDiagnosticService;
+ private TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
+
+ private CallDiagnosticServiceController mCallDiagnosticService;
+ private ServiceConnection mServiceConnection;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ when(mCall.getId()).thenReturn(ID_1);
+ when(mCall.isSimCall()).thenReturn(true);
+ when(mCall.isExternalCall()).thenReturn(false);
+
+ when(mCallTwo.getId()).thenReturn(ID_2);
+ when(mCallTwo.isSimCall()).thenReturn(true);
+ when(mCallTwo.isExternalCall()).thenReturn(false);
+ mServiceConnection = null;
+
+ // Mock out the context and other junk that we depend on.
+ when(mContextProxy.queryIntentServicesAsUser(any(Intent.class), anyInt(), anyInt()))
+ .thenReturn(RESOLVE_INFOS);
+ when(mContextProxy.bindServiceAsUser(any(Intent.class), any(ServiceConnection.class),
+ anyInt(), any(UserHandle.class))).thenReturn(true);
+ when(mContextProxy.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
+
+ mCallDiagnosticService = new CallDiagnosticServiceController(mContextProxy,
+ TEST_PACKAGE, mLock);
+ }
+
+ /**
+ * Verify no binding takes place for a non-sim call.
+ */
+ @Test
+ public void testNoBindOnNonSimCall() {
+ Call mockCall = Mockito.mock(Call.class);
+ when(mockCall.isSimCall()).thenReturn(false);
+
+ mCallDiagnosticService.onCallAdded(mockCall);
+
+ verify(mContextProxy, never()).bindServiceAsUser(any(Intent.class),
+ any(ServiceConnection.class), anyInt(), any(UserHandle.class));
+ }
+
+ /**
+ * Verify no binding takes place for a SIM external call.
+ */
+ @Test
+ public void testNoBindOnExternalCall() {
+ Call mockCall = Mockito.mock(Call.class);
+ when(mockCall.isSimCall()).thenReturn(true);
+ when(mockCall.isExternalCall()).thenReturn(true);
+
+ mCallDiagnosticService.onCallAdded(mockCall);
+
+ verify(mContextProxy, never()).bindServiceAsUser(any(Intent.class),
+ any(ServiceConnection.class), anyInt(), any(UserHandle.class));
+ }
+
+ /**
+ * Verify a valid SIM call causes binding to initiate.
+ */
+ @Test
+ public void testAddSimCallCausesBind() throws RemoteException {
+ mCallDiagnosticService.onCallAdded(mCall);
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ ArgumentCaptor<ServiceConnection> serviceConnectionCaptor = ArgumentCaptor.forClass(
+ ServiceConnection.class);
+ verify(mContextProxy).bindServiceAsUser(intentCaptor.capture(),
+ serviceConnectionCaptor.capture(), anyInt(), any(UserHandle.class));
+ assertEquals(TEST_PACKAGE, intentCaptor.getValue().getPackage());
+
+ // Now we'll pretend bind completed and we sent back the binder.
+ IBinder mockBinder = mock(IBinder.class);
+ when(mockBinder.queryLocalInterface(anyString())).thenReturn(mICallDiagnosticService);
+ serviceConnectionCaptor.getValue().onServiceConnected(TEST_COMPONENT, mockBinder);
+ mServiceConnection = serviceConnectionCaptor.getValue();
+
+ // Make sure it's sent
+ verify(mICallDiagnosticService).initializeDiagnosticCall(any(ParcelableCall.class));
+ }
+
+ /**
+ * Verify removing the active call causes it to be removed from the CallDiagnosticService and
+ * that an unbind takes place.
+ */
+ @Test
+ public void testRemoveSimCallCausesRemoveAndUnbind() throws RemoteException {
+ testAddSimCallCausesBind();
+ mCallDiagnosticService.onCallRemoved(mCall);
+
+ verify(mICallDiagnosticService).removeDiagnosticCall(eq(ID_1));
+ verify(mContextProxy).unbindService(eq(mServiceConnection));
+ }
+
+ /**
+ * Try to add and remove two and verify bind/unbind.
+ */
+ @Test
+ public void testAddTwo() throws RemoteException {
+ testAddSimCallCausesBind();
+ mCallDiagnosticService.onCallAdded(mCallTwo);
+ verify(mICallDiagnosticService, times(2)).initializeDiagnosticCall(
+ any(ParcelableCall.class));
+
+ mCallDiagnosticService.onCallRemoved(mCall);
+ // Not yet!
+ verify(mContextProxy, never()).unbindService(eq(mServiceConnection));
+
+ mCallDiagnosticService.onCallRemoved(mCallTwo);
+
+ verify(mICallDiagnosticService).removeDiagnosticCall(eq(ID_1));
+ verify(mICallDiagnosticService).removeDiagnosticCall(eq(ID_2));
+ verify(mContextProxy).unbindService(eq(mServiceConnection));
+ }
+
+ /**
+ * Verifies we can override the call diagnostic service package to a test package (used by CTS
+ * tests).
+ */
+ @Test
+ public void testTestOverride() {
+ mCallDiagnosticService.setTestCallDiagnosticService(TEST_CDS_PACKAGE);
+ mCallDiagnosticService.onCallAdded(mCall);
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContextProxy).bindServiceAsUser(intentCaptor.capture(),
+ any(ServiceConnection.class), anyInt(), any(UserHandle.class));
+ assertEquals(TEST_CDS_PACKAGE, intentCaptor.getValue().getPackage());
+ }
+}
diff --git a/tests/src/com/android/server/telecom/tests/CallTest.java b/tests/src/com/android/server/telecom/tests/CallTest.java
index 541d278..d326a29 100644
--- a/tests/src/com/android/server/telecom/tests/CallTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallTest.java
@@ -19,13 +19,17 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
import android.content.ComponentName;
import android.net.Uri;
@@ -34,6 +38,7 @@
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Log;
import android.widget.Toast;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -44,6 +49,8 @@
import com.android.server.telecom.CallsManager;
import com.android.server.telecom.ClockProxy;
import com.android.server.telecom.ConnectionServiceWrapper;
+import com.android.server.telecom.InCallController;
+import com.android.server.telecom.InCallController.InCallServiceInfo;
import com.android.server.telecom.PhoneAccountRegistrar;
import com.android.server.telecom.PhoneNumberUtilsAdapter;
import com.android.server.telecom.TelecomSystem;
@@ -54,17 +61,23 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Mockito;
@RunWith(AndroidJUnit4.class)
public class CallTest extends TelecomTestCase {
private static final Uri TEST_ADDRESS = Uri.parse("tel:555-1212");
+ private static final ComponentName COMPONENT_NAME_1 = ComponentName
+ .unflattenFromString("com.foo/.Blah");
+ private static final ComponentName COMPONENT_NAME_2 = ComponentName
+ .unflattenFromString("com.bar/.Blah");
private static final PhoneAccountHandle SIM_1_HANDLE = new PhoneAccountHandle(
- ComponentName.unflattenFromString("com.foo/.Blah"), "Sim1");
+ COMPONENT_NAME_1, "Sim1");
private static final PhoneAccount SIM_1_ACCOUNT = new PhoneAccount.Builder(SIM_1_HANDLE, "Sim1")
.setCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION
| PhoneAccount.CAPABILITY_CALL_PROVIDER)
.setIsEnabled(true)
.build();
+ private static final long TIMEOUT_MILLIS = 1000;
@Mock private CallsManager mMockCallsManager;
@Mock private CallerInfoLookupHelper mMockCallerInfoLookupHelper;
diff --git a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
index 8378e3b..08f3536 100644
--- a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
@@ -67,6 +67,7 @@
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.CallAudioModeStateMachine;
import com.android.server.telecom.CallAudioRouteStateMachine;
+import com.android.server.telecom.CallDiagnosticServiceController;
import com.android.server.telecom.CallState;
import com.android.server.telecom.CallerInfoLookupHelper;
import com.android.server.telecom.CallsManager;
@@ -196,6 +197,7 @@
@Mock private CallAudioRouteStateMachine.Factory mCallAudioRouteStateMachineFactory;
@Mock private CallAudioModeStateMachine mCallAudioModeStateMachine;
@Mock private CallAudioModeStateMachine.Factory mCallAudioModeStateMachineFactory;
+ @Mock private CallDiagnosticServiceController mCallDiagnosticServiceController;
@Mock private BluetoothStateReceiver mBluetoothStateReceiver;
@Mock private RoleManagerAdapter mRoleManagerAdapter;
@Mock private ToastFactory mToastFactory;
@@ -253,6 +255,7 @@
mCallAudioRouteStateMachineFactory,
mCallAudioModeStateMachineFactory,
mInCallControllerFactory,
+ mCallDiagnosticServiceController,
mRoleManagerAdapter,
mToastFactory);
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index a4302b6..ae8d943 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -360,6 +360,11 @@
}
@Override
+ public int checkSelfPermission(String permission) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+
+ @Override
public void enforceCallingOrSelfPermission(String permission, String message) {
// Don't bother enforcing anything in mock.
}
diff --git a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
index 26f24ef..5b4e800 100755
--- a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
@@ -342,6 +342,14 @@
throws RemoteException { }
@Override
+ public void onUsingAlternativeUi(String activeCallId, boolean usingAlternativeUi,
+ Session.Info info) throws RemoteException { }
+
+ @Override
+ public void onTrackedByNonUiService(String activeCallId, boolean isTracked,
+ Session.Info info) throws RemoteException { }
+
+ @Override
public void playDtmfTone(String callId, char digit,
Session.Info info) throws RemoteException { }
diff --git a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
index df11198..0b926fe 100644
--- a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
+++ b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
@@ -1190,6 +1190,7 @@
anyInt(), eq(UserHandle.CURRENT))).thenReturn(true);
when(mMockCall.isExternalCall()).thenReturn(isExternalCall);
when(mMockCall.isSelfManaged()).thenReturn(isSelfManagedCall);
+ when(mMockCall.visibleToInCallService()).thenReturn(isSelfManagedCall);
}
private ResolveInfo getDefResolveInfo(final boolean includeExternalCalls,
diff --git a/tests/src/com/android/server/telecom/tests/SessionTest.java b/tests/src/com/android/server/telecom/tests/SessionTest.java
index 6a14a64..4be3dad 100644
--- a/tests/src/com/android/server/telecom/tests/SessionTest.java
+++ b/tests/src/com/android/server/telecom/tests/SessionTest.java
@@ -173,6 +173,36 @@
}
/**
+ * Ensure creating two sessions and setting the child as the parent to itself doesn't cause a
+ * crash due to infinite recursion.
+ */
+ @SmallTest
+ @Test
+ public void testRecursion_toString_childCircDep() {
+ Log.startSession("testParent");
+ // Running in the same thread, so mark as invisible subsession
+ Session childSession = Log.getSessionManager()
+ .createSubsession(true /*isStartedFromActiveSession*/);
+ Log.continueSession(childSession, "child");
+ Session parentSession = childSession.getParentSession();
+ // Create a circular dependency and ensure we do not crash
+ childSession.setParentSession(childSession);
+
+ // Make sure calling these methods does not result in a crash
+ try {
+ parentSession.toString();
+ childSession.toString();
+ } catch (Exception e) {
+ fail("Exception: " + e.getMessage());
+ } finally {
+ // End child
+ Log.endSession();
+ // End parent
+ Log.endSession();
+ }
+ }
+
+ /**
* Ensure creating two sessions that are parent/child of each other does not lead to a crash
* or infinite recursion when using Session#getInfo.
*/
diff --git a/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java b/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
index 893ae3d..7113148 100644
--- a/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
+++ b/tests/src/com/android/server/telecom/tests/SystemStateHelperTest.java
@@ -48,6 +48,7 @@
import com.android.server.telecom.SystemStateHelper;
import com.android.server.telecom.SystemStateHelper.SystemStateListener;
+import com.android.server.telecom.TelecomSystem;
import org.junit.After;
import org.junit.Before;
@@ -77,6 +78,7 @@
@Mock SensorManager mSensorManager;
@Mock Intent mIntentEnter;
@Mock Intent mIntentExit;
+ TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
@Override
@Before
@@ -106,7 +108,7 @@
@SmallTest
@Test
public void testListeners() throws Exception {
- SystemStateHelper systemStateHelper = new SystemStateHelper(mContext);
+ SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock);
assertFalse(systemStateHelper.removeListener(mSystemStateListener));
systemStateHelper.addListener(mSystemStateListener);
@@ -119,7 +121,7 @@
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, mLock).isCarMode());
}
@SmallTest
@@ -127,7 +129,7 @@
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, mLock).isCarMode());
}
@SmallTest
@@ -135,7 +137,7 @@
public void testPackageRemoved() {
ArgumentCaptor<BroadcastReceiver> receiver =
ArgumentCaptor.forClass(BroadcastReceiver.class);
- new SystemStateHelper(mContext).addListener(mSystemStateListener);
+ new SystemStateHelper(mContext, mLock).addListener(mSystemStateListener);
verify(mContext, atLeastOnce())
.registerReceiver(receiver.capture(), any(IntentFilter.class));
Intent packageRemovedIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
@@ -149,7 +151,7 @@
public void testReceiverAndIntentFilter() {
ArgumentCaptor<IntentFilter> intentFilterCaptor =
ArgumentCaptor.forClass(IntentFilter.class);
- new SystemStateHelper(mContext);
+ new SystemStateHelper(mContext, mLock);
verify(mContext, times(2)).registerReceiver(
any(BroadcastReceiver.class), intentFilterCaptor.capture());
@@ -186,7 +188,7 @@
public void testOnEnterExitCarMode() {
ArgumentCaptor<BroadcastReceiver> receiver =
ArgumentCaptor.forClass(BroadcastReceiver.class);
- new SystemStateHelper(mContext).addListener(mSystemStateListener);
+ new SystemStateHelper(mContext, mLock).addListener(mSystemStateListener);
verify(mContext, atLeastOnce())
.registerReceiver(receiver.capture(), any(IntentFilter.class));
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index 5c1cdc4..7f462d4 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -365,7 +365,7 @@
// Next, create the TelecomSystem, our system under test
setupTelecomSystem();
- // Need to reset teseting tag here
+ // Need to reset testing tag here
Log.setTag(TESTING_TAG);
// Finally, register the ConnectionServices with the PhoneAccountRegistrar of the
@@ -401,11 +401,9 @@
mConnectionServiceFixtureA.waitForHandlerToClear();
mConnectionServiceFixtureB.waitForHandlerToClear();
- // Print out any incomplete sessions for debugging tests
- String sessions = Log.getSessionManager().printActiveSessions();
- if (!TextUtils.isEmpty(sessions)) {
- Log.w(this, "Active Sessions:\n" + sessions);
- }
+ // Forcefully clean all sessions at the end of the test, which will also log any stale
+ // sessions for debugging.
+ Log.getSessionManager().cleanupStaleSessions(0);
mTelecomSystem = null;
super.tearDown();