Merge commit '0751e61' into merge2
diff --git a/Android.mk b/Android.mk
index d3c3316..b2fbc16 100644
--- a/Android.mk
+++ b/Android.mk
@@ -14,9 +14,6 @@
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-# Workaround for "local variable type mismatch" error.
-LOCAL_DX_FLAGS += --no-locals
-
include $(BUILD_PACKAGE)
# Build the test package.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 1688d15..31b2f84 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -204,13 +204,15 @@
</intent-filter>
</receiver>
- <activity android:name=".RespondViaSmsSettings$Settings"
+ <activity android:name=".RespondViaSmsSettings"
android:label="@string/respond_via_sms_setting_title"
android:configChanges="orientation|screenSize|keyboardHidden"
android:theme="@style/Theme.Telecom.DialerSettings"
android:process=":ui">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+ <action android:name="android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index aa793a1..b9aa6b9 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Net noodoproepe word deur die toesteleienaar toegelaat"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Voer \'n geldige nommer in om \'n oproep te maak."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Oproep kan nie op die oomblik bygevoeg word nie."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Deaktiveer TTY-modus om video-oproepe te maak."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Vermiste stemboodskapnommer"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Geen stemboodskapnommer is op die SIM-kaart gestoor nie."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Voeg nommer by"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index fec8369..758b795 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"የአስቸኳይ አደጋ ጥሪዎች ብቻ ናቸው በባለቤቱ የተፈቀዱት"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"አንድ ጥሪ ለማድረግ የሚሰራ ቁጥር ያስገቡ።"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ጥሪ በዚህ ጊዜ ላይ ሊታከል አይችልም።"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"የቪዲዮ ጥሪዎችን ለማድረግ እባክዎ የTTY ሁነታን ያሰናክሉ።"</string>
<string name="no_vm_number" msgid="4164780423805688336">"የድምፅመልዕክት ቁጥርአመለጠ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"በSIM ካርዱ ላይምንም የድምፅመልዕክት ቁጥር አልከተቀመጠም።"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"ቁጥር አክል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 14fc640..3d31dc6 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -38,7 +38,8 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"مسموح لمالك الجهاز بمكالمات الطوارئ فقط"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"لإجراء مكالمة، أدخل رقمًا صالحًا."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"لا يمكن إضافة مكالمة في الوقت الحالي."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"يُرجى تعطيل وضع TTY لإجراء مكالمات فيديو."</string>
<string name="no_vm_number" msgid="4164780423805688336">"رقم البريد الصوتي مفقود"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"لم يتم تخزين رقم بريد صوتي على بطاقة SIM."</string>
+ <string name="no_vm_number_msg" msgid="1300729501030053828">"لم يتم تخزين رقم بريد صوتي على شريحة SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"إضافة رقم"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d706029..63d32b1 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Собственикът на устройството разрешава само спешни обаждания"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"За да извършите обаждане, въведете валиден номер."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Понастоящем обаждането не може да бъде добавено."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Моля, деактивирайте режима на TTY, за да извършвате видеообаждания."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Липсващ номер на гласова поща"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM картата няма съхранен номер за гласова поща."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Добавяне на номер"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 4379a37..6922524 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ডিভাইসের মালিক শুধুমাত্র জরুরি কলগুলিতে অনুমতি দিয়েছেন"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"কোনো কল স্থাপন করতে, একটি বৈধ নম্বর লিখুন৷"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"এই মুহূর্তে কল যোগ করা যাবে না৷"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"অনুগ্রহ করে ভিডিও কলগুলি করতে TTY মোড অক্ষম করুন৷"</string>
<string name="no_vm_number" msgid="4164780423805688336">"ভয়েসমেল নম্বর অনুপস্থিত"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"সিম কার্ডটিতে কোনো ভয়েসমেল নম্বর সংরক্ষিত নেই৷"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"একটি নম্বর যোগ করুন"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c2a01f5..e3cf515 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"El propietari del dispositiu només permet les trucades d\'emergència."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Per realitzar una trucada, introdueix un número vàlid."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"En aquest moment no es pot afegir la trucada."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Desactiva el mode de TTY per fer videotrucades."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Falta el número de correu de veu"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"No hi ha cap número de correu de veu emmagatzemat a la targeta SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Afegeix número"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ff24203..259cca9 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Vlastník zařízení povolil pouze tísňová volání."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Chcete-li uskutečnit hovor, zadejte platné telefonní číslo."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Hovor aktuálně nelze přidat."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Chcete-li vést videohovory, vypněte režim TTY."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Chybí číslo hlasové schránky"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Na SIM kartě není uloženo žádné číslo hlasové schránky."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Přidat číslo"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 93e4b83..83be7ed 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Enhedens ejer tillader kun nødopkald."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Indtast et gyldigt nummer for at foretage et opkald."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Opkaldet kan ikke tilføjes på nuværende tidspunkt."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Deaktiver TTY-tilstanden for at foretage videoopkald."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Telefonsvarernummer mangler"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Der er ikke gemt noget telefonsvarernummer på SIM-kortet."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Tilføj nummer"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7e99980..29aecb2 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Der Geräteinhaber hat nur Notrufe zugelassen."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Geben Sie eine gültige Nummer ein."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Der Anruf kann momentan nicht hinzugefügt werden."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Bitte deaktivieren Sie den TTY-Modus, um Videoanrufe tätigen zu können."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Fehlende Mailbox-Nummer"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Auf der SIM-Karte ist keine Mailbox-Nummer gespeichert."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Nummer hinzufügen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 1805be5..a4249bb 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Από τον κάτοχο της συσκευής επιτρέπονται μόνο κλήσεις έκτακτης ανάγκης"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Για να πραγματοποιήσετε μια κλήση, εισαγάγετε έναν έγκυρο αριθμό."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Δεν είναι δυνατή η προσθήκη κλήσης αυτήν τη στιγμή."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Απενεργοποιήστε τη λειτουργία TTY για να πραγματοποιήσετε βιντεοκλήσεις."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Λείπει ο αριθμός αυτόματου τηλεφωνητή"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Δεν έχει αποθηκευτεί αριθμός για τον αυτόματο τηλεφωνητή στην κάρτα SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Προσθήκη αριθμού"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..97d4c9c
--- /dev/null
+++ b/res/values-en-rAU/strings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+ -->
+
+<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="3477737022166975496">"Phone"</string>
+ <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missed call"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Missed call from <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="accessibility_call_muted" msgid="2776111226185342220">"Call muted."</string>
+ <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Speakerphone enabled."</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Can\'t talk now. What\'s up?"</string>
+ <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"I\'ll call you right back."</string>
+ <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"I\'ll call you later."</string>
+ <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Can\'t talk now. Call me later?"</string>
+ <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Quick responses"</string>
+ <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit quick responses"</string>
+ <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
+ <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Quick response"</string>
+ <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Message sent to <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
+ <string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Only emergency calls are allowed by the device owner"</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"To place a call, enter a valid number."</string>
+ <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Call cannot be added at this time."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Please disable TTY Mode to make video calls."</string>
+ <string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
+ <string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
+ <string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
+</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index ae6fbb4..97d4c9c 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Only emergency calls are allowed by the device owner"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"To place a call, enter a valid number."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Call cannot be added at this time."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Please disable TTY Mode to make video calls."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index ae6fbb4..97d4c9c 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Only emergency calls are allowed by the device owner"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"To place a call, enter a valid number."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Call cannot be added at this time."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Please disable TTY Mode to make video calls."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4ca4e93..3b6bd73 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"El propietario del dispositivo solo permite las llamadas de emergencia."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Para realizar una llamada, ingresa un número válido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"No se puede agregar la llamada en este momento."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Inhabilita el modo TTY para realizar una videollamada."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Falta el número de correo de voz"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"No hay un número de correo de voz almacenado en la tarjeta SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Agregar número"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 7fc0f9c..7287095 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"El propietario del dispositivo solo permite llamadas de emergencia"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Para realizar una llamada, introduce un número válido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"No se puede añadir la llamada en este momento."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Inhabilita el modo TTY para hacer videollamadas."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Falta el número del buzón de voz."</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"No se ha almacenado ningún número de buzón de voz en la tarjeta SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Añadir número"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index b101f26..47627f8 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Seadme omanik lubab ainult hädaabikõnesid"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Helistamiseks sisestage kehtiv number."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Kõnet ei saa praegu lisada."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Videokõnede tegemiseks keelake TTY-režiim."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Puudub kõnepostinumber"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM-kaardile pole salvestatud ühtegi kõnepostinumbrit."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Lisa number"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 8450649..e35b3fe 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Gailuaren jabeak larrialdi-deiak bakarrik egitea onartzen du"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Deitzeko, idatzi balio duen zenbaki bat."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Une honetan ezin da deirik gehitu."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Desgaitu TTY modua bideo-deiak egiteko."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Erantzungailuaren zenbakia falta da"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Ez da erantzungailuaren zenbakirik gorde SIM txartelean."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Gehitu zenbakia"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index a0ba00b..61d4ae1 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"مالک دستگاه فقط تماسهای اضطراری را مجاز کرده است"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"برای برقراری تماس، یک شماره معتبر وارد کنید."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"در این زمان نمیتوان تماسی اضافه کرد."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"لطفاً حالت TTY را برای برقراری تماسهای ویدیویی غیرفعال کنید."</string>
<string name="no_vm_number" msgid="4164780423805688336">"عدم وجود شماره پست صوتی"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"شماره پست صوتی در سیم کارت ذخیره نشده است."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"افزودن شماره"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 93f268e..1ff2b0b 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Laitteen omistaja on sallinut vain hätäpuhelut"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Soita antamalla kelvollinen numero."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Puhelua ei voi lisätä juuri nyt."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Poista TTY-tila käytöstä, jos haluat soittaa videopuheluita."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Puhelinvastaajan numero puuttuu"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM-kortille ei ole tallennettu puhelinvastaajan numeroa."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Lisää numero"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 0d0ab25..1aa0bdb 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Seuls les appels d\'urgence sont autorisés par le propriétaire de l\'appareil"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Pour faire un appel, entrez un numéro valide."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Impossible d\'ajouter l\'appel pour le moment."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Veuillez désactiver le mode ATS pour faire un appel vidéo."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Numéro de messagerie vocale manquant"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Aucun numéro de messagerie vocale n\'est enregistré sur la carte SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Ajouter un numéro"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 7983939..f5f8afd 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Le propriétaire de l\'appareil n\'autorise que les appels d\'urgence."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Pour émettre un appel, veuillez saisir un numéro valide."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Impossible d\'ajouter un appel pour le moment."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Veuillez désactiver le mode TTY pour passer des appels vidéo."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Numéro de messagerie vocale manquant"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Aucun numéro de messagerie vocale n\'est enregistré sur la carte SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Ajouter un numéro"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 0dba5fc..628caa9 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"O propietario do dispositivo só permite as chamadas de emerxencia"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Para realizar unha chamada, introduce un número válido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Neste momento non se pode engadir a chamada."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Desactiva o modo TTY para realizar videochamadas."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Falta o número de correo de voz"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Non hai ningún número de correo de voz almacenado na tarxeta SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Engadir número"</string>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
new file mode 100644
index 0000000..8d0ad60
--- /dev/null
+++ b/res/values-gu-rIN/strings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+ -->
+
+<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="3477737022166975496">"ફોન"</string>
+ <string name="unknown" msgid="6878797917991465859">"અજાણ્યું"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"છૂટેલો કૉલ"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"છૂટેલા કૉલ્સ"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> છૂટેલા કૉલ્સ"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> નો કૉલ ચૂકી ગયાં"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"કૉલ બેક"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"સંદેશ"</string>
+ <string name="accessibility_call_muted" msgid="2776111226185342220">"કૉલ મ્યૂટ કરેલ છે."</string>
+ <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"સ્પીકરફોન પસંદ કરેલ છે."</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"હમણાં વાત કરી શકાતી નથી. શું ચાલે છે?"</string>
+ <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"હું તરત જ પાછો કૉલ કરીશ."</string>
+ <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"હું પછીથી કૉલ કરીશ."</string>
+ <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"હમણાં વાત કરી શકાતી નથી. મને પછીથી કૉલ કરી શકશો?"</string>
+ <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ઝડપી પ્રતિસાદ"</string>
+ <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ઝડપી પ્રતિસાદ સંપાદિત કરો"</string>
+ <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
+ <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"ઝડપી પ્રતિસાદ"</string>
+ <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> પર સંદેશ મોકલ્યો."</string>
+ <string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ઉપકરણના માલિક દ્વારા ફક્ત કટોકટીના કૉલ્સને મંજૂરી અપાયેલ છે"</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"કૉલ કરવા માટે, માન્ય નંબર દાખલ કરો."</string>
+ <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"આ સમયે કૉલ ઉમેરી શકાતો નથી."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"કૃપા કરીને વિડિઓ કૉલ્સ કરવા માટે TTY મોડ અક્ષમ કરો."</string>
+ <string name="no_vm_number" msgid="4164780423805688336">"વૉઇસમેઇલ નંબર ખૂટે છે"</string>
+ <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM કાર્ડ પર કોઈ વૉઇસમેઇલ નંબર સંગ્રહિત નથી."</string>
+ <string name="add_vm_number_str" msgid="4676479471644687453">"નંબર ઉમેરો"</string>
+</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 802c206..760fe63 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"डिवाइस स्वामी द्वारा केवल आपातकालीन कॉल करने की अनुमति है"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"कॉल करने के लिए, मान्य नंबर डालें."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"इस समय कॉल नहीं जोड़ा जा सकता."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"कृपया वीडियो कॉल करने के लिए TTY मोड अक्षम करें."</string>
<string name="no_vm_number" msgid="4164780423805688336">"गुम वॉयस मेल नंबर"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"सिम कार्ड पर कोई वॉयस मेल नंबर संग्रहीत नहीं है."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"नंबर जोड़ें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index af4b0c0..5242229 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Vlasnik uređaja dopušta samo hitne pozive"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Unesite važeći broj da biste uspostavili poziv."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Poziv trenutačno nije moguć."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Onemogućite TTY način da biste omogućili videopozive."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nedostaje broj govorne pošte"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Na SIM kartici nije spremljen broj govorne pošte."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj broj"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index eb6e388..69fb335 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Az eszköz tulajdonosa csak a segélyhívásokat engedélyezte"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Hívásindításhoz adjon meg egy érvényes számot."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Jelenleg nem lehet videohívást hozzáadni."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Videohívások indításához kapcsolja ki a TTY módot."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Hiányzik a hangposta száma"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Nincs hangpostaszám a SIM kártyán."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Szám hozzáadása"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 3879e04..c38c6fc 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Սարքի սեփականատերը թույլատրում է միայն արտակարգ իրավիճակի զանգերը"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Զանգ կատարելու համար մուտքագրեք ճիշտ համար:"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Հնարավոր չէ ևս մեկ զանգ ավելացնել այս պահին:"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Տեսազանգեր կատարելու համար անջատեք TTY ռեժիմը:"</string>
<string name="no_vm_number" msgid="4164780423805688336">"Բացակայում է ձայնային փոստի համարը"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM քարտում ձայնային փոստի ոչ մի համար գրանցված չէ:"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Ավելացնել համար"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index fac45f3..7ad8e00 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Hanya panggilan darurat yang diizinkan oleh pemilik perangkat"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Untuk melakukan panggilan telepon, masukkan nomor yang valid."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Panggilan tidak dapat ditambahkan untuk saat ini."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Nonaktifkan Mode TTY untuk melakukan panggilan video."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nomor kotak pesan hilang"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Tidak ada nomor kotak pesan tersimpan pada kartu SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Tambahkan nomor"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 1862dac..13827b9 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Eigandi tækisins leyfir aðeins neyðarsímtöl"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Sláðu inn gilt númer til að hringja símtal."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Ekki er hægt að bæta símtali við sem stendur."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Slökktu á fjarritastillingu til að hringja myndsímtöl."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Talhólfsnúmer vantar"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Ekkert talhólfsnúmer er vistað á SIM-kortinu."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Bæta númeri við"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 584bbad..0505e37 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Il proprietario del dispositivo consente soltanto chiamate di emergenza"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Per effettuare una chiamata, inserisci un numero valido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Al momento non è possibile aggiungere la chiamata."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Per poter fare videochiamate devi disattivare la modalità TTY."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Numero segreteria mancante"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Nessun numero di segreteria presente nella SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Aggiungi numero"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 64e44bf..d8bdb1e 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"בעלי המכשיר מתיר לבצע שיחות חירום בלבד"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"כדי להתקשר, הזן מספר טלפון חוקי."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"לא ניתן כעת להוסיף את השיחה."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"השבת את מצב TTY כדי לבצע שיחות וידאו."</string>
<string name="no_vm_number" msgid="4164780423805688336">"חסר מספר של דואר קולי"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"בכרטיס ה-SIM לא מאוחסן מספר של דואר קולי."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"הוסף מספר"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 10b9087..551f281 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"端末の所有者に許可されているのは緊急通報のみです。"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"発信するには、有効な番号を入力してください。"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"通話は現在追加できません。"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ビデオハングアウトを行うにはTTYモードを無効にしてください。"</string>
<string name="no_vm_number" msgid="4164780423805688336">"ボイスメール番号がありません"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIMカードにボイスメールの番号がありません。"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"番号を追加"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 4cb2256..ac1c20b 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"მოწყობილობის მფლობელის მიერ ნებადართულია მხოლოდ საგანგებო ზარების განხორციელება"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ზარის განხორციელებისათვის, შეიყვანეთ მოქმედი ნომერი."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ამ ეტაპზე ზარის დამატება ვერ ხერხდება."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ვიდეოზარების განხორციელებისათვის, გთხოვთ, გამორთოთ TTY რეჟიმი"</string>
<string name="no_vm_number" msgid="4164780423805688336">"ხმოვანი ფოსტის ნომერი არ არის"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM ბარათზე ხმოვანი ფოსტის ნომერი შენახული არ არის."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"ნომრის დამატება"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 064d563..89be55c 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Құрылғы иесі тек жедел қоңырауларға рұқсат еткен"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Қоңырау шалу үшін жарамды нөмірді енгізіңіз."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Қоңырауды қазіргі уақытта қосу мүмкін емес."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Бейне қоңырау шалу үшін Телетайп режимін өшіріңіз."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Дауыс хабарының нөмірі жоқ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM картасында ешқандай дауыс хабарының нөмірі сақталмаған."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Нөмір қосу"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index b5fb8eb..1a019e8 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ការហៅពេលមានអាសន្នដែលត្រូវបានអនុញ្ញាតដោយម្ចាស់ឧបករណ៍តែប៉ុណ្ណោះ។"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ដើម្បីធ្វើការហៅ បញ្ចូលលេខដែលមានសុពលភាព។"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"មិនអាចបន្ថែមនៅពេលនេះបានទេ។"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"សូមបិទដំណើរការរបៀប TTY ដើម្បីធ្វើការហៅជាវីដេអូ។"</string>
<string name="no_vm_number" msgid="4164780423805688336">"បាត់ចំនួនសារជាសំឡេង"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"គ្មានចំនួនសារជាសំឡេងត្រូវបានរក្សាទុកនៅលើស៊ីមកាតទេ។"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"បន្ថែមលេខ"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 6887fce..e84afc9 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ಸಾಧನದ ಮಾಲೀಕರಿಂದ ತುರ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ಮಾತ್ರ ಅವಕಾಶವಿದೆ"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ಕರೆಯನ್ನು ಮಾಡಲು, ಮಾನ್ಯವಾದ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ಕರೆಯನ್ನು ಈ ಸಮಯದಲ್ಲಿ ಸೇರಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ವೀಡಿಯೊ ಕರೆಗಳನ್ನು ಮಾಡಲು TTY ಮೋಡ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string>
<string name="no_vm_number" msgid="4164780423805688336">"ಧ್ವನಿಮೇಲ್ ಸಂಖ್ಯೆಯು ಕಾಣೆಯಾಗಿದೆ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಯಾವುದೇ ಧ್ವನಿಮೇಲ್ ಸಂಖ್ಯೆಯನ್ನು ಸಂಗ್ರಹಿಸಿಲ್ಲ."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 66c0131..efb59cd 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"기기 소유자만 긴급 전화를 사용할 수 있습니다."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"전화를 걸려면 올바른 번호를 입력하세요."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"현재 통화를 추가할 수 없습니다."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"화상 통화를 하려면 TTY 모드를 중지하세요."</string>
<string name="no_vm_number" msgid="4164780423805688336">"음성사서함 번호 없음"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 카드에 저장된 음성사서함 번호가 없습니다."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"번호 추가"</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 253d7ab..6b5e9c3 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -47,6 +47,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Түзмөк ээси шашылыш чалууларга гана уруксат берген"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Чалуу үчүн, жарактуу номер киргизиңиз."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Бул жолу чалууну кошуу мүмкүн эмес."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Видео чалууларды аткаруу үчүн Телетайп түзмөк режимин өчүрүңүз."</string>
<!-- no translation found for no_vm_number (4164780423805688336) -->
<skip />
<!-- no translation found for no_vm_number_msg (1300729501030053828) -->
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index a6e3ffb..52479c3 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ພຽງແຕ່ການໂທສຸກເສີນທີ່ໄດ້ຮັບອະນຸຍາດຈາກເຈົ້າຂອງອຸປະກອນເທົ່ານັ້ນ"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ເພື່ອທີ່ຈະໂທ, ປ້ອນເບີໂທທີ່ໃຊ້ໄດ້ເຂົ້າໄປ."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ບໍ່ສາມາດເພີ່ມການໂທໄດ້ໃນເວລານີ້."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ກະລຸນາປິດໃຊ້ງານໂໝດ TTY ເພື່ອໂທວິດີໂອ."</string>
<string name="no_vm_number" msgid="4164780423805688336">"ບໍ່ມີເບີຂໍ້ຄວາມສຽງ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"ບໍ່ມີເບີຂໍ້ຄວາມສຽງຖືກບັນທຶກໃນ SIM card."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"ເພີ່ມໝາຍເລກ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 6a52bb8..8b0f066 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Įrenginio savininkas leidžia skambinti tik pagalbos numeriais"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Kad galėtumėte paskambinti, įveskite tinkamą numerį."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Šiuo metu dar vieno skambučio atlikti negalima."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Išjunkite TTY režimą, kad galėtumėte atlikti vaizdo skambučius."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Trūksta balso pašto numerio"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kortelėje nėra išsaugoto balso pašto numerio."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Pridėti numerį"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 0c4e2e0..43f0027 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Ierīces īpašnieks ļauj veikt tikai ārkārtas zvanus."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Lai veiktu zvanu, ievadiet derīgu numuru."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Šobrīd nevar pievienot zvanu."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Lai veiktu videozvanus, lūdzu, atspējojiet teksta tālruņa režīmu."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Trūkst balss pasta numura"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartē neviens balss pasta numurs nav saglabāts."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Pievienot numuru"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 008a70f..9654e0b 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Дозволени се само итни повици од страна на сопственикот на уредот"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"За да повикате, внесете важечки број."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Повикот не може да се додаде во моментов."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Оневозможете го режимот TTY за да остварите видеоповици."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Недостасува број на говорна пошта"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Нема мемориран број на говорна пошта на СИМ картичката."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Додај број"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index d3b3b1c..38fc0e6 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ഉപകരണ ഉടമ അടിയന്തിര കോളുകൾ മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ഒരു കോൾ ചെയ്യുന്നതിന്, സാധുതയുള്ള നമ്പർ നൽകുക."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"കോൾ ഇപ്പോൾ ചേർക്കാനാകില്ല."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"വീഡിയോ കോളുകൾ നടത്താൻ TTY മോഡ് പ്രവർത്തനരഹിതമാക്കുക."</string>
<string name="no_vm_number" msgid="4164780423805688336">"വോയ്സ്മെയിൽ നമ്പർ കാണുന്നില്ല"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"സിം കാർഡിൽ വോയ്സ്മെയിൽ നമ്പറൊന്നും സംഭരിച്ചിട്ടില്ല."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"നമ്പർ ചേർക്കുക"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 7b3c734..828f347 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Энэхүү төхөөрөмжийн эзэмшигч нь зөвхөн түргэн тусламжийн дуудлага хийх эрхтэй байна."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Дуудлага хийхийн тулд хүчин төгөлдөр дугаар оруулна уу."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Одоо дуудлага нэмэх боломжгүй."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Видео дуудлага хийхийн тулд TTY горимыг идэвхгүй болгоно уу."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Дуут шуудангийн дугаар байхгүй"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM карт дээр дуут шуудангийн дугаар хадгалагдаагүй байна."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Дугаар нэмэх"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index 5b802d0..c7c795c 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"डिव्हाइस मालकाद्वारे केवळ आणीबाणी कॉलना अनुमती आहे"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"कॉल करण्यासाठी, एक वैध नंबर प्रविष्ट करा."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"यावेळी कॉल जोडला जाऊ शकत नाही."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"कृपया व्हिडिओ कॉल करण्यासाठी TTY मोड अक्षम करा."</string>
<string name="no_vm_number" msgid="4164780423805688336">"व्हॉइसमेल नंबर गहाळ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"सिम कार्डवर कोणताही व्हॉइसमेल नंबर संचयित केला नाही."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"नंबर जोडा"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 82f34a4..dc15ef3 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Hanya panggilan kecemasan dibenarkan oleh pemilik peranti"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Untuk membuat panggilan, masukkan nombor yang sah."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Panggilan tidak boleh ditambahkan pada masa ini."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Sila lumpuhkan Mod TTY untuk membuat panggilan video."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nombor mel suara tiada"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Tidak ada nombor mel suara disimpan pada kad SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Tambah nombor"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index b028ed5..2bb5771 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"အရေးပေါ်ဖုန်းများကိုသာ ခေါ်ဆိုနိုင်ရန် စက်ကိရိယာပိုင်ရှင်က ခွင့်ပြုထား၏"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ဖုန်းခေါ်ရန်အတွက်၊ သင့်လျော်သည့်နံပါတ် ရိုက်ထည့်ပါ။"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ဗွီဒီယိုခေါ်နေစဉ် ထပ်ခေါ်မရပါ။"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ဗီဒီယိုခေါ်ဆိုမှုများ ပြုလုပ်ရန် ကျေးဇူးပြု၍ TTY မုဒ်ကို ပိတ်ထားပါ။"</string>
<string name="no_vm_number" msgid="4164780423805688336">"အသံစာပို့စနစ် နံပါတ် ပျောက်နေပါသည်"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"ဆင်းမ်ကဒ်ပေါ်တွင် အသံစာပို့စနစ် နံပါတ် သိမ်းဆည်ထားခြင်း မရှိပါ"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"နံပါတ်ထပ်ထည့်ရန်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 92d9061..c28a01d 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Eieren av enheten tillater bare nødanrop"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Skriv inn et gyldig nummer for å plassere en samtale."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Anrop kan ikke legges til akkurat nå."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Slå av TTY-modus for å starte videosamtaler."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Mangler nummer til telefonsvarer"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Det er ikke lagret noe telefonsvarernummer på SIM-kortet."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Legg til nummer"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index cc91f33..1cac5f6 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"केवल आपतकालीन कलहरू मात्र यन्त्र मालिकद्वारा अनुमति दिइएको छ"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"एक कल गर्नको लागि, एक वैध नम्बर प्रविष्ट गर्नुहोस्।"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"यस समयमा कल थप गर्न सकिँदैन।"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"कृपया भिडियो कलहरू गर्न TTY मोड निष्क्रिय गर्नुहोस्।"</string>
<string name="no_vm_number" msgid="4164780423805688336">"भ्वाइसमेल नम्बर हराइरहेको छ"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM कार्डमा कुनै पनि भ्वाइसमेल नम्बर भण्डारण भएको छैन।"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"नम्बर थप्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index e726f49..b762e9a 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Alleen noodoproepen zijn toegestaan door de apparaateigenaar"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Als u wilt bellen, moet u een geldig nummer invoeren."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Oproep kan momenteel niet worden toegevoegd."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Schakel de TTY-modus uit om videogesprekken te voeren."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Voicemailnummer ontbreekt"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Er is geen voicemailnummer op de SIM-kaart opgeslagen."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Nummer toevoegen"</string>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
new file mode 100644
index 0000000..9e5cf0c
--- /dev/null
+++ b/res/values-pa-rIN/strings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+ -->
+
+<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="3477737022166975496">"ਫੋਨ"</string>
+ <string name="unknown" msgid="6878797917991465859">"ਅਗਿਆਤ"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"ਮਿਸਡ ਕਾਲ"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"ਮਿਸਡ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ਮਿਸਡ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> ਵੱਲੋਂ ਮਿਸਡ ਕਾਲ"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ਕਾਲ ਬੈਕ ਕਰੋ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"ਸੁਨੇਹਾ"</string>
+ <string name="accessibility_call_muted" msgid="2776111226185342220">"ਕਾਲ ਮਿਊਟ ਕੀਤੀ।"</string>
+ <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"ਸਪੀਕਰਫੋਨ ਸਮਰਥਿਤ।"</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਕੀ ਹੋ ਰਿਹਾ ਹੈ?"</string>
+ <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ਮੈਂ ਤੁਹਾਨੂੰ ਹੁਣੇ ਵਾਪਸ ਕਾਲ ਕਰਾਂਗਾ।"</string>
+ <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ਮੈਂ ਤੁਹਾਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕਾਲ ਕਰਾਂਗਾ।"</string>
+ <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਕੀ ਮੈਨੂੰ ਬਾਅਦ ਵਿੱਚ ਫੋਨ ਕਰ ਸਕਦੇ ਹੋ?"</string>
+ <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ਤਤਕਾਲ ਜਵਾਬ"</string>
+ <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ਤਤਕਾਲ ਜਵਾਬ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
+ <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
+ <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"ਤਤਕਾਲ ਜਵਾਬ"</string>
+ <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"ਸੁਨੇਹਾ <xliff:g id="PHONE_NUMBER">%s</xliff:g> ਨੂੰ ਭੇਜਿਆ ਗਿਆ।"</string>
+ <string name="outgoing_call_not_allowed" msgid="1435394568102165287">"ਡਿਵਾਈਸ ਦੇ ਮਾਲਕ ਵੱਲੋਂ ਕੇਵਲ ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ ਦੀ ਆਗਿਆ ਹੈ।"</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਇੱਕ ਪ੍ਰਮਾਣਿਕ ਨੰਬਰ ਦਰਜ ਕਰੋ।"</string>
+ <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ਇਸ ਵੇਲੇ ਕਾਲ ਨਹੀਂ ਜੋੜੀ ਸਕਦੀ।"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"ਕਿਰਪਾ ਕਰਕੇ ਵੀਡੀਓ ਕਾਲਾਂ ਨੂੰ ਕਰਨ ਲਈ TTY ਮੋਡ ਅਸਮਰਥਿਤ ਕਰੋ."</string>
+ <string name="no_vm_number" msgid="4164780423805688336">"ਲੁਪਤ ਵੌਇਸਮੇਲ ਨੰਬਰ"</string>
+ <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM ਕਾਰਡ ਤੇ ਕੋਈ ਵੌਇਸਮੇਲ ਨੰਬਰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।"</string>
+ <string name="add_vm_number_str" msgid="4676479471644687453">"ਨੰਬਰ ਜੋੜੋ"</string>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 9d48689..515190c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Właściciel urządzenia zezwala tylko na połączenia alarmowe"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Aby zadzwonić, wybierz prawidłowy numer."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Nie można w tej chwili dodać połączenia."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Wyłącz tryb TTY, by korzystać z rozmów wideo."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Brakuje numeru poczty głosowej"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Na karcie SIM nie ma zapisanego numeru poczty głosowej."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj numer"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 2d2d4b9..d16d6d1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Só são permitidas chamadas de emergência pelo proprietário do dispositivo"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Para telefonar, introduza um número válido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Não é possível adicionar a chamada neste momento."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Desative o modo teletipo para efetuar videochamadas."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Número do correio de voz em falta"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Não existe um número de correio de voz armazenado no cartão SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 8a8b7f7..0c5f2dc 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Apenas chamadas de emergência são permitidas pelo proprietário do dispositivo"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Para realizar uma chamada, digite um número válido."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"No momento, não é possível adicionar a chamada."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Desative o modo TTD para realizar vídeo chamadas."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Número correio de voz ausente"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Não há um número correio de voz armazenado no cartão SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 170d4f2..090451e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Proprietarul dispozitivului permite numai apelurile de urgență"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Pentru a apela, introduceți un număr valid."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Apelul nu poate fi adăugat în acest moment."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Dezactivați modul TTY pentru a iniția apeluri video."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Lipseşte numărul mesageriei vocale"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Niciun număr de mesagerie vocală nu este stocat pe cardul SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Adăugaţi numărul"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 26437e7..0145c3b 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Владелец устройства разрешил только экстренные вызовы"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Недействительный номер."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Невозможно позвонить в данный момент"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Чтобы делать видеозвонки, отключите режим телетайпа"</string>
<string name="no_vm_number" msgid="4164780423805688336">"Не указан номер голосовой почты"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карте нет ни одного номера голосовой почты."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Добавить номер"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 159cc40..b8f7bc4 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"උපාංගයේ හිමිකරු විසින් හදිස්සි ඇමතුම් වලට පමණක් අවසර දෙයි"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"ඇමතුමක් ලබාගැනීමට, වලංගු අංකයක් ලබාගන්න."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"මේ වේලාවේ ඇමතුම එකතු කළ නොහැක."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"වීඩියෝ ඇමතුම් ලබා ගැනීමට කරුණාකර TTY මෝඩය අබල කරන්න."</string>
<string name="no_vm_number" msgid="4164780423805688336">"හඬ තැපැල් අංකය නැත"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM කාඩ් පතෙහි හඬ තැපැල් අංකයක් ආචිත වී නැත."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"අංකයක් එක් කරන්න"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 7fb63b1..030d517 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Vlastník zariadenia povolil iba tiesňové volania."</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Ak chcete volať, zadajte platné číslo"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Hovor momentálne nie je možné pridať."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Ak chcete uskutočňovať videohovory, deaktivujte režim TTY."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Chýba číslo hlasovej schránky"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Na karte SIM nie je uložené žiadne číslo hlasovej schránky."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Pridať číslo"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index ec6df19..51f9de5 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Lastnik naprave dovoljuje samo opravljanje klicev v sili"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Če želite opraviti klic, vnesite veljavno številko."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Klica trenutno ni mogoče dodati."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Če želite opravljati videoklice, onemogočite način TTY."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Manjkajoča številka glasovne pošte"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Na kartici SIM ni shranjena številka glasovne pošte."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj številko"</string>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
new file mode 100644
index 0000000..75361a8
--- /dev/null
+++ b/res/values-sq-rAL/strings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+ -->
+
+<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="3477737022166975496">"Telefoni"</string>
+ <string name="unknown" msgid="6878797917991465859">"I panjohur"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Telefonatë e humbur"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Telefonata të humbura"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> telefonata të humbura"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Telefonatë e humbur nga <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Ri-telefono"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesazh"</string>
+ <string name="accessibility_call_muted" msgid="2776111226185342220">"Telefonata kaloi në heshtje."</string>
+ <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Altoparlanti u aktivizua."</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Nuk flas dot tani. Si është puna?"</string>
+ <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Do të të telefonoj menjëherë."</string>
+ <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Do të të telefonoj më vonë."</string>
+ <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nuk mund të flas tani. Do më telefonosh më vonë?"</string>
+ <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Përgjigje të shpejta"</string>
+ <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redakto përgjigjet e shpejta"</string>
+ <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
+ <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Përgjigje e shpejtë"</string>
+ <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Mesazhi u dërgua te <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
+ <string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Vetëm telefonatat e urgjencës lejohen nga zotëruesi i pajisjes"</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Për të kryer një telefonatë, fut një numër të vlefshëm."</string>
+ <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Telefonata nuk mund të shtohet këtë herë."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Çaktivizo modalitetin TTY për të kryer telefonata me video."</string>
+ <string name="no_vm_number" msgid="4164780423805688336">"Mungon numri i postës zanore"</string>
+ <string name="no_vm_number_msg" msgid="1300729501030053828">"Nuk ka numër të ruajtur në kartën SIM."</string>
+ <string name="add_vm_number_str" msgid="4676479471644687453">"Shto numër"</string>
+</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index a93b09d..36d967c 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Власник уређаја је дозволио само хитне позиве"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Да бисте упутили позив, унесите важећи број."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Тренутно није могуће додати позив."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Онемогућите TTY режим да бисте упућивали видео позиве."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Недостаје број за говорну пошту"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Није ускладиштен ниједан број говорне поште на SIM картици."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Додај број"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index c25b40b..a2fa42d 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Endast nödsamtal är tillåtna av enhetens ägare"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Ange ett giltigt nummer om du vill ringa ett samtal."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Det går inte att lägga till samtalet just nu."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Inaktivera texttelefonläget om du vill ringa videosamtal."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nummer till röstbrevlåda saknas"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Det finns inget nummer till röstbrevlådan sparat på SIM-kortet."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Lägg till nummer"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 1c01fb7..9e71c93 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Ni simu za dharura pekee zinazoruhusiwa na mmiliki wa kifaa"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Ili upige simu, weka nambari sahihi."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Hangout ya video haiwezi kuongezwa kwa wakati huu."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Tafadhali zima Hali ya TTY ili uanzishe Hangout ya video."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nambari ya sauti inayokosekana"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Hakuna nambari ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Ongeza nambari"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 98157c6..190cd0c 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"சாதன உரிமையாளர் அவசர அழைப்புகளை மட்டுமே அனுமதித்துள்ளார்"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"அழைக்க, சரியான எண்ணை உள்ளிடவும்."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"இப்போது அழைக்க முடியாது."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"வீடியோ அழைப்புகளை மேற்கொள்ள, TTY பயன்முறையை முடக்கவும்."</string>
<string name="no_vm_number" msgid="4164780423805688336">"குரலஞ்சல் எண் இல்லை"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"சிம் கார்டில் குரலஞ்சலுக்கான எண் எதுவும் சேமிக்கப்படவில்லை."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"எண்ணைச் சேர்"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 31b5273..ee0c5b5 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"పరికరం యజమాని అత్యవసర కాల్లను మాత్రమే అనుమతించారు"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"కాల్ చేయడానికి, చెల్లుబాటు అయ్యే నంబర్ను నమోదు చేయండి."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ఈ సమయంలో కాల్ను జోడించడం సాధ్యపడదు."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"దయచేసి వీడియో కాల్లు చేయడానికి TTY మోడ్ నిలిపివేయండి."</string>
<string name="no_vm_number" msgid="4164780423805688336">"వాయిస్ మెయిల్ నంబర్ లేదు"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"సిమ్ కార్డులో వాయిస్ మెయిల్ నంబర్ ఏదీ నిల్వ చేయబడలేదు."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"నంబర్ను జోడించు"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index b936083..2babae6 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"เจ้าของอุปกรณ์อนุญาตเฉพาะหมายเลขฉุกเฉิน"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"หากต้องการโทรออก โปรดป้อนหมายเลขที่ถูกต้อง"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"ไม่สามารถเพิ่มสายได้ในขณะนี้"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"โปรดปิดใช้โหมด TTY เพื่อแฮงเอาท์วิดีโอ"</string>
<string name="no_vm_number" msgid="4164780423805688336">"ไม่มีหมายเลขข้อความเสียง"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"ไม่มีหมายเลขข้อความเสียงจัดเก็บอยู่ในซิมการ์ด"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"เพิ่มหมายเลข"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 81d05b7..ca749b4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Ang mga emergency na tawag lang ang pinapayagan ng may-ari ng device"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Upang tumawag, maglagay ng wastong numero."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Hindi maidadagdag ang tawag sa oras na ito."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Paki-disable ang TTY Mode upang makapag-video call."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Nawawala ang numero ng voicemail"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Walang nakaimbak na numero ng voicemail sa SIM card."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Magdagdag ng numero"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 00169e4..662c3fd 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Cihaz sahibi sadece acil durum çağrılarına izin veriyor"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Telefon etmek için geçerli bir numara girin."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Çağrı şu anda eklenemiyor."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Video görüşmesi yapmak için lütfen TTY Modu\'nu devre dışı bırakın."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Eksik sesli mesaj numarası"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartta depolanan sesli mesaj numarası yok."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Numara ekle"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index e2494d2..16214b4 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Власник пристрою дозволив лише екстрені виклики"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Щоб зателефонувати, введіть дійсний номер."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Зараз не можна почати дзвінок."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Щоб здійснювати відеодзвінки, вимкніть режим TTY."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Відстун. номер голос. пошти"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карті немає збереж. номерів голос. пошти."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Додати номер"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index c2503e3..ef9b16a 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"آلہ کے مالک نے صرف ہنگامی کالز کی اجازت دی ہے۔"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"کال کرنے کیلئے، ایک درست نمبر درج کریں۔"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"اس وقت کال شامل نہیں کی جا سکتی ہے۔"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"براہ کرم ویڈیو کالز کرنے کیلئے TTY وضع غیر فعال کریں۔"</string>
<string name="no_vm_number" msgid="4164780423805688336">"صوتی میل نمبر درج نہیں ہے"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM کارڈ پر کوئی بھی صوتی میل نمبر اسٹور نہیں ہے۔"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"نمبر شامل کریں"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index e2f370d..1cd5da6 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Qurilma egasi faqat favqulodda qo‘ng‘iroqlarga ruxsat bergan"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Hozirgi vaqtda qo‘ng‘iroq qo‘shib bo‘lmaydi."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Video qo\'ng\'iroqlarni amalga oshirish uchun TTY rejimini o‘chirib qo‘yish kerak"</string>
<string name="no_vm_number" msgid="4164780423805688336">"Javobsiz ovozli xabar raqami"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartada birorta ham ovozli xabar saqlanmagan."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Raqam qo‘shish"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 68c794e..3b7e1b4 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Chỉ chủ sở hữu thiết bị mới được phép thực hiện cuộc gọi khẩn cấp"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Để thực hiện cuộc gọi, hãy nhập một số hợp lệ."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Không thể thêm cuộc gọi tại thời điểm này."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Vui lòng tắt Chế độ TTY để thực hiện cuộc gọi điện video."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Thiếu số thư thoại"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Không có số thư thoại nào được lưu trữ trên thẻ SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Thêm số điện thoại"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8a62ae2..2d06096 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"设备机主仅允许拨打紧急呼救电话"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"要拨打电话,请输入有效的电话号码。"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"目前无法添加通话。"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"要进行视频通话,请停用 TTY 模式。"</string>
<string name="no_vm_number" msgid="4164780423805688336">"缺少语音信箱号码"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM卡上未存储语音信箱号码。"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"添加号码"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index c05d3c9..c00d0b4 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"只有裝置擁有者才可撥打緊急電話"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"要撥打電話,請輸入有效的號碼。"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"目前無法新增視像通話。"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"請停用 TTY 模式以進行視像通話。"</string>
<string name="no_vm_number" msgid="4164780423805688336">"未填留言信箱號碼"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡中沒有儲存任何留言信箱號碼。"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"新增電話號碼"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index bb0d95e..231d938 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"裝置擁有者限定只能撥打緊急電話"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"如要撥打電話,請輸入有效的號碼。"</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"目前無法新增通話。"</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"如要進行視訊通話,請停用 TTY 模式。"</string>
<string name="no_vm_number" msgid="4164780423805688336">"遺失語音信箱號碼"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡中未儲存語音信箱號碼。"</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"新增號碼"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 222378d..acb00f3 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -38,6 +38,7 @@
<string name="outgoing_call_not_allowed" msgid="1435394568102165287">"Amakholi wesimo esiphuthumayo kuphela avunyelwe ngumnikazi wedivayisi"</string>
<string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Ukuze wenze ikholi, faka inombolo evumelekile."</string>
<string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Ikholi ayikwazi ukungezwa ngalesi sikhathi."</string>
+ <string name="video_call_not_allowed_if_tty_enabled" msgid="7593649283571253283">"Sicela ukhubaze imodi ye-TTY ukuze wenze amakholi wevidiyo."</string>
<string name="no_vm_number" msgid="4164780423805688336">"Inombolo engekho yomyalezo wezwi"</string>
<string name="no_vm_number_msg" msgid="1300729501030053828">"Ayikho inombolo yomlayezo wezwi egcinwe ekhadini le-SIM."</string>
<string name="add_vm_number_str" msgid="4676479471644687453">"Engeza inombolo"</string>
diff --git a/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java b/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
index fe9ddd1..0dec0f4 100644
--- a/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
+++ b/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
@@ -27,7 +27,6 @@
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
-import android.telecom.CallState;
import android.telecom.Connection;
import android.telecom.PhoneAccount;
import android.telephony.PhoneNumberUtils;
@@ -699,7 +698,7 @@
case CallState.ABORTED:
case CallState.DISCONNECTED:
case CallState.CONNECTING:
- case CallState.PRE_DIAL_WAIT:
+ case CallState.SELECT_PHONE_ACCOUNT:
return CALL_STATE_IDLE;
case CallState.ACTIVE:
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 9c1e74c..8863215 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -25,7 +25,6 @@
import android.os.Looper;
import android.os.Trace;
import android.provider.ContactsContract.Contacts;
-import android.telecom.CallState;
import android.telecom.DisconnectCause;
import android.telecom.Connection;
import android.telecom.GatewayInfo;
@@ -92,7 +91,6 @@
void onPhoneAccountChanged(Call call);
void onConferenceableCallsChanged(Call call);
boolean onCanceledViaNewOutgoingCallBroadcast(Call call);
- void onCallSubstateChanged(Call call);
}
public abstract static class ListenerBase implements Listener {
@@ -148,7 +146,6 @@
public boolean onCanceledViaNewOutgoingCallBroadcast(Call call) {
return false;
}
- public void onCallSubstateChanged(Call call) {}
}
private final OnQueryCompleteListener mCallerInfoQueryListener =
@@ -264,7 +261,7 @@
private DisconnectCause mDisconnectCause = new DisconnectCause(DisconnectCause.UNKNOWN);
/** Info used by the connection services. */
- private Bundle mExtras = Bundle.EMPTY;
+ private Bundle mExtras = new Bundle();
/** Set of listeners on this call.
*
@@ -312,15 +309,14 @@
private final Context mContext;
private final CallsManager mCallsManager;
private final TelecomSystem.SyncRoot mLock;
- private int mCallSubstate;
private final CallerInfoAsyncQueryFactory mCallerInfoAsyncQueryFactory;
private boolean mWasConferencePreviouslyMerged = false;
- // For conferences which support merge/swap at their level, we retain a notion of an active call.
- // This is used for BluetoothPhoneService. In order to support hold/merge, it must have the notion
- // of the current "active" call within the conference call. This maintains the "active" call and
- // switches every time the user hits "swap".
+ // For conferences which support merge/swap at their level, we retain a notion of an active
+ // call. This is used for BluetoothPhoneService. In order to support hold/merge, it must have
+ // the notion of the current "active" call within the conference call. This maintains the
+ // "active" call and switches every time the user hits "swap".
private Call mConferenceLevelActiveCall = null;
private boolean mIsLocallyDisconnecting = false;
@@ -367,6 +363,8 @@
mIsIncoming = isIncoming;
mIsConference = isConference;
maybeLoadCannedSmsResponses();
+
+ Log.event(this, Log.Events.CREATED);
}
/**
@@ -416,6 +414,10 @@
}
}
+ public void destroy() {
+ Log.event(this, Log.Events.DESTROYED);
+ }
+
/** {@inheritDoc} */
@Override
public String toString() {
@@ -426,7 +428,7 @@
- return String.format(Locale.US, "[%s, %s, %s, %s, %s, childs(%d), has_parent(%b), [%s], %d]",
+ return String.format(Locale.US, "[%s, %s, %s, %s, %s, childs(%d), has_parent(%b), [%s]]",
System.identityHashCode(this),
CallState.toString(mState),
component,
@@ -434,8 +436,7 @@
getVideoStateDescription(getVideoState()),
getChildCalls().size(),
getParentCall() != null,
- Connection.capabilitiesToString(getConnectionCapabilities()),
- getCallSubstate());
+ Connection.capabilitiesToString(getConnectionCapabilities()));
}
/**
@@ -526,6 +527,38 @@
setLocallyDisconnecting(false);
fixParentAfterDisconnect();
}
+
+ // Log the state transition event
+ String event = null;
+ switch (newState) {
+ case CallState.ACTIVE:
+ event = Log.Events.SET_ACTIVE;
+ break;
+ case CallState.CONNECTING:
+ event = Log.Events.SET_CONNECTING;
+ break;
+ case CallState.DIALING:
+ event = Log.Events.SET_DIALING;
+ break;
+ case CallState.DISCONNECTED:
+ event = Log.Events.SET_DISCONNECTED;
+ break;
+ case CallState.DISCONNECTING:
+ event = Log.Events.SET_DISCONNECTING;
+ break;
+ case CallState.ON_HOLD:
+ event = Log.Events.SET_HOLD;
+ break;
+ case CallState.SELECT_PHONE_ACCOUNT:
+ event = Log.Events.SET_SELECT_PHONE_ACCOUNT;
+ break;
+ case CallState.RINGING:
+ event = Log.Events.SET_RINGING;
+ break;
+ }
+ if (event != null) {
+ Log.event(this, event);
+ }
}
}
@@ -847,7 +880,6 @@
setRingbackRequested(connection.isRingbackRequested());
setIsVoipAudioMode(connection.getIsVoipAudioMode());
setStatusHints(connection.getStatusHints());
- setCallSubstate(connection.getCallSubstate());
mConferenceableCalls.clear();
for (String id : connection.getConferenceableConnectionIds()) {
@@ -907,6 +939,7 @@
} else {
Log.i(this, "Send playDtmfTone to connection service for call %s", this);
mConnectionService.playDtmfTone(this, digit);
+ Log.event(this, Log.Events.START_DTMF, Log.pii(digit));
}
}
@@ -918,6 +951,7 @@
Log.w(this, "stopDtmfTone() request on a call without a connection service.");
} else {
Log.i(this, "Send stopDtmfTone to connection service for call %s", this);
+ Log.event(this, Log.Events.STOP_DTMF);
mConnectionService.stopDtmfTone(this);
}
}
@@ -930,10 +964,12 @@
* Attempts to disconnect the call through the connection service.
*/
void disconnect(boolean wasViaNewOutgoingCallBroadcaster) {
+ Log.event(this, Log.Events.REQUEST_DISCONNECT);
+
// Track that the call is now locally disconnecting.
setLocallyDisconnecting(true);
- if (mState == CallState.NEW || mState == CallState.PRE_DIAL_WAIT ||
+ if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT ||
mState == CallState.CONNECTING) {
Log.v(this, "Aborting call %s", this);
abort(wasViaNewOutgoingCallBroadcaster);
@@ -956,7 +992,7 @@
if (mCreateConnectionProcessor != null &&
!mCreateConnectionProcessor.isProcessingComplete()) {
mCreateConnectionProcessor.abort();
- } else if (mState == CallState.NEW || mState == CallState.PRE_DIAL_WAIT
+ } else if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT
|| mState == CallState.CONNECTING) {
if (wasViaNewOutgoingCallBroadcaster) {
// If the cancelation was from NEW_OUTGOING_CALL, then we do not automatically
@@ -979,7 +1015,7 @@
handleCreateConnectionFailure(new DisconnectCause(DisconnectCause.CANCELED));
} else {
- Log.v(this, "Cannot abort a call which isn't either PRE_DIAL_WAIT or CONNECTING");
+ Log.v(this, "Cannot abort a call which is neither SELECT_PHONE_ACCOUNT or CONNECTING");
}
}
@@ -999,6 +1035,7 @@
// that the call is in a non-STATE_RINGING state before changing the UI. See
// {@link ConnectionServiceAdapter#setActive} and other set* methods.
mConnectionService.answer(this, videoState);
+ Log.event(this, Log.Events.REQUEST_ACCEPT);
}
}
@@ -1015,6 +1052,7 @@
// between the time the user hits 'reject' and Telecomm receives the command.
if (isRinging("reject")) {
mConnectionService.reject(this);
+ Log.event(this, Log.Events.REQUEST_REJECT);
}
}
@@ -1026,6 +1064,7 @@
if (mState == CallState.ACTIVE) {
mConnectionService.hold(this);
+ Log.event(this, Log.Events.REQUEST_HOLD);
}
}
@@ -1037,6 +1076,7 @@
if (mState == CallState.ON_HOLD) {
mConnectionService.unhold(this);
+ Log.event(this, Log.Events.REQUEST_UNHOLD);
}
}
@@ -1549,25 +1589,4 @@
}
return CallState.DISCONNECTED;
}
-
- /**
- * The current call substate.
- */
- public int getCallSubstate() {
- return mCallSubstate;
- }
-
-
- /**
- * Determines the current substate for the call.
- *
- * @param callSubstate The substate for the call.
- */
- public void setCallSubstate(int callSubstate) {
- mCallSubstate = callSubstate;
-
- for (Listener l : mListeners) {
- l.onCallSubstateChanged(this);
- }
- }
}
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index 037dd66..d8ebbc9 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -20,7 +20,6 @@
import android.media.AudioManager;
import android.os.Binder;
import android.telecom.AudioState;
-import android.telecom.CallState;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -31,13 +30,14 @@
* This class manages audio modes, streams and other properties.
*/
final class CallAudioManager extends CallsManagerListenerBase
- implements WiredHeadsetManager.Listener {
+ implements WiredHeadsetManager.Listener, DockManager.Listener {
private static final int STREAM_NONE = -1;
private final StatusBarNotifier mStatusBarNotifier;
private final AudioManager mAudioManager;
private final BluetoothManager mBluetoothManager;
private final WiredHeadsetManager mWiredHeadsetManager;
+ private final DockManager mDockManager;
private final CallsManager mCallsManager;
private AudioState mAudioState;
@@ -52,6 +52,7 @@
Context context,
StatusBarNotifier statusBarNotifier,
WiredHeadsetManager wiredHeadsetManager,
+ DockManager dockManager,
CallsManager callsManager) {
mStatusBarNotifier = statusBarNotifier;
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
@@ -60,6 +61,8 @@
mCallsManager = callsManager;
mWiredHeadsetManager.addListener(this);
+ mDockManager = dockManager;
+ mDockManager.addListener(this);
saveAudioState(getInitialAudioState(null));
mAudioFocusStreamType = STREAM_NONE;
@@ -177,6 +180,27 @@
setSystemAudioState(mAudioState.isMuted(), newRoute, calculateSupportedRoutes());
}
+ @Override
+ public void onDockChanged(boolean isDocked) {
+ // This can happen even when there are no calls and we don't have focus.
+ if (!hasFocus()) {
+ return;
+ }
+
+ if (isDocked) {
+ // Device just docked, turn to speakerphone. Only do so if the route is currently
+ // earpiece so that we dont switch out of a BT headset or a wired headset.
+ if (mAudioState.getRoute() == AudioState.ROUTE_EARPIECE) {
+ setAudioRoute(AudioState.ROUTE_SPEAKER);
+ }
+ } else {
+ // Device just undocked, remove from speakerphone if possible.
+ if (mAudioState.getRoute() == AudioState.ROUTE_SPEAKER) {
+ setAudioRoute(AudioState.ROUTE_WIRED_OR_EARPIECE);
+ }
+ }
+ }
+
void toggleMute() {
mute(!mAudioState.isMuted());
}
@@ -377,7 +401,7 @@
} else {
Call foregroundCall = getForegroundCall();
Call waitingForAccountSelectionCall = mCallsManager
- .getFirstCallWithState(CallState.PRE_DIAL_WAIT);
+ .getFirstCallWithState(CallState.SELECT_PHONE_ACCOUNT);
Call call = mCallsManager.getForegroundCall();
if (foregroundCall == null && call != null && call == mCallToSpeedUpMTAudio) {
requestAudioFocusAndSetMode(AudioManager.STREAM_VOICE_CALL,
diff --git a/src/com/android/server/telecom/CallIntentProcessor.java b/src/com/android/server/telecom/CallIntentProcessor.java
index 7ec83cb..525359f 100644
--- a/src/com/android/server/telecom/CallIntentProcessor.java
+++ b/src/com/android/server/telecom/CallIntentProcessor.java
@@ -134,7 +134,7 @@
callsManager.processIncomingCallIntent(phoneAccountHandle, clientExtras);
}
- private static void processUnknownCallIntent(CallsManager callsManager, Intent intent) {
+ static void processUnknownCallIntent(CallsManager callsManager, Intent intent) {
PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(
TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
diff --git a/src/com/android/server/telecom/CallLogManager.java b/src/com/android/server/telecom/CallLogManager.java
index fc58fd6..fc15363 100755
--- a/src/com/android/server/telecom/CallLogManager.java
+++ b/src/com/android/server/telecom/CallLogManager.java
@@ -22,7 +22,6 @@
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.CallLog.Calls;
-import android.telecom.CallState;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccountHandle;
import android.telecom.VideoProfile;
@@ -108,7 +107,7 @@
// 2) It is a conference call
// 3) Call was not explicitly canceled
if (isNewlyDisconnected &&
- (oldState != CallState.PRE_DIAL_WAIT &&
+ (oldState != CallState.SELECT_PHONE_ACCOUNT &&
!call.isConference() &&
!isCallCanceled)) {
int type;
@@ -140,7 +139,13 @@
Log.d(TAG, "logNumber set to: %s", Log.pii(logNumber));
- final PhoneAccountHandle accountHandle = call.getTargetPhoneAccount();
+ final PhoneAccountHandle emergencyAccountHandle =
+ TelephonyUtil.getDefaultEmergencyPhoneAccount().getAccountHandle();
+
+ PhoneAccountHandle accountHandle = call.getTargetPhoneAccount();
+ if (emergencyAccountHandle.equals(accountHandle)) {
+ accountHandle = null;
+ }
// TODO(vt): Once data usage is available, wire it up here.
int callFeatures = getCallFeatures(call.getVideoStateHistory());
diff --git a/src/com/android/server/telecom/CallState.java b/src/com/android/server/telecom/CallState.java
new file mode 100644
index 0000000..0d2ca48
--- /dev/null
+++ b/src/com/android/server/telecom/CallState.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 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.
+ */
+
+package com.android.server.telecom;
+
+/**
+ * Defines call-state constants of the different states in which a call can exist. Although states
+ * have the notion of normal transitions, due to the volatile nature of telephony systems, code
+ * that uses these states should be resilient to unexpected state changes outside of what is
+ * considered traditional.
+ */
+public final class CallState {
+
+ private CallState() {}
+
+ /**
+ * Indicates that a call is new and not connected. This is used as the default state internally
+ * within Telecom and should not be used between Telecom and call services. Call services are
+ * not expected to ever interact with NEW calls, but {@link android.telecom.InCallService}s will
+ * see calls in this state.
+ */
+ public static final int NEW = 0;
+
+ /**
+ * The initial state of an outgoing {@code Call}.
+ * Common transitions are to {@link #DIALING} state for a successful call or
+ * {@link #DISCONNECTED} if it failed.
+ */
+ public static final int CONNECTING = 1;
+
+ /**
+ * The state of an outgoing {@code Call} when waiting on user to select a
+ * {@link android.telecom.PhoneAccount} through which to place the call.
+ */
+ public static final int SELECT_PHONE_ACCOUNT = 2;
+
+ /**
+ * Indicates that a call is outgoing and in the dialing state. A call transitions to this state
+ * once an outgoing call has begun (e.g., user presses the dial button in Dialer). Calls in this
+ * state usually transition to {@link #ACTIVE} if the call was answered or {@link #DISCONNECTED}
+ * if the call was disconnected somehow (e.g., failure or cancellation of the call by the user).
+ */
+ public static final int DIALING = 3;
+
+ /**
+ * Indicates that a call is incoming and the user still has the option of answering, rejecting,
+ * or doing nothing with the call. This state is usually associated with some type of audible
+ * ringtone. Normal transitions are to {@link #ACTIVE} if answered or {@link #DISCONNECTED}
+ * otherwise.
+ */
+ public static final int RINGING = 4;
+
+ /**
+ * Indicates that a call is currently connected to another party and a communication channel is
+ * open between them. The normal transition to this state is by the user answering a
+ * {@link #DIALING} call or a {@link #RINGING} call being answered by the other party.
+ */
+ public static final int ACTIVE = 5;
+
+ /**
+ * Indicates that the call is currently on hold. In this state, the call is not terminated
+ * but no communication is allowed until the call is no longer on hold. The typical transition
+ * to this state is by the user putting an {@link #ACTIVE} call on hold by explicitly performing
+ * an action, such as clicking the hold button.
+ */
+ public static final int ON_HOLD = 6;
+
+ /**
+ * Indicates that a call is currently disconnected. All states can transition to this state
+ * by the call service giving notice that the connection has been severed. When the user
+ * explicitly ends a call, it will not transition to this state until the call service confirms
+ * the disconnection or communication was lost to the call service currently responsible for
+ * this call (e.g., call service crashes).
+ */
+ public static final int DISCONNECTED = 7;
+
+ /**
+ * Indicates that the call was attempted (mostly in the context of outgoing, at least at the
+ * time of writing) but cancelled before it was successfully connected.
+ */
+ public static final int ABORTED = 8;
+
+ /**
+ * Indicates that the call is in the process of being disconnected and will transition next
+ * to a {@link #DISCONNECTED} state.
+ * <p>
+ * This state is not expected to be communicated from the Telephony layer, but will be reported
+ * to the InCall UI for calls where disconnection has been initiated by the user but the
+ * ConnectionService has confirmed the call as disconnected.
+ */
+ public static final int DISCONNECTING = 9;
+
+ public static String toString(int callState) {
+ switch (callState) {
+ case NEW:
+ return "NEW";
+ case CONNECTING:
+ return "CONNECTING";
+ case SELECT_PHONE_ACCOUNT:
+ return "SELECT_PHONE_ACCOUNT";
+ case DIALING:
+ return "DIALING";
+ case RINGING:
+ return "RINGING";
+ case ACTIVE:
+ return "ACTIVE";
+ case ON_HOLD:
+ return "ON_HOLD";
+ case DISCONNECTED:
+ return "DISCONNECTED";
+ case ABORTED:
+ return "ABORTED";
+ case DISCONNECTING:
+ return "DISCONNECTING";
+ default:
+ return "UNKNOWN";
+ }
+ }
+}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 09b8dd7..182590d 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -25,7 +25,6 @@
import android.os.Trace;
import android.provider.CallLog.Calls;
import android.telecom.AudioState;
-import android.telecom.CallState;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.DisconnectCause;
@@ -80,7 +79,6 @@
void onIsVoipAudioModeChanged(Call call);
void onVideoStateChanged(Call call);
void onCanAddCallChanged(boolean canAddCall);
- void onCallSubstateChanged(Call call);
}
private static final String TAG = "CallsManager";
@@ -92,10 +90,10 @@
private static final int MAXIMUM_TOP_LEVEL_CALLS = 2;
private static final int[] OUTGOING_CALL_STATES =
- {CallState.CONNECTING, CallState.PRE_DIAL_WAIT, CallState.DIALING};
+ {CallState.CONNECTING, CallState.SELECT_PHONE_ACCOUNT, CallState.DIALING};
private static final int[] LIVE_CALL_STATES =
- {CallState.CONNECTING, CallState.PRE_DIAL_WAIT, CallState.DIALING, CallState.ACTIVE};
+ {CallState.CONNECTING, CallState.SELECT_PHONE_ACCOUNT, CallState.DIALING, CallState.ACTIVE};
/**
* The main call repository. Keeps an instance of all live calls. New incoming and outgoing
@@ -121,6 +119,7 @@
new ConcurrentHashMap<CallsManagerListener, Boolean>(16, 0.9f, 1));
private final HeadsetMediaButton mHeadsetMediaButton;
private final WiredHeadsetManager mWiredHeadsetManager;
+ private final DockManager mDockManager;
private final TtyManager mTtyManager;
private final ProximitySensorManager mProximitySensorManager;
private final PhoneStateBroadcaster mPhoneStateBroadcaster;
@@ -167,10 +166,10 @@
mMissedCallNotifier = missedCallNotifier;
StatusBarNotifier statusBarNotifier = new StatusBarNotifier(context, this);
mWiredHeadsetManager = new WiredHeadsetManager(context);
+ mDockManager = new DockManager(context);
mCallAudioManager = new CallAudioManager(
- context, statusBarNotifier, mWiredHeadsetManager, this);
- InCallTonePlayer.Factory playerFactory =
- new InCallTonePlayer.Factory(mCallAudioManager, lock);
+ context, statusBarNotifier, mWiredHeadsetManager, mDockManager, this);
+ InCallTonePlayer.Factory playerFactory = new InCallTonePlayer.Factory(mCallAudioManager, lock);
mRinger = new Ringer(mCallAudioManager, this, playerFactory, context);
mHeadsetMediaButton = headsetMediaButtonFactory.create(context, this);
mTtyManager = new TtyManager(context, mWiredHeadsetManager);
@@ -377,12 +376,6 @@
return Collections.unmodifiableCollection(mCalls);
}
- public void onCallSubstateChanged(Call call) {
- for (CallsManagerListener listener : mListeners) {
- listener.onCallSubstateChanged(call);
- }
- }
-
Call getForegroundCall() {
return mForegroundCall;
}
@@ -586,7 +579,9 @@
if (needsAccountSelection) {
// This is the state where the user is expected to select an account
- call.setState(CallState.PRE_DIAL_WAIT);
+ call.setState(CallState.SELECT_PHONE_ACCOUNT);
+ // Create our own instance to modify (since extras may be Bundle.EMPTY)
+ extras = new Bundle(extras);
extras.putParcelableList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS, accounts);
} else {
call.setState(CallState.CONNECTING);
@@ -634,9 +629,15 @@
call.setHandle(uriHandle);
call.setGatewayInfo(gatewayInfo);
- call.setStartWithSpeakerphoneOn(speakerphoneOn);
call.setVideoState(videoState);
+ if (speakerphoneOn) {
+ Log.i(this, "%s Starting with speakerphone as requested", call);
+ } else {
+ Log.i(this, "%s Starting with speakerphone because car is docked.", call);
+ }
+ call.setStartWithSpeakerphoneOn(speakerphoneOn || mDockManager.isDocked());
+
boolean isEmergencyCall = TelephonyUtil.shouldProcessAsEmergency(mContext,
call.getHandle());
if (isEmergencyCall) {
@@ -872,7 +873,7 @@
Log.i(this, "Attempted to add account to unknown call %s", call);
} else {
// TODO: There is an odd race condition here. Since NewOutgoingCallIntentBroadcaster and
- // the PRE_DIAL_WAIT sequence run in parallel, if the user selects an account before the
+ // the SELECT_PHONE_ACCOUNT sequence run in parallel, if the user selects an account before the
// NEW_OUTGOING_CALL sequence finishes, we'll start the call immediately without
// respecting a rewritten number or a canceled number. This is unlikely since
// NEW_OUTGOING_CALL sequence, in practice, runs a lot faster than the user selecting
@@ -907,14 +908,12 @@
void markCallAsDialing(Call call) {
setCallState(call, CallState.DIALING);
+ maybeMoveToSpeakerPhone(call);
}
void markCallAsActive(Call call) {
setCallState(call, CallState.ACTIVE);
-
- if (call.getStartWithSpeakerphoneOn()) {
- setAudioRoute(AudioState.ROUTE_SPEAKER);
- }
+ maybeMoveToSpeakerPhone(call);
}
void markCallAsOnHold(Call call) {
@@ -1194,6 +1193,8 @@
shouldNotify = true;
}
+ call.destroy();
+
// Only broadcast changes for calls that are being tracked.
if (shouldNotify) {
for (CallsManagerListener listener : mListeners) {
@@ -1389,7 +1390,7 @@
if (call == liveCall) {
// If the call is already the foreground call, then we are golden.
- // This can happen after the user selects an account in the PRE_DIAL_WAIT
+ // This can happen after the user selects an account in the SELECT_PHONE_ACCOUNT
// state since the call was already populated into the list.
return true;
}
@@ -1449,6 +1450,16 @@
}
/**
+ * Checks to see if the call should be on speakerphone and if so, set it.
+ */
+ private void maybeMoveToSpeakerPhone(Call call) {
+ if (call.getStartWithSpeakerphoneOn()) {
+ setAudioRoute(AudioState.ROUTE_SPEAKER);
+ call.setStartWithSpeakerphoneOn(false);
+ }
+ }
+
+ /**
* Creates a new call for an existing connection.
*
* @param callId The id of the new call.
diff --git a/src/com/android/server/telecom/CallsManagerListenerBase.java b/src/com/android/server/telecom/CallsManagerListenerBase.java
index 07839db..6b54709 100644
--- a/src/com/android/server/telecom/CallsManagerListenerBase.java
+++ b/src/com/android/server/telecom/CallsManagerListenerBase.java
@@ -76,8 +76,4 @@
@Override
public void onCanAddCallChanged(boolean canAddCall) {
}
-
- @Override
- public void onCallSubstateChanged(Call call) {
- }
}
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index a53bf99..a2295a7 100644
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -538,25 +538,6 @@
Binder.restoreCallingIdentity(token);
}
}
-
- @Override
- public void setCallSubstate(String callId, int callSubstate) {
- long token = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- logIncoming("setCallSubstate %s %d", callId, callSubstate);
- if (mCallIdMapper.isValidCallId(callId)) {
- Call call = mCallIdMapper.getCall(callId);
-
- if (call != null) {
- call.setCallSubstate(callSubstate);
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
}
private final Adapter mAdapter = new Adapter();
diff --git a/src/com/android/server/telecom/CreateConnectionProcessor.java b/src/com/android/server/telecom/CreateConnectionProcessor.java
index 1d8ef28..13ee4e9 100644
--- a/src/com/android/server/telecom/CreateConnectionProcessor.java
+++ b/src/com/android/server/telecom/CreateConnectionProcessor.java
@@ -17,7 +17,6 @@
package com.android.server.telecom;
import android.content.Context;
-import android.telecom.CallState;
import android.telecom.DisconnectCause;
import android.telecom.ParcelableConnection;
import android.telecom.Phone;
diff --git a/src/com/android/server/telecom/CreateConnectionTimeout.java b/src/com/android/server/telecom/CreateConnectionTimeout.java
index 553552b..45305d5 100644
--- a/src/com/android/server/telecom/CreateConnectionTimeout.java
+++ b/src/com/android/server/telecom/CreateConnectionTimeout.java
@@ -21,7 +21,6 @@
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Looper;
-import android.telecom.CallState;
import android.telecom.PhoneAccountHandle;
import android.telephony.TelephonyManager;
import android.telephony.PhoneStateListener;
diff --git a/src/com/android/server/telecom/DockManager.java b/src/com/android/server/telecom/DockManager.java
new file mode 100644
index 0000000..e6ad446
--- /dev/null
+++ b/src/com/android/server/telecom/DockManager.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2015 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.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.android.internal.util.IndentingPrintWriter;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/** Listens for and caches car dock state. */
+class DockManager {
+ interface Listener {
+ void onDockChanged(boolean isDocked);
+ }
+
+ /** Receiver for car dock plugged and unplugged events. */
+ private class DockBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) {
+ int dockState = intent.getIntExtra(
+ Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ onDockChanged(dockState);
+ }
+ }
+ }
+
+ private final DockBroadcastReceiver mReceiver;
+
+ /**
+ * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
+ * load factor before resizing, 1 means we only expect a single thread to
+ * access the map so make only a single shard
+ */
+ private final Set<Listener> mListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
+
+ private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
+
+ DockManager(Context context) {
+ mReceiver = new DockBroadcastReceiver();
+
+ // Register for misc other intent broadcasts.
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
+ context.registerReceiver(mReceiver, intentFilter);
+ }
+
+ void addListener(Listener listener) {
+ mListeners.add(listener);
+ }
+
+ void removeListener(Listener listener) {
+ if (listener != null) {
+ mListeners.remove(listener);
+ }
+ }
+
+ boolean isDocked() {
+ switch (mDockState) {
+ case Intent.EXTRA_DOCK_STATE_DESK:
+ case Intent.EXTRA_DOCK_STATE_HE_DESK:
+ case Intent.EXTRA_DOCK_STATE_LE_DESK:
+ case Intent.EXTRA_DOCK_STATE_CAR:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void onDockChanged(int dockState) {
+ if (mDockState != dockState) {
+ Log.v(this, "onDockChanged: is docked?%b", dockState == Intent.EXTRA_DOCK_STATE_CAR);
+ mDockState = dockState;
+ for (Listener listener : mListeners) {
+ listener.onDockChanged(isDocked());
+ }
+ }
+ }
+
+ /**
+ * Dumps the state of the {@link DockManager}.
+ *
+ * @param pw The {@code IndentingPrintWriter} to write the state to.
+ */
+ public void dump(IndentingPrintWriter pw) {
+ pw.println("mIsDocked: " + isDocked());
+ }
+}
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 370effe..22ee132 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -32,7 +32,6 @@
import android.os.UserHandle;
import android.telecom.AudioState;
import android.telecom.CallProperties;
-import android.telecom.CallState;
import android.telecom.Connection;
import android.telecom.InCallService;
import android.telecom.ParcelableCall;
@@ -120,11 +119,6 @@
public void onConferenceableCallsChanged(Call call) {
updateCall(call);
}
-
- @Override
- public void onCallSubstateChanged(Call call) {
- updateCall(call);
- }
};
/**
@@ -478,7 +472,7 @@
private ParcelableCall toParcelableCall(Call call, boolean includeVideoProvider) {
String callId = mCallIdMapper.getCallId(call);
- int state = call.getState();
+ int state = getParcelableState(call);
int capabilities = convertConnectionToCallCapabilities(call.getConnectionCapabilities());
// If this is a single-SIM device, the "default SIM" will always be the only SIM.
@@ -494,21 +488,13 @@
capabilities, android.telecom.Call.Details.CAPABILITY_MUTE);
}
- if (state == CallState.DIALING) {
+ if (state == android.telecom.Call.STATE_DIALING) {
capabilities = removeCapability(capabilities,
android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL);
capabilities = removeCapability(capabilities,
android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL);
}
- if (state == CallState.ABORTED) {
- state = CallState.DISCONNECTED;
- }
-
- if (call.isLocallyDisconnecting() && state != CallState.DISCONNECTED) {
- state = CallState.DISCONNECTING;
- }
-
String parentCallId = null;
Call parentCall = call.getParentCall();
if (parentCall != null) {
@@ -569,8 +555,49 @@
call.getStatusHints(),
call.getVideoState(),
conferenceableCallIds,
- call.getExtras(),
- call.getCallSubstate());
+ call.getExtras());
+ }
+
+ private static int getParcelableState(Call call) {
+ int state = CallState.NEW;
+ switch (call.getState()) {
+ case CallState.ABORTED:
+ case CallState.DISCONNECTED:
+ state = android.telecom.Call.STATE_DISCONNECTED;
+ break;
+ case CallState.ACTIVE:
+ state = android.telecom.Call.STATE_ACTIVE;
+ break;
+ case CallState.CONNECTING:
+ state = android.telecom.Call.STATE_CONNECTING;
+ break;
+ case CallState.DIALING:
+ state = android.telecom.Call.STATE_DIALING;
+ break;
+ case CallState.DISCONNECTING:
+ state = android.telecom.Call.STATE_DISCONNECTING;
+ break;
+ case CallState.NEW:
+ state = android.telecom.Call.STATE_NEW;
+ break;
+ case CallState.ON_HOLD:
+ state = android.telecom.Call.STATE_HOLDING;
+ break;
+ case CallState.RINGING:
+ state = android.telecom.Call.STATE_RINGING;
+ break;
+ case CallState.SELECT_PHONE_ACCOUNT:
+ state = android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT;
+ break;
+ }
+
+ // If we are marked as 'locally disconnecting' then mark ourselves as disconnecting instead.
+ // Unless we're disconnect*ED*, in which case leave it at that.
+ if (call.isLocallyDisconnecting() &&
+ (state != android.telecom.Call.STATE_DISCONNECTED)) {
+ state = android.telecom.Call.STATE_DISCONNECTING;
+ }
+ return state;
}
private static final int[] CONNECTION_TO_CALL_CAPABILITY = new int[] {
diff --git a/src/com/android/server/telecom/InCallToneMonitor.java b/src/com/android/server/telecom/InCallToneMonitor.java
index 32d0924..e25d207 100644
--- a/src/com/android/server/telecom/InCallToneMonitor.java
+++ b/src/com/android/server/telecom/InCallToneMonitor.java
@@ -17,7 +17,6 @@
package com.android.server.telecom;
import android.media.ToneGenerator;
-import android.telecom.CallState;
import java.util.Collection;
diff --git a/src/com/android/server/telecom/Log.java b/src/com/android/server/telecom/Log.java
index b9ad73d..10ff6cc 100644
--- a/src/com/android/server/telecom/Log.java
+++ b/src/com/android/server/telecom/Log.java
@@ -20,12 +20,21 @@
import android.telecom.PhoneAccount;
import android.telephony.PhoneNumberUtils;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
import java.util.IllegalFormatException;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Locale;
-
-import com.android.internal.annotations.VisibleForTesting;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
/**
* Manages logging for the entire module.
@@ -33,6 +42,130 @@
@VisibleForTesting
public class Log {
+ /**
+ * Stores the various events associated with {@link Call}s. Also stores all request-response
+ * pairs amongst the events.
+ */
+ public final static class Events {
+ public static final String CREATED = "CREATED";
+ public static final String DESTROYED = "DESTROYED";
+ public static final String SET_NEW = "SET_NEW";
+ public static final String SET_CONNECTING = "SET_CONNECTING";
+ public static final String SET_DIALING = "SET_DIALING";
+ public static final String SET_ACTIVE = "SET_ACTIVE";
+ public static final String SET_HOLD = "SET_HOLD";
+ public static final String SET_RINGING = "SET_RINGING";
+ public static final String SET_DISCONNECTED = "SET_DISCONNECTED";
+ public static final String SET_DISCONNECTING = "SET_DISCONNECTING";
+ public static final String SET_SELECT_PHONE_ACCOUNT = "SET_SELECT_PHONE_ACCOUNT";
+ public static final String REQUEST_HOLD = "REQUEST_HOLD";
+ public static final String REQUEST_UNHOLD = "REQUEST_UNHOLD";
+ public static final String REQUEST_DISCONNECT = "REQUEST_DISCONNECT";
+ public static final String REQUEST_ACCEPT = "REQUEST_ACCEPT";
+ public static final String REQUEST_REJECT = "REQUEST_REJECT";
+ public static final String START_DTMF = "START_DTMF";
+ public static final String STOP_DTMF = "STOP_DTMF";
+
+ /**
+ * Maps from a request to a response. The same event could be listed as the
+ * response for multiple requests (e.g. REQUEST_ACCEPT and REQUEST_UNHOLD both map to the
+ * SET_ACTIVE response). This map is used to print out the amount of time it takes between
+ * a request and a response.
+ */
+ public static final Map<String, String> requestResponsePairs =
+ new HashMap<String, String>() {{
+ put(REQUEST_ACCEPT, SET_ACTIVE);
+ put(REQUEST_REJECT, SET_DISCONNECTED);
+ put(REQUEST_DISCONNECT, SET_DISCONNECTED);
+ put(REQUEST_HOLD, SET_HOLD);
+ put(REQUEST_UNHOLD, SET_ACTIVE);
+ }};
+ }
+
+ public static class CallEvent {
+ public String eventId;
+ public long time;
+ public Object data;
+
+ public CallEvent(String eventId, long time, Object data) {
+ this.eventId = eventId;
+ this.time = time;
+ this.data = data;
+ }
+ }
+
+ public static class CallEventRecord {
+ private static final DateFormat sDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
+ private static int sNextId = 1;
+ private final List<CallEvent> mEvents = new LinkedList<>();
+ private final Call mCall;
+ private final int mId;
+
+ public CallEventRecord(Call call) {
+ mCall = call;
+ mId = ++sNextId;
+ }
+
+ public Call getCall() {
+ return mCall;
+ }
+
+ public void addEvent(String event, Object data) {
+ mEvents.add(new CallEvent(event, System.currentTimeMillis(), data));
+ Log.i("Event", "Call %d: %s, %s", mId, event, data);
+ }
+
+ public void dump(IndentingPrintWriter pw) {
+ Map<String, CallEvent> pendingResponses = new HashMap<>();
+
+ pw.print("Call [");
+ pw.print(sDateFormat.format(new Date(mCall.getCreationTimeMillis())));
+ pw.print("]");
+ pw.println(mCall.isIncoming() ? "(MT - incoming)" : "(MO - outgoing)");
+
+ pw.increaseIndent();
+ for (CallEvent event : mEvents) {
+
+ // We print out events in chronological order. During that process we look at each
+ // event and see if it maps to a request on the Request-Response pairs map. If it
+ // does, then we effectively start 'listening' for the response. We do that by
+ // storing the response event ID in {@code pendingResponses}. When we find the
+ // response in a later iteration of the loop, we grab the original request and
+ // calculate the time it took to get a response.
+ if (Events.requestResponsePairs.containsKey(event.eventId)) {
+ // This event expects a response, so add that response to the maps
+ // of pending events.
+ String pendingResponse = Events.requestResponsePairs.get(event.eventId);
+ pendingResponses.put(pendingResponse, event);
+ }
+
+ pw.print(sDateFormat.format(new Date(event.time)));
+ pw.print(" - ");
+ pw.print(event.eventId);
+ if (event.data != null) {
+ pw.print("(");
+ pw.print(event.data);
+ pw.print(")");
+ }
+
+ // If this event is a response event that we've been waiting for, calculate the time
+ // it took for the response to complete and print that out as well.
+ CallEvent requestEvent = pendingResponses.remove(event.eventId);
+ if (requestEvent != null) {
+ pw.print(", time since ");
+ pw.print(requestEvent.eventId);
+ pw.print(": ");
+ pw.print(event.time - requestEvent.time);
+ pw.print(" ms");
+ }
+ pw.println();
+ }
+ pw.decreaseIndent();
+ }
+ }
+
+ public static final int MAX_CALLS_TO_CACHE = 5; // Arbitrarily chosen.
+
// Generic tag for all In Call logging
@VisibleForTesting
public static String TAG = "Telecom";
@@ -45,6 +178,10 @@
public static final boolean WARN = isLoggable(android.util.Log.WARN);
public static final boolean ERROR = isLoggable(android.util.Log.ERROR);
+ private static final Map<Call, CallEventRecord> mCallEventRecordMap = new HashMap<>();
+ private static final LinkedBlockingQueue<CallEventRecord> mCallEventRecords =
+ new LinkedBlockingQueue<CallEventRecord>(MAX_CALLS_TO_CACHE);
+
private Log() {}
@VisibleForTesting
@@ -52,6 +189,32 @@
TAG = tag;
}
+ public static void event(Call call, String event) {
+ event(call, event, null);
+ }
+
+ public static void event(Call call, String event, Object data) {
+ synchronized (mCallEventRecords) {
+ if (!mCallEventRecordMap.containsKey(call)) {
+ // First remove the oldest entry if no new ones exist.
+ if (mCallEventRecords.remainingCapacity() == 0) {
+ CallEventRecord record = mCallEventRecords.poll();
+ if (record != null) {
+ mCallEventRecordMap.remove(record.getCall());
+ }
+ }
+
+ // Now add a new entry
+ CallEventRecord newRecord = new CallEventRecord(call);
+ mCallEventRecords.add(newRecord);
+ mCallEventRecordMap.put(call, newRecord);
+ }
+
+ CallEventRecord record = mCallEventRecordMap.get(call);
+ record.addEvent(event, data);
+ }
+ }
+
public static boolean isLoggable(int level) {
return FORCE_LOGGING || android.util.Log.isLoggable(TAG, level);
}
@@ -176,6 +339,15 @@
return "[" + secureHash(String.valueOf(pii).getBytes()) + "]";
}
+ public static void dumpCallEvents(IndentingPrintWriter pw) {
+ pw.println("Historical Calls:");
+ pw.increaseIndent();
+ for (CallEventRecord callEventRecord : mCallEventRecords) {
+ callEventRecord.dump(pw);
+ }
+ pw.decreaseIndent();
+ }
+
private static String secureHash(byte[] input) {
MessageDigest messageDigest;
try {
diff --git a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
index a2441ce..c1cf7f8 100644
--- a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
@@ -105,7 +105,8 @@
// Once the NEW_OUTGOING_CALL broadcast is finished, the resultData is used as the
// actual number to call. (If null, no call will be placed.)
String resultNumber = getResultData();
- Log.v(this, "- got number from resultData: %s", Log.pii(resultNumber));
+ Log.i(this, "Received new-outgoing-call-broadcast for %s with data %s", mCall,
+ Log.pii(resultNumber));
boolean endEarly = false;
if (resultNumber == null) {
@@ -255,6 +256,7 @@
// initiate the call again because of the presence of the EXTRA_ALREADY_CALLED extra.
}
+ Log.i(this, "Sending NewOutgoingCallBroadcast for %s", mCall);
broadcastIntent(intent, number, !callImmediately);
return DisconnectCause.NOT_DISCONNECTED;
}
diff --git a/src/com/android/server/telecom/PhoneStateBroadcaster.java b/src/com/android/server/telecom/PhoneStateBroadcaster.java
index bf0d3b8..57ae24b 100644
--- a/src/com/android/server/telecom/PhoneStateBroadcaster.java
+++ b/src/com/android/server/telecom/PhoneStateBroadcaster.java
@@ -18,7 +18,6 @@
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.telecom.CallState;
import android.telephony.TelephonyManager;
import com.android.internal.telephony.ITelephonyRegistry;
diff --git a/src/com/android/server/telecom/RespondViaSmsSettings.java b/src/com/android/server/telecom/RespondViaSmsSettings.java
index f5876a0..2283a88 100644
--- a/src/com/android/server/telecom/RespondViaSmsSettings.java
+++ b/src/com/android/server/telecom/RespondViaSmsSettings.java
@@ -27,105 +27,98 @@
import android.view.Menu;
import android.view.MenuItem;
-// TODO: Needed for move to system service: import com.android.internal.R;
+// TODO: This class is newly copied into Telecom (com.android.server.telecom) from it previous
+// location in Telephony (com.android.phone). User's preferences stored in the old location
+// will be lost. We need code here to migrate KLP -> LMP settings values.
/**
- * Helper class to manage the "Respond via SMS Message" feature for incoming calls.
+ * Settings activity to manage the responses available for the "Respond via SMS Message" feature to
+ * respond to incoming calls.
*/
-public class RespondViaSmsSettings {
- // TODO: This class is newly copied into Telecom (com.android.server.telecom) from it previous
- // location in Telephony (com.android.phone). User's preferences stored in the old location
- // will be lost. We need code here to migrate KLP -> LMP settings values.
+public class RespondViaSmsSettings extends PreferenceActivity
+ implements Preference.OnPreferenceChangeListener {
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Log.d(this, "Settings: onCreate()...");
- /**
- * Settings activity under "Call settings" to let you manage the
- * canned responses; see respond_via_sms_settings.xml
- */
- public static class Settings extends PreferenceActivity
- implements Preference.OnPreferenceChangeListener {
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- Log.d(this, "Settings: onCreate()...");
+ // This function guarantees that QuickResponses will be in our
+ // SharedPreferences with the proper values considering there may be
+ // old QuickResponses in Telephony pre L.
+ QuickResponseUtils.maybeMigrateLegacyQuickResponses(this);
- // This function guarantees that QuickResponses will be in our
- // SharedPreferences with the proper values considering there may be
- // old QuickResponses in Telephony pre L.
- QuickResponseUtils.maybeMigrateLegacyQuickResponses(this);
+ getPreferenceManager().setSharedPreferencesName(
+ QuickResponseUtils.SHARED_PREFERENCES_NAME);
- getPreferenceManager().setSharedPreferencesName(
- QuickResponseUtils.SHARED_PREFERENCES_NAME);
+ // This preference screen is ultra-simple; it's just 4 plain
+ // <EditTextPreference>s, one for each of the 4 "canned responses".
+ //
+ // The only nontrivial thing we do here is copy the text value of
+ // each of those EditTextPreferences and use it as the preference's
+ // "title" as well, so that the user will immediately see all 4
+ // strings when they arrive here.
+ //
+ // Also, listen for change events (since we'll need to update the
+ // title any time the user edits one of the strings.)
- // This preference screen is ultra-simple; it's just 4 plain
- // <EditTextPreference>s, one for each of the 4 "canned responses".
- //
- // The only nontrivial thing we do here is copy the text value of
- // each of those EditTextPreferences and use it as the preference's
- // "title" as well, so that the user will immediately see all 4
- // strings when they arrive here.
- //
- // Also, listen for change events (since we'll need to update the
- // title any time the user edits one of the strings.)
+ addPreferencesFromResource(R.xml.respond_via_sms_settings);
- addPreferencesFromResource(R.xml.respond_via_sms_settings);
+ EditTextPreference pref;
+ pref = (EditTextPreference) findPreference(
+ QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_1);
+ pref.setTitle(pref.getText());
+ pref.setOnPreferenceChangeListener(this);
- EditTextPreference pref;
- pref = (EditTextPreference) findPreference(
- QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_1);
- pref.setTitle(pref.getText());
- pref.setOnPreferenceChangeListener(this);
+ pref = (EditTextPreference) findPreference(
+ QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_2);
+ pref.setTitle(pref.getText());
+ pref.setOnPreferenceChangeListener(this);
- pref = (EditTextPreference) findPreference(
- QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_2);
- pref.setTitle(pref.getText());
- pref.setOnPreferenceChangeListener(this);
+ pref = (EditTextPreference) findPreference(
+ QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_3);
+ pref.setTitle(pref.getText());
+ pref.setOnPreferenceChangeListener(this);
- pref = (EditTextPreference) findPreference(
- QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_3);
- pref.setTitle(pref.getText());
- pref.setOnPreferenceChangeListener(this);
+ pref = (EditTextPreference) findPreference(
+ QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_4);
+ pref.setTitle(pref.getText());
+ pref.setOnPreferenceChangeListener(this);
- pref = (EditTextPreference) findPreference(
- QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_4);
- pref.setTitle(pref.getText());
- pref.setOnPreferenceChangeListener(this);
-
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- // android.R.id.home will be triggered in onOptionsItemSelected()
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ // android.R.id.home will be triggered in onOptionsItemSelected()
+ actionBar.setDisplayHomeAsUpEnabled(true);
}
+ }
- // Preference.OnPreferenceChangeListener implementation
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- Log.d(this, "onPreferenceChange: key = %s", preference.getKey());
- Log.d(this, " preference = '%s'", preference);
- Log.d(this, " newValue = '%s'", newValue);
+ // Preference.OnPreferenceChangeListener implementation
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ Log.d(this, "onPreferenceChange: key = %s", preference.getKey());
+ Log.d(this, " preference = '%s'", preference);
+ Log.d(this, " newValue = '%s'", newValue);
- EditTextPreference pref = (EditTextPreference) preference;
+ EditTextPreference pref = (EditTextPreference) preference;
- // Copy the new text over to the title, just like in onCreate().
- // (Watch out: onPreferenceChange() is called *before* the
- // Preference itself gets updated, so we need to use newValue here
- // rather than pref.getText().)
- pref.setTitle((String) newValue);
+ // Copy the new text over to the title, just like in onCreate().
+ // (Watch out: onPreferenceChange() is called *before* the
+ // Preference itself gets updated, so we need to use newValue here
+ // rather than pref.getText().)
+ pref.setTitle((String) newValue);
- return true; // means it's OK to update the state of the Preference with the new value
+ return true; // means it's OK to update the state of the Preference with the new value
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ final int itemId = item.getItemId();
+ switch (itemId) {
+ case android.R.id.home:
+ goUpToTopLevelSetting(this);
+ return true;
+ default:
}
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- final int itemId = item.getItemId();
- switch (itemId) {
- case android.R.id.home:
- goUpToTopLevelSetting(this);
- return true;
- default:
- }
- return super.onOptionsItemSelected(item);
- }
+ return super.onOptionsItemSelected(item);
}
/**
diff --git a/src/com/android/server/telecom/RingbackPlayer.java b/src/com/android/server/telecom/RingbackPlayer.java
index 6c27388..bb2055f 100644
--- a/src/com/android/server/telecom/RingbackPlayer.java
+++ b/src/com/android/server/telecom/RingbackPlayer.java
@@ -16,8 +16,6 @@
package com.android.server.telecom;
-import android.telecom.CallState;
-
import com.android.internal.util.Preconditions;
/**
diff --git a/src/com/android/server/telecom/Ringer.java b/src/com/android/server/telecom/Ringer.java
index 6b46a71..2d31d0c 100644
--- a/src/com/android/server/telecom/Ringer.java
+++ b/src/com/android/server/telecom/Ringer.java
@@ -26,7 +26,6 @@
import android.os.SystemVibrator;
import android.os.Vibrator;
import android.provider.Settings;
-import android.telecom.CallState;
import java.util.LinkedList;
import java.util.List;
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index afd73a0..bcb23be 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -30,7 +30,6 @@
import android.os.IBinder;
import android.os.UserHandle;
import android.os.UserManager;
-import android.telecom.CallState;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
@@ -41,10 +40,12 @@
// TODO: Needed for move to system service: import com.android.internal.R;
import com.android.internal.telecom.ITelecomService;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.telecom.components.UserCallIntentProcessor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
@@ -56,9 +57,13 @@
private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
@Override
- public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) {
+ public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme,
+ String callingPackage) {
synchronized (mLock) {
- enforceReadPermission();
+ if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
+ return null;
+ }
+
long token = Binder.clearCallingIdentity();
try {
PhoneAccountHandle defaultOutgoingPhoneAccount =
@@ -112,9 +117,12 @@
}
@Override
- public List<PhoneAccountHandle> getCallCapablePhoneAccounts() {
+ public List<PhoneAccountHandle> getCallCapablePhoneAccounts(String callingPackage) {
+ if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
+ return Collections.emptyList();
+ }
+
synchronized (mLock) {
- enforceReadPermission();
long token = Binder.clearCallingIdentity();
try {
return filterForAccountsVisibleToCaller(
@@ -129,9 +137,13 @@
}
@Override
- public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) {
+ public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme,
+ String callingPackage) {
synchronized (mLock) {
- enforceReadPermission();
+ if (!canReadPhoneState(callingPackage, "getPhoneAccountsSupportingScheme")) {
+ return Collections.emptyList();
+ }
+
long token = Binder.clearCallingIdentity();
try {
return filterForAccountsVisibleToCaller(
@@ -252,9 +264,12 @@
}
@Override
- public List<PhoneAccountHandle> getSimCallManagers() {
+ public List<PhoneAccountHandle> getSimCallManagers(String callingPackage) {
synchronized (mLock) {
- enforceReadPermission();
+ if (!canReadPhoneState(callingPackage, "getSimCallManagers")) {
+ return Collections.emptyList();
+ }
+
long token = Binder.clearCallingIdentity();
try {
return filterForAccountsVisibleToCaller(
@@ -339,9 +354,14 @@
* @see android.telecom.TelecomManager#isVoiceMailNumber
*/
@Override
- public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number) {
+ public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number,
+ String callingPackage) {
synchronized (mLock) {
- enforceReadPermissionOrDefaultDialer();
+ if (!isDefaultDialerCalling()
+ && !canReadPhoneState(callingPackage, "isVoiceMailNumber")) {
+ return false;
+ }
+
try {
if (!isVisibleToCaller(accountHandle)) {
Log.w(this, "%s is not visible for the calling user", accountHandle);
@@ -356,16 +376,20 @@
}
/**
- * @see android.telecom.TelecomManager#hasVoiceMailNumber
+ * @see android.telecom.TelecomManager#getVoiceMailNumber
*/
@Override
- public boolean hasVoiceMailNumber(PhoneAccountHandle accountHandle) {
+ public String getVoiceMailNumber(PhoneAccountHandle accountHandle, String callingPackage) {
synchronized (mLock) {
- enforceReadPermissionOrDefaultDialer();
+ if (!isDefaultDialerCalling()
+ && !canReadPhoneState(callingPackage, "getVoiceMailNumber")) {
+ return null;
+ }
+
try {
if (!isVisibleToCaller(accountHandle)) {
Log.w(this, "%s is not visible for the calling user", accountHandle);
- return false;
+ return null;
}
int subId = SubscriptionManager.getDefaultVoiceSubId();
@@ -373,7 +397,7 @@
subId = mPhoneAccountRegistrar
.getSubscriptionIdForPhoneAccount(accountHandle);
}
- return !TextUtils.isEmpty(getTelephonyManager().getVoiceMailNumber(subId));
+ return getTelephonyManager().getVoiceMailNumber(subId);
} catch (Exception e) {
Log.e(this, e, "getSubscriptionIdForPhoneAccount");
throw e;
@@ -385,8 +409,12 @@
* @see android.telecom.TelecomManager#getLine1Number
*/
@Override
- public String getLine1Number(PhoneAccountHandle accountHandle) {
- enforceReadPermissionOrDefaultDialer();
+ public String getLine1Number(PhoneAccountHandle accountHandle, String callingPackage) {
+ if (!isDefaultDialerCalling()
+ && !canReadPhoneState(callingPackage, "getLine1Number")) {
+ return null;
+ }
+
synchronized (mLock) {
try {
if (!isVisibleToCaller(accountHandle)) {
@@ -430,9 +458,12 @@
* @see android.telecom.TelecomManager#isInCall
*/
@Override
- public boolean isInCall() {
+ public boolean isInCall(String callingPackage) {
+ if (!canReadPhoneState(callingPackage, "isInCall")) {
+ return false;
+ }
+
synchronized (mLock) {
- enforceReadPermission();
final int callState = mCallsManager.getCallState();
return callState == TelephonyManager.CALL_STATE_OFFHOOK
|| callState == TelephonyManager.CALL_STATE_RINGING;
@@ -443,9 +474,12 @@
* @see android.telecom.TelecomManager#isRinging
*/
@Override
- public boolean isRinging() {
+ public boolean isRinging(String callingPackage) {
+ if (!canReadPhoneState(callingPackage, "isRinging")) {
+ return false;
+ }
+
synchronized (mLock) {
- enforceReadPermission();
return mCallsManager.getCallState() == TelephonyManager.CALL_STATE_RINGING;
}
}
@@ -486,9 +520,13 @@
* @see android.telecom.TelecomManager#showInCallScreen
*/
@Override
- public void showInCallScreen(boolean showDialpad) {
+ public void showInCallScreen(boolean showDialpad, String callingPackage) {
+ if (!isDefaultDialerCalling()
+ && !canReadPhoneState(callingPackage, "showInCallScreen")) {
+ return;
+ }
+
synchronized (mLock) {
- enforceReadPermissionOrDefaultDialer();
mCallsManager.getInCallController().bringToForeground(showDialpad);
}
}
@@ -587,9 +625,12 @@
* @see android.telecom.TelecomManager#isTtySupported
*/
@Override
- public boolean isTtySupported() {
+ public boolean isTtySupported(String callingPackage) {
+ if (!canReadPhoneState(callingPackage, "hasVoiceMailNumber")) {
+ return false;
+ }
+
synchronized (mLock) {
- enforceReadPermission();
return mCallsManager.isTtySupported();
}
}
@@ -598,9 +639,12 @@
* @see android.telecom.TelecomManager#getCurrentTtyMode
*/
@Override
- public int getCurrentTtyMode() {
+ public int getCurrentTtyMode(String callingPackage) {
+ if (!canReadPhoneState(callingPackage, "getCurrentTtyMode")) {
+ return TelecomManager.TTY_MODE_OFF;
+ }
+
synchronized (mLock) {
- enforceReadPermission();
return mCallsManager.getCurrentTtyMode();
}
}
@@ -641,8 +685,7 @@
@Override
public void addNewUnknownCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) {
synchronized (mLock) {
- if (phoneAccountHandle != null && phoneAccountHandle.getComponentName() != null &&
- TelephonyUtil.isPstnComponentName(phoneAccountHandle.getComponentName())) {
+ if (phoneAccountHandle != null && phoneAccountHandle.getComponentName() != null) {
mAppOpsManager.checkPackage(
Binder.getCallingUid(),
phoneAccountHandle.getComponentName().getPackageName());
@@ -651,12 +694,10 @@
enforceUserHandleMatchesCaller(phoneAccountHandle);
Intent intent = new Intent(TelecomManager.ACTION_NEW_UNKNOWN_CALL);
- intent.setClass(mContext, CallIntentProcessor.class);
- intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.putExtras(extras);
intent.putExtra(CallIntentProcessor.KEY_IS_UNKNOWN_CALL, true);
intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
- mContext.sendBroadcastAsUser(intent, phoneAccountHandle.getUserHandle());
+ CallIntentProcessor.processUnknownCallIntent(mCallsManager, intent);
} else {
Log.i(this,
"Null phoneAccountHandle or not initiated by Telephony. " +
@@ -666,6 +707,23 @@
}
/**
+ * @see android.telecom.TelecomManager#placeCall
+ */
+ @Override
+ public void placeCall(Uri handle, Bundle extras, String callingPackage) {
+ enforceCallingPackage(callingPackage);
+ if (!canCallPhone(callingPackage, "placeCall")) {
+ throw new SecurityException("Package " + callingPackage
+ + " is not allowed to place phone calls");
+ }
+ synchronized (mLock) {
+ final Intent intent = new Intent(Intent.ACTION_CALL, handle);
+ intent.putExtras(extras);
+ new UserCallIntentProcessor(mContext).processIntent(intent, callingPackage);
+ }
+ }
+
+ /**
* Dumps the current state of the TelecomService. Used when generating problem reports.
*
* @param fd The file descriptor.
@@ -695,6 +753,8 @@
mPhoneAccountRegistrar.dump(pw);
pw.decreaseIndent();
}
+
+ Log.dumpCallEvents(pw);
}
};
@@ -863,12 +923,6 @@
}
}
- private void enforceReadPermissionOrDefaultDialer() {
- if (!isDefaultDialerCalling()) {
- enforceReadPermission();
- }
- }
-
private void enforceModifyPermissionOrDefaultDialer() {
if (!isDefaultDialerCalling()) {
enforceModifyPermission();
@@ -895,10 +949,6 @@
enforcePermission(android.Manifest.permission.REGISTER_CONNECTION_MANAGER);
}
- private void enforceReadPermission() {
- enforcePermission(Manifest.permission.READ_PHONE_STATE);
- }
-
private void enforceModifyPermission() {
enforcePermission(Manifest.permission.MODIFY_PHONE_STATE);
}
@@ -927,6 +977,24 @@
}
}
+ private boolean canReadPhoneState(String callingPackage, String message) {
+ // Accessing phone state is gated by a special permission.
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE, message);
+
+ // Some apps that have the permission can be restricted via app ops.
+ return mAppOpsManager.noteOp(AppOpsManager.OP_READ_PHONE_STATE,
+ Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
+ }
+
+ private boolean canCallPhone(String callingPackage, String message) {
+ // Accessing phone state is gated by a special permission.
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.CALL_PHONE, message);
+
+ // Some apps that have the permission can be restricted via app ops.
+ return mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE,
+ Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
+ }
+
private boolean isCallerSimCallManager() {
PhoneAccountHandle accountHandle = TelecomSystem.getInstance().getPhoneAccountRegistrar()
.getSimCallManager();
diff --git a/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java b/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
index 11fca20..a941a65 100644
--- a/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
+++ b/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
@@ -17,6 +17,7 @@
package com.android.server.telecom.ui;
import com.android.server.telecom.Call;
+import com.android.server.telecom.CallState;
import com.android.server.telecom.CallerInfoAsyncQueryFactory;
import com.android.server.telecom.CallsManager;
import com.android.server.telecom.CallsManagerListenerBase;
@@ -46,7 +47,6 @@
import android.os.Binder;
import android.os.UserHandle;
import android.provider.CallLog.Calls;
-import android.telecom.CallState;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccount;
import android.telephony.PhoneNumberUtils;
diff --git a/testapps/Android.mk b/testapps/Android.mk
index ab10380..74928d0 100644
--- a/testapps/Android.mk
+++ b/testapps/Android.mk
@@ -18,8 +18,8 @@
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-ex-camera2 \
android-support-v4 \
+ android-ex-camera2 \
guava
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/testapps/AndroidManifest.xml b/testapps/AndroidManifest.xml
index 39b1629..c8d7105 100644
--- a/testapps/AndroidManifest.xml
+++ b/testapps/AndroidManifest.xml
@@ -19,6 +19,7 @@
package="com.android.server.telecom.testapps">
<uses-permission android:name="android.permission.CAMERA" />
+ <uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.REGISTER_CALL_PROVIDER" />
diff --git a/testapps/src/com/android/server/telecom/testapps/CallNotificationReceiver.java b/testapps/src/com/android/server/telecom/testapps/CallNotificationReceiver.java
index 36a3493..20a0475 100644
--- a/testapps/src/com/android/server/telecom/testapps/CallNotificationReceiver.java
+++ b/testapps/src/com/android/server/telecom/testapps/CallNotificationReceiver.java
@@ -23,7 +23,6 @@
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import android.telecom.CallState;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.util.Log;
diff --git a/testapps/src/com/android/server/telecom/testapps/TestConnectionManager.java b/testapps/src/com/android/server/telecom/testapps/TestConnectionManager.java
index b99ee13..a27be39 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestConnectionManager.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestConnectionManager.java
@@ -118,11 +118,6 @@
}
setConferenceableConnections(c);
}
-
- @Override
- public void onCallSubstateChanged(RemoteConnection connection, int callSubstate) {
- setCallSubstate(callSubstate);
- }
};
private final RemoteConnection mRemote;
diff --git a/testapps/src/com/android/server/telecom/testapps/TestConnectionService.java b/testapps/src/com/android/server/telecom/testapps/TestConnectionService.java
index 7efdb8a..0e67627 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestConnectionService.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestConnectionService.java
@@ -244,7 +244,6 @@
@Override
public void onAudioStateChanged(AudioState state) { }
-
public void setTestVideoCallProvider(TestVideoProvider testVideoCallProvider) {
mTestVideoCallProvider = testVideoCallProvider;
}
diff --git a/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java b/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
index 71c375a..08a0d3b 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
@@ -2,7 +2,9 @@
import android.app.Activity;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
+import android.telecom.PhoneAccount;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
@@ -51,6 +53,8 @@
}
private void placeCall() {
- // TODO: Place a call with the number entered in the number field
+ final Intent intent = new Intent(Intent.ACTION_CALL,
+ Uri.fromParts(PhoneAccount.SCHEME_TEL, mNumberView.getText().toString(), null));
+ startActivityForResult(intent, 0);
}
}
diff --git a/tests/Android.mk b/tests/Android.mk
index 377abbd..a802768 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -19,6 +19,7 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
android-ex-camera2 \
+ android-support-v4 \
guava \
mockito-target
@@ -39,7 +40,6 @@
--extra-packages com.android.server.telecom
LOCAL_PACKAGE_NAME := TelecomUnitTests
-
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := tests
diff --git a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
index 8779f41..5114a52 100644
--- a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
@@ -353,7 +353,6 @@
false, /* voip audio mode */
c.statusHints,
c.disconnectCause,
- c.conferenceableConnectionIds,
- 0 /* call substate */);
+ c.conferenceableConnectionIds);
}
}
diff --git a/tests/src/com/android/server/telecom/tests/InCallWakeLockControllerTest.java b/tests/src/com/android/server/telecom/tests/InCallWakeLockControllerTest.java
index afea2e8..bc294aa 100644
--- a/tests/src/com/android/server/telecom/tests/InCallWakeLockControllerTest.java
+++ b/tests/src/com/android/server/telecom/tests/InCallWakeLockControllerTest.java
@@ -22,9 +22,9 @@
import android.content.Context;
import android.os.PowerManager;
-import android.telecom.CallState;
import com.android.server.telecom.Call;
+import com.android.server.telecom.CallState;
import com.android.server.telecom.CallsManager;
import com.android.server.telecom.InCallWakeLockController;
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index c983bc2..59ca981 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -16,10 +16,37 @@
package com.android.server.telecom.tests;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.ParcelableCall;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.TelephonyManager;
+
import com.android.internal.telecom.IInCallAdapter;
import com.android.internal.telephony.CallerInfo;
import com.android.internal.telephony.CallerInfoAsyncQuery;
import com.android.server.telecom.CallerInfoAsyncQueryFactory;
+import com.android.server.telecom.CallState;
import com.android.server.telecom.CallsManager;
import com.android.server.telecom.HeadsetMediaButton;
import com.android.server.telecom.HeadsetMediaButtonFactory;
@@ -34,37 +61,10 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.telecom.CallState;
-import android.telecom.ConnectionRequest;
-import android.telecom.DisconnectCause;
-import android.telecom.ParcelableCall;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-import android.telephony.TelephonyManager;
-
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
public class TelecomSystemTest extends TelecomTestCase {
static final int TEST_TIMEOUT = 1000; // milliseconds
@@ -273,7 +273,7 @@
// Pass on the new outgoing call Intent
// Set a dummy PendingResult so the BroadcastReceiver agrees to accept onReceive()
newOutgoingCallReceiver.getValue().setPendingResult(
- new BroadcastReceiver.PendingResult(0, "", null, 0, true, false, null, 0));
+ new BroadcastReceiver.PendingResult(0, "", null, 0, true, false, null, 0, 0));
newOutgoingCallReceiver.getValue().setResultData(
newOutgoingCallIntent.getValue().getStringExtra(Intent.EXTRA_PHONE_NUMBER));
newOutgoingCallReceiver.getValue().onReceive(